[FFmpeg-devel] Patch: add AVOption for extra video descriptors in MPEGTS PMT

Jason Livingston jettoblack at gmail.com
Tue May 22 04:06:17 CEST 2012


Hi everyone,
This is my first patch, I hope I followed the rules correctly. :)
Looking forward to your comments.

Goal: Be able to add extra video descriptors to the MPEGTS PMT as a
runtime option

Summary of patch:  Add a new AVOption "extra_video_descriptors"
(string type, default NULL) to mpegtsenc.c, which can contain a
BASE64-encoded string of extra descriptor data (since this data is
variable length and can contain zeros at any point, a BASE64 encoded
string seemed to be the best option).  If this AVOption is not set,
then there will be no change to the output.  If the AVOption is set to
a valid BASE64 encoded string, it will be BASE64 decoded and the bytes
inserted into the PMTs generated by mpegts_write_pmt().


diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 36e958f..fae0ac7 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -25,6 +25,7 @@
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
 #include "libavutil/avassert.h"
+#include "libavutil/base64.h"
 #include "libavcodec/mpegvideo.h"
 #include "avformat.h"
 #include "internal.h"
@@ -80,6 +81,8 @@ typedef struct MpegTSWrite {
     int m2ts_mode;

     int reemit_pat_pmt;
+
+    char *extra_video_descriptors;
 } MpegTSWrite;

 /* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
@@ -105,6 +108,8 @@ static const AVOption options[] = {
       offsetof(MpegTSWrite, pes_payload_size), AV_OPT_TYPE_INT,
{DEFAULT_PES_PAYLOAD_SIZE}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
     { "resend_headers", "Reemit PAT/PMT before writing the next packet",
       offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT, {0}, 0,
INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
+    { "extra_video_descriptors", "BASE64 encoded string of extra
video descriptor bytes",
+      offsetof(MpegTSWrite, extra_video_descriptors),
AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM},
     { NULL },
 };

@@ -242,7 +247,7 @@ static void mpegts_write_pat(AVFormatContext *s)

 static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
 {
-    //    MpegTSWrite *ts = s->priv_data;
+    MpegTSWrite *ts = s->priv_data;
     uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr;
     int val, stream_type, i;

@@ -377,6 +382,18 @@ static void mpegts_write_pmt(AVFormatContext *s,
MpegTSService *service)
                 *q++ = 'a';
                 *q++ = 'c';
             }
+            if (ts->extra_video_descriptors) {
+                int evd_data_len = strlen(ts->extra_video_descriptors) * 3 / 4;
+                if (evd_data_len > 0) {
+                    uint8_t *evd_data = av_malloc(evd_data_len);
+                    val = av_base64_decode(evd_data,
ts->extra_video_descriptors, evd_data_len);
+                    if (val > 0) {
+                        memcpy(q, evd_data, val);
+                        q += val;
+                    }
+                    av_free(evd_data);
+                }
+            }
             break;
         }
-------------- next part --------------
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 36e958f..fae0ac7 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -25,6 +25,7 @@
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
 #include "libavutil/avassert.h"
+#include "libavutil/base64.h"
 #include "libavcodec/mpegvideo.h"
 #include "avformat.h"
 #include "internal.h"
@@ -80,6 +81,8 @@ typedef struct MpegTSWrite {
     int m2ts_mode;
 
     int reemit_pat_pmt;
+    
+    char *extra_video_descriptors;
 } MpegTSWrite;
 
 /* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
@@ -105,6 +108,8 @@ static const AVOption options[] = {
       offsetof(MpegTSWrite, pes_payload_size), AV_OPT_TYPE_INT, {DEFAULT_PES_PAYLOAD_SIZE}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
     { "resend_headers", "Reemit PAT/PMT before writing the next packet",
       offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT, {0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
+    { "extra_video_descriptors", "BASE64 encoded string of extra video descriptor bytes",
+      offsetof(MpegTSWrite, extra_video_descriptors), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM},
     { NULL },
 };
 
@@ -242,7 +247,7 @@ static void mpegts_write_pat(AVFormatContext *s)
 
 static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
 {
-    //    MpegTSWrite *ts = s->priv_data;
+    MpegTSWrite *ts = s->priv_data;
     uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr;
     int val, stream_type, i;
 
@@ -377,6 +382,18 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
                 *q++ = 'a';
                 *q++ = 'c';
             }
+            if (ts->extra_video_descriptors) {
+                int evd_data_len = strlen(ts->extra_video_descriptors) * 3 / 4;
+                if (evd_data_len > 0) {
+                    uint8_t *evd_data = av_malloc(evd_data_len);
+                    val = av_base64_decode(evd_data, ts->extra_video_descriptors, evd_data_len);
+                    if (val > 0) {
+                        memcpy(q, evd_data, val);
+                        q += val;
+                    }
+                    av_free(evd_data);
+                }               
+            }
             break;
         }
 


More information about the ffmpeg-devel mailing list