[FFmpeg-devel] [PATCH 4/4] avformat/mpegtsenc: use the correct stream_types and write HDMV descriptors for m2ts
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Thu Apr 16 00:44:34 EEST 2020
John Stebbins:
> On Fri, 2020-04-10 at 21:44 +0200, Marton Balint wrote:
>> Fixes ticket #2622.
>>
>> Signed-off-by: Marton Balint <cus at passwd.hu>
>> ---
>> libavformat/mpegtsenc.c | 58
>> ++++++++++++++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 57 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
>> index add35aca89..b154675d60 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);
>
> I just wanted to comment on PGS subtitles. PGS in Matroska have all
> segments combined in one packet. m2ts requires each segment in it's
> own packet. So remuxing PGS from Matroska to m2ts will not work
> correctly without the addition of a bsf to split segments.
>
> I just happen to be starting testing of just such a bsf (I also wrote a
> merge bsf to go the other way). I hacked in some of you're patch to do
> a smoke test converting back and forth between m2ts and Matroska. Split
> bsf emits multiple packets for each input packet and merge consumes
> multiple packets for each input packet. So I also had to do
> significant surgery on the auto bsf code in mux.c
Actually Marton hit the same problem with a bsf for mxfenc and so he has
already proposed a patchset [1] for this.
- Andreas
[1]: https://ffmpeg.org/pipermail/ffmpeg-devel/2020-March/259200.html
More information about the ffmpeg-devel
mailing list