diff options
author | Peter Ross <pross@xvid.org> | 2013-02-05 22:01:11 +1100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-10-28 19:31:58 +0100 |
commit | 69a042ee95c60d429f6dd6473caa1a88381a4da2 (patch) | |
tree | 3648806bdb27097559185442ab31f68e8c153360 /libavformat/mpegts.c | |
parent | 162126bb174c9ad690736d16c6f8b431b7127c5b (diff) | |
download | ffmpeg-69a042ee95c60d429f6dd6473caa1a88381a4da2.tar.gz |
mpegts: demux synchronous SMPTE 336M Key-Length-Value (KLV) metadata
Fixes ticket #2579.
Diffstat (limited to 'libavformat/mpegts.c')
-rw-r--r-- | libavformat/mpegts.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 5f2dfe9cb3..c91018ec0f 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -640,6 +640,11 @@ static const StreamType REGD_types[] = { { 0 }, }; +static const StreamType METADATA_types[] = { + { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV }, + { 0 }, +}; + /* descriptor present */ static const StreamType DESC_types[] = { { 0x6a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 }, /* AC-3 descriptor */ @@ -1002,6 +1007,12 @@ static int mpegts_push_data(MpegTSFilter *filter, p += sl_header_bytes; buf_size -= sl_header_bytes; } + if (pes->stream_type == 0x15 && buf_size >= 5) { + /* skip metadata access unit header */ + pes->pes_header_size += 5; + p += 5; + buf_size -= 5; + } if (pes->ts->fix_teletext_pts && pes->st->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT) { AVProgram *p = NULL; while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) { @@ -1489,6 +1500,15 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type case 0x52: /* stream identifier descriptor */ st->stream_identifier = 1 + get8(pp, desc_end); break; + case 0x26: /* metadata descriptor */ + if (get16(pp, desc_end) == 0xFFFF) + *pp += 4; + if (get8(pp, desc_end) == 0xFF) { + st->codec->codec_tag = bytestream_get_le32(pp); + if (st->codec->codec_id == AV_CODEC_ID_NONE) + mpegts_find_stream_type(st, st->codec->codec_tag, METADATA_types); + } + break; default: break; } |