[FFmpeg-cvslog] avformat/mpegtsenc: use the correct stream_types and write HDMV descriptors for m2ts

Marton Balint git at videolan.org
Tue Apr 21 22:44:38 EEST 2020


ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Wed Dec 11 00:58:05 2019 +0100| [7f2649bb46e3dde691edfb03aeb42ba4ef183ab8] | committer: Marton Balint

avformat/mpegtsenc: use the correct stream_types and write HDMV descriptors for m2ts

Fixes ticket #2622.

Signed-off-by: Marton Balint <cus at passwd.hu>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7f2649bb46e3dde691edfb03aeb42ba4ef183ab8
---

 Changelog               |  1 +
 libavformat/mpegtsenc.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/Changelog b/Changelog
index f4be4cf7d1..f3f905dd2f 100644
--- a/Changelog
+++ b/Changelog
@@ -61,6 +61,7 @@ version <next>:
 - WebP parser
 - tmedian filter
 - maskedthreshold filter
+- Support for muxing pcm and pgs in m2ts
 
 
 version 4.2:
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 17247f3291..ce90762fe4 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -359,6 +359,54 @@ static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
     return stream_type;
 }
 
+static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st)
+{
+    int stream_type;
+
+    switch (st->codecpar->codec_id) {
+    case AV_CODEC_ID_MPEG2VIDEO:
+        stream_type = STREAM_TYPE_VIDEO_MPEG2;
+        break;
+    case AV_CODEC_ID_H264:
+        stream_type = STREAM_TYPE_VIDEO_H264;
+        break;
+    case AV_CODEC_ID_VC1:
+        stream_type = STREAM_TYPE_VIDEO_VC1;
+        break;
+    case AV_CODEC_ID_HEVC:
+        stream_type = STREAM_TYPE_VIDEO_HEVC;
+        break;
+    case AV_CODEC_ID_PCM_BLURAY:
+        stream_type = 0x80;
+        break;
+    case AV_CODEC_ID_AC3:
+        stream_type = 0x81;
+        break;
+    case AV_CODEC_ID_DTS:
+        stream_type = (st->codecpar->channels > 6) ? 0x85 : 0x82;
+        break;
+    case AV_CODEC_ID_TRUEHD:
+        stream_type = 0x83;
+        break;
+    case AV_CODEC_ID_EAC3:
+        stream_type = 0x84;
+        break;
+    case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
+        stream_type = 0x90;
+        break;
+    case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
+        stream_type = 0x92;
+        break;
+    default:
+        av_log(s, AV_LOG_WARNING, "Stream %d, codec %s, is muxed as a private data stream "
+               "and may not be recognized upon reading.\n", st->index, avcodec_get_name(st->codecpar->codec_id));
+        stream_type = STREAM_TYPE_PRIVATE_DATA;
+        break;
+    }
+
+    return stream_type;
+}
+
 static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
 {
     MpegTSWrite *ts = s->priv_data;
@@ -372,6 +420,14 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
     q += 2; /* patched after */
 
     /* put program info here */
+    if (ts->m2ts_mode) {
+        put_registration_descriptor(&q, MKTAG('H', 'D', 'M', 'V'));
+        *q++ = 0x88;        // descriptor_tag - hdmv_copy_control_descriptor
+        *q++ = 0x04;        // descriptor_length
+        put16(&q, 0x0fff);  // CA_System_ID
+        *q++ = 0xfc;        // private_data_byte
+        *q++ = 0xfc;        // private_data_byte
+    }
 
     val = 0xf000 | (q - program_info_length_ptr - 2);
     program_info_length_ptr[0] = val >> 8;
@@ -401,7 +457,7 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
             break;
         }
 
-        stream_type = get_dvb_stream_type(s, st);
+        stream_type = ts->m2ts_mode ? get_m2ts_stream_type(s, st) : get_dvb_stream_type(s, st);
 
         *q++ = stream_type;
         put16(&q, 0xe000 | ts_st->pid);



More information about the ffmpeg-cvslog mailing list