[FFmpeg-devel] [PATCH] lavc/videotoolbox: fix avcc creation for h264 streams missing extradata

Richard Kern kernrj at gmail.com
Mon Oct 24 04:09:04 EEST 2016


> On Oct 19, 2016, at 8:45 PM, Aman Gupta <ffmpeg at tmm1.net> wrote:
> 
> From: Aman Gupta <aman at tmm1.net>
> 
> ff_videotoolbox_avcc_extradata_create() was never being called if
> avctx->extradata_size==0, even though the function does not need or use
> the avctx->extradata.

Could this be a bug in another part of the code? It seems like extradata should be set.

> 
> This manifested itself only on h264 streams in specific containers, and
> only on iOS. I guess the macOS version of VideoToolbox is more
> forgiving, atleast on my specific combination of OS version and hardware.

Which container has this issue?

> 
> I also added an error log message when VTDecompressionSessionCreate()
> fails, to help the next poor soul who runs into a bug in this area of the
> code. The native OSStatus error codes are much easier to google than
> their AVERROR counterparts (especially in this case, with AVERROR_UNKNOWN).
> ---
> libavcodec/videotoolbox.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
> index 1288aa5..b21eccb 100644
> --- a/libavcodec/videotoolbox.c
> +++ b/libavcodec/videotoolbox.c
> @@ -413,7 +413,7 @@ static CFDictionaryRef videotoolbox_decoder_config_create(CMVideoCodecType codec
>                          kVTVideoDecoderSpecification_RequireHardwareAcceleratedVideoDecoder,
>                          kCFBooleanTrue);
> 
> -    if (avctx->extradata_size) {
> +    if (avctx->extradata_size || codec_type == kCMVideoCodecType_H264) {

This is somewhat confusing. The extradata_size check is only needed for videotoolbox_esds_extradata_create(). It should check the sps and pps sizes are valid before creating the avcc atom.

>         CFMutableDictionaryRef avc_info;
>         CFDataRef data = NULL;
> 
> @@ -572,13 +572,16 @@ static int videotoolbox_default_init(AVCodecContext *avctx)
>     if (buf_attr)
>         CFRelease(buf_attr);
> 
> +    if (status != 0)
> +        av_log(avctx, AV_LOG_ERROR, "Error creating videotoolbox decompression session: %d\n", status);
> +
>     switch (status) {
>     case kVTVideoDecoderNotAvailableNowErr:
>     case kVTVideoDecoderUnsupportedDataFormatErr:
>         return AVERROR(ENOSYS);
>     case kVTVideoDecoderMalfunctionErr:
>         return AVERROR(EINVAL);
> -    case kVTVideoDecoderBadDataErr :
> +    case kVTVideoDecoderBadDataErr:
>         return AVERROR_INVALIDDATA;
>     case 0:
>         return 0;
> -- 
> 2.8.1
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel



More information about the ffmpeg-devel mailing list