[FFmpeg-devel] [PATCH] lavf/mpegtsenc: write metadata descriptor for timed ID3 packets
Stefano Sabatini
stefasab at gmail.com
Thu May 19 18:45:35 CEST 2016
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(-)
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 5f22032..4b9e71b 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -254,7 +254,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;
@@ -264,7 +264,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;
@@ -626,12 +627,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; /* ID */
+ *q++ = 0xF;
}
break;
}
@@ -676,8 +680,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
More information about the ffmpeg-devel
mailing list