Add PGS codec

git-svn-id: svn+ssh://74.125.59.83/svnsource/ffmpeg/trunk@63 c0683bf1-fb26-4375-bba1-98ccd3d3b0d1
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index e576754..6a8e8d2 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -166,6 +166,7 @@
 OBJS-$(CONFIG_PCX_ENCODER)             += pcxenc.o
 OBJS-$(CONFIG_PGM_DECODER)             += pnmenc.o pnm.o
 OBJS-$(CONFIG_PGM_ENCODER)             += pnmenc.o
+OBJS-$(CONFIG_PGSSUB_DECODER)          += pgssubdec.o
 OBJS-$(CONFIG_PGMYUV_DECODER)          += pnmenc.o pnm.o
 OBJS-$(CONFIG_PGMYUV_ENCODER)          += pnmenc.o
 OBJS-$(CONFIG_PNG_DECODER)             += png.o pngdec.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 5434a5b..739b69e 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -297,6 +297,7 @@
     REGISTER_ENCDEC  (DVBSUB, dvbsub);
     REGISTER_ENCDEC  (DVDSUB, dvdsub);
     REGISTER_DECODER (XSUB, xsub);
+    REGISTER_DECODER  (PGSSUB, pgssub);
 
     /* external libraries */
     REGISTER_ENCDEC  (LIBAMR_NB, libamr_nb);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 3a5b607..6d0e6d5 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -327,7 +327,7 @@
     CODEC_ID_XSUB,
     CODEC_ID_SSA,
     CODEC_ID_MOV_TEXT,
-    CODEC_ID_BD_SUBTITLE,
+    CODEC_ID_HDMV_PGS_SUBTITLE,
 
     /* other specific kind of codecs (generally used for attachments) */
     CODEC_ID_TTF= 0x18000,
@@ -3401,6 +3401,21 @@
 void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size);
 
 /**
+* Allocate a buffer, reusing the given one if large enough.
+*
+* Contrary to av_fast_realloc the current buffer contents might not be
+* preserved and on error the old buffer is freed, thus no special
+* handling to avoid memleaks is necessary.
+*
+* @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer
+* @param size size of the buffer *ptr points to
+* @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and
+*                 *size 0 if an error occurred.
+*/
+
+void av_fast_malloc(void *ptr, unsigned int *size, unsigned int min_size);
+
+/**
  * Copy image 'src' to 'dst'.
  */
 void av_picture_copy(AVPicture *dst, const AVPicture *src,
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 5b8a069..2da9ca5 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -80,6 +80,17 @@
     return ptr;
 }
 
+void av_fast_malloc(void *ptr, unsigned int *size, unsigned int min_size)
+{
+    void **p = ptr;
+    if (min_size < *size)
+        return;
+    *size= FFMAX(17*min_size/16 + 32, min_size);
+    av_free(*p);
+    *p = av_malloc(*size);
+    if (!*p) *size = 0;
+}
+
 /* encoder management */
 static AVCodec *first_avcodec = NULL;
 
diff --git a/libavformat/matroska.c b/libavformat/matroska.c
index ee63eae..e560340 100755
--- a/libavformat/matroska.c
+++ b/libavformat/matroska.c
@@ -57,6 +57,7 @@
     {"S_ASS"            , CODEC_ID_SSA},
     {"S_SSA"            , CODEC_ID_SSA},
     {"S_VOBSUB"         , CODEC_ID_DVD_SUBTITLE},
+    {"S_HDMV/PGS"       , CODEC_ID_HDMV_PGS_SUBTITLE},
 
     {"V_DIRAC"          , CODEC_ID_DIRAC},
     {"V_MJPEG"          , CODEC_ID_MJPEG},
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index ed0f214..102f595 100755
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -1038,7 +1038,7 @@
         break;
     case STREAM_TYPE_AUDIO_HDMV_SUBPICTURE:
         codec_type = CODEC_TYPE_SUBTITLE;
-        codec_id = CODEC_ID_BD_SUBTITLE;
+        codec_id = CODEC_ID_HDMV_PGS_SUBTITLE;
         break;
     default:
         if (code >= 0x1c0 && code <= 0x1df) {