diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index ca038a625f..cdd7e37a1f 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -265,7 +265,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; @@ -275,7 +275,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; @@ -637,12 +638,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; } @@ -687,8 +691,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 */