mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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.
This commit is contained in:
parent
9ccdf04bd0
commit
755472124f
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user