diff mbox series

[FFmpeg-devel] avformat/mpegts: detect synchronous metadata KLV more reliably

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

Checks

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

Commit Message

Marton Balint Feb. 29, 2024, 11:18 p.m. UTC
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(-)

Comments

Marton Balint March 2, 2024, 6:39 p.m. UTC | #1
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 mbox series

Patch

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;