On date Thursday 2016-05-19 18:45:35 +0200, Stefano Sabatini encoded: > This is required since some softwares are not able to correctly recognize > the metadata. > --- > libavformat/mpegtsenc.c | 24 ++++++++++++++---------- > 1 file changed, 14 insertions(+), 10 deletions(-)
Updated, with some more documentation and references to the MPEGTS standard. Note: this patch was created comparing the output of FFmpeg with those from encoding.com and elemental. With the change the output metadata can be read by third-party players. If the maintainers prefer, I can enable this output mode through a flag. -- FFmpeg = Fiendish & Fiendish Mastering Purposeless Egregious Goblin
>From 20f22c426a9f5c59d28f66a17b59d62301503d67 Mon Sep 17 00:00:00 2001 From: Stefano Sabatini <stefa...@gmail.com> Date: Tue, 12 Apr 2016 18:16:21 +0200 Subject: [PATCH] lavf/mpegtsenc: write metadata descriptor for timed ID3 packets This is required since some programs are not able to correctly recognize the metadata. See H.222, 2.6.58 Metadata pointer descriptor. putstr8() is modified in order to allow to skip writing the string length. --- libavformat/mpegtsenc.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index b437100..6f40615 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -256,7 +256,7 @@ static void mpegts_write_pat(AVFormatContext *s) } /* NOTE: !str is accepted for an empty string */ -static void putstr8(uint8_t **q_ptr, const char *str) +static void putstr8(uint8_t **q_ptr, const char *str, int write_len) { uint8_t *q; int len; @@ -266,7 +266,8 @@ static void putstr8(uint8_t **q_ptr, const char *str) len = 0; else len = strlen(str); - *q++ = len; + if (write_len) + *q++ = len; memcpy(q, str, len); q += len; *q_ptr = q; @@ -628,12 +629,15 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) *q++ = 'V'; *q++ = 'A'; } else if (st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) { - *q++ = 0x5; /* MPEG-2 registration descriptor */ - *q++ = 4; - *q++ = 'I'; - *q++ = 'D'; - *q++ = '3'; - *q++ = ' '; + const char *tag = "ID3 "; + *q++ = 0x26; /* metadata descriptor */ + *q++ = 13; + put16(&q, 0xffff); /* metadata application format */ + putstr8(&q, tag, 0); + *q++ = 0xff; /* metadata format */ + putstr8(&q, tag, 0); + *q++ = 0; /* metadata service ID */ + *q++ = 0xF; /* metadata_locator_record_flag|MPEG_carriage_flags|reserved */ } break; } @@ -678,8 +682,8 @@ static void mpegts_write_sdt(AVFormatContext *s) desc_len_ptr = q; q++; *q++ = ts->service_type; - putstr8(&q, service->provider_name); - putstr8(&q, service->name); + putstr8(&q, service->provider_name, 1); + putstr8(&q, service->name, 1); desc_len_ptr[0] = q - desc_len_ptr - 1; /* fill descriptor length */ -- 1.9.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel