Message ID | 20240229231812.13981-1-cus@passwd.hu |
---|---|
State | Accepted |
Commit | 0aaee4741ce0c10ca09f5d17194b58d0cf0ebece |
Headers | show |
Series | [FFmpeg-devel] avformat/mpegts: detect synchronous metadata KLV more reliably | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
On Fri, 1 Mar 2024, Marton Balint wrote: > The mpegts code historically tries to strip (the first) metadata access unit > header from synchronous KLV metadata, but the detection for such streams was > unreliable causing strips of asynchronous metadata or ID3 as well. > > MISB ST 1402 specifies required stream type, stream id and registration > descriptor (which eventually maps to the codec ID) so let's use all of these > for reliable detection. > > Fixes ticket #10828, #10883. > > Signed-off-by: Marton Balint <cus@passwd.hu> > --- > libavformat/mpegts.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c > index 836d5dd5a3..01f6c04223 100644 > --- a/libavformat/mpegts.c > +++ b/libavformat/mpegts.c > @@ -1307,8 +1307,11 @@ skip: > p += sl_header_bytes; > buf_size -= sl_header_bytes; > } > - if (pes->st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV && buf_size >= 5) { > - /* skip metadata access unit header */ > + if (pes->stream_type == STREAM_TYPE_METADATA && > + pes->stream_id == STREAM_ID_METADATA_STREAM && > + pes->st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV && > + buf_size >= 5) { > + /* skip metadata access unit header - see MISB ST 1402 */ > pes->pes_header_size += 5; > p += 5; > buf_size -= 5; Will apply. Regards, Marton
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 836d5dd5a3..01f6c04223 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -1307,8 +1307,11 @@ skip: p += sl_header_bytes; buf_size -= sl_header_bytes; } - if (pes->st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV && buf_size >= 5) { - /* skip metadata access unit header */ + if (pes->stream_type == STREAM_TYPE_METADATA && + pes->stream_id == STREAM_ID_METADATA_STREAM && + pes->st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV && + buf_size >= 5) { + /* skip metadata access unit header - see MISB ST 1402 */ pes->pes_header_size += 5; p += 5; buf_size -= 5;
The mpegts code historically tries to strip (the first) metadata access unit header from synchronous KLV metadata, but the detection for such streams was unreliable causing strips of asynchronous metadata or ID3 as well. MISB ST 1402 specifies required stream type, stream id and registration descriptor (which eventually maps to the codec ID) so let's use all of these for reliable detection. Fixes ticket #10828, #10883. Signed-off-by: Marton Balint <cus@passwd.hu> --- libavformat/mpegts.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)