diff mbox series

[FFmpeg-devel,v2] avcodec/mediacodecdec: Do not abort when H264/HEVC extradata extraction fails

Message ID DB6PR0901MB1495FFB78AE6A7417DC48DA2EC8B9@DB6PR0901MB1495.eurprd09.prod.outlook.com
State Superseded
Headers show
Series [FFmpeg-devel,v2] avcodec/mediacodecdec: Do not abort when H264/HEVC extradata extraction fails | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

sfan5 Feb. 12, 2021, 8:28 p.m. UTC
Hi,


attached v2 patch after discussion on IRC with JEEB (as he already 
mentioned).

Only change is that the log level turns to debug when missing parameter 
sets are within spec (cf. 14496-15).
Subject: [PATCH v2] avcodec/mediacodecdec: Do not abort when H264/HEVC
 extradata extraction fails

Although rare, extradata can be present but empty and extraction will fail.
However Android also supports passing codec-specific data inline and
will likely play such a stream anyway. So there's no reason to abort
initialization before we know for sure.
---
 libavcodec/mediacodecdec.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

Comments

Andreas Rheinhardt Feb. 12, 2021, 8:43 p.m. UTC | #1
sfan5:
> Hi,
> 
> 
> attached v2 patch after discussion on IRC with JEEB (as he already
> mentioned).
> 
> Only change is that the log level turns to debug when missing parameter
> sets are within spec (cf. 14496-15).
> 
> 
> -        av_log(avctx, AV_LOG_ERROR, "Could not extract PPS/SPS from extradata");
> -        ret = AVERROR_INVALIDDATA;
> +        const int warn = is_avc && avctx->codec_tag != MKTAG('a','v','c','1') &&
> +            avctx->codec_tag != MKTAG('a','v','c','2');
> +        av_log(avctx, warn ? AV_LOG_WARNING : AV_LOG_DEBUG,
> +            "Could not extract PPS/SPS from extradata\n");
> +        ret = 0;
>      }

warn = is_avc && (avctx->codec_tag == MKTAG('a','v','c','1') ||
                  avctx->codec_tag == MKTAG('a','v','c','2')
is what you (should) want.

- Andreas
diff mbox series

Patch

diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
index ac1725e466..5af1fd9198 100644
--- a/libavcodec/mediacodecdec.c
+++ b/libavcodec/mediacodecdec.c
@@ -167,8 +167,11 @@  static int h264_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
         ff_AMediaFormat_setBuffer(format, "csd-1", (void*)data, data_size);
         av_freep(&data);
     } else {
-        av_log(avctx, AV_LOG_ERROR, "Could not extract PPS/SPS from extradata");
-        ret = AVERROR_INVALIDDATA;
+        const int warn = is_avc && avctx->codec_tag != MKTAG('a','v','c','1') &&
+            avctx->codec_tag != MKTAG('a','v','c','2');
+        av_log(avctx, warn ? AV_LOG_WARNING : AV_LOG_DEBUG,
+            "Could not extract PPS/SPS from extradata\n");
+        ret = 0;
     }
 
 done:
@@ -254,8 +257,10 @@  static int hevc_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
 
         av_freep(&data);
     } else {
-        av_log(avctx, AV_LOG_ERROR, "Could not extract VPS/PPS/SPS from extradata");
-        ret = AVERROR_INVALIDDATA;
+        const int warn = is_nalff && avctx->codec_tag == MKTAG('h','v','c','1');
+        av_log(avctx, warn ? AV_LOG_WARNING : AV_LOG_DEBUG,
+            "Could not extract VPS/PPS/SPS from extradata\n");
+        ret = 0;
     }
 
 done: