[FFmpeg-devel] [PATCH 9/9] avcodec/videotoolbox: create avcC even when h264 extradata is missing
wm4
nfxjfg at googlemail.com
Tue Sep 26 15:27:50 EEST 2017
On Mon, 25 Sep 2017 17:36:31 -0700
Aman Gupta <ffmpeg at tmm1.net> wrote:
> From: Aman Gupta <aman at tmm1.net>
>
> Removes the avctx->extradata_size requirement when creating avcC, since
> avctx->extradata is only used in the esds code path.
>
> This fixes an issue where the VideoToolbox decoder would not work unless
> avformat_find_stream_info() was called.
> ---
> libavcodec/videotoolbox.c | 65 +++++++++++++++++++++++------------------------
> 1 file changed, 32 insertions(+), 33 deletions(-)
>
> diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
> index 6c8477c2ce..de51b9a7c4 100644
> --- a/libavcodec/videotoolbox.c
> +++ b/libavcodec/videotoolbox.c
> @@ -538,46 +538,45 @@ static CFDictionaryRef videotoolbox_decoder_config_create(CMVideoCodecType codec
> kVTVideoDecoderSpecification_RequireHardwareAcceleratedVideoDecoder,
> kCFBooleanTrue);
>
> - if (avctx->extradata_size) {
> - CFMutableDictionaryRef avc_info;
> - CFDataRef data = NULL;
> + CFMutableDictionaryRef avc_info;
> + CFDataRef data = NULL;
>
> - avc_info = CFDictionaryCreateMutable(kCFAllocatorDefault,
> - 1,
> - &kCFTypeDictionaryKeyCallBacks,
> - &kCFTypeDictionaryValueCallBacks);
> + avc_info = CFDictionaryCreateMutable(kCFAllocatorDefault,
> + 1,
> + &kCFTypeDictionaryKeyCallBacks,
> + &kCFTypeDictionaryValueCallBacks);
>
> - switch (codec_type) {
> - case kCMVideoCodecType_MPEG4Video :
> + switch (codec_type) {
> + case kCMVideoCodecType_MPEG4Video:
> + if (avctx->extradata_size)
> data = videotoolbox_esds_extradata_create(avctx);
> - if (data)
> - CFDictionarySetValue(avc_info, CFSTR("esds"), data);
> - break;
> - case kCMVideoCodecType_H264 : {
> - H264Context *h = avctx->priv_data;
> - if (TARGET_OS_IPHONE && h->ps.sps->frame_mbs_only_flag == 0) {
> - av_log(avctx, AV_LOG_ERROR, "VideoToolbox cannot decode interlaced fields on iOS\n");
> - CFRelease(avc_info);
> - goto fail;
> - }
> - data = ff_videotoolbox_avcc_extradata_create(avctx);
> - if (data)
> - CFDictionarySetValue(avc_info, CFSTR("avcC"), data);
> - break;
> - }
> - default:
> - break;
> + if (data)
> + CFDictionarySetValue(avc_info, CFSTR("esds"), data);
> + break;
> + case kCMVideoCodecType_H264: {
> + H264Context *h = avctx->priv_data;
> + if (TARGET_OS_IPHONE && h->ps.sps->frame_mbs_only_flag == 0) {
> + av_log(avctx, AV_LOG_ERROR, "VideoToolbox cannot decode interlaced fields on iOS\n");
> + CFRelease(avc_info);
> + goto fail;
> }
> + data = ff_videotoolbox_avcc_extradata_create(avctx);
> + if (data)
> + CFDictionarySetValue(avc_info, CFSTR("avcC"), data);
> + break;
> + }
> + default:
> + break;
> + }
>
> - CFDictionarySetValue(config_info,
> - kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms,
> - avc_info);
> + CFDictionarySetValue(config_info,
> + kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms,
> + avc_info);
>
> - if (data)
> - CFRelease(data);
> + if (data)
> + CFRelease(data);
>
> - CFRelease(avc_info);
> - }
> + CFRelease(avc_info);
> return config_info;
>
> fail:
LGTM.
More information about the ffmpeg-devel
mailing list