[FFmpeg-devel] [PATCH] lavc/videotoolbox: fix H.264 hwaccel init issue

pon pon pon.pon.3876098iu76.ponpon at gmail.com
Fri Jun 3 04:47:19 CEST 2016


some problems of https://trac.ffmpeg.org/ticket/5595 are fixed.
can playback 480p.mp4, 720p.mp4, 1080p.mp4 with videotoolbox on osx1095.
test.mp4 may be supported by videdotoolbox hardware decoding because can
playback it with commands on #5272.

ponpon

2016-06-02 11:06 GMT+09:00 Rick Kern <kernrj at gmail.com>:

> Fixes VTDecompressionSessionCreate() error.
>
> Signed-off-by: Rick Kern <kernrj at gmail.com>
> ---
>  libavcodec/videotoolbox.c | 59
> ++++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 45 insertions(+), 14 deletions(-)
>
> diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
> index 2f4d531..cadfb23 100644
> --- a/libavcodec/videotoolbox.c
> +++ b/libavcodec/videotoolbox.c
> @@ -487,23 +487,53 @@ static CFDictionaryRef
> videotoolbox_buffer_attributes_create(int width,
>      return buffer_attributes;
>  }
>
> -static CMVideoFormatDescriptionRef
> videotoolbox_format_desc_create(CMVideoCodecType codec_type,
> +static CMVideoFormatDescriptionRef
> videotoolbox_format_desc_create(AVCodecContext *avctx,
> +
>  CMVideoCodecType codec_type,
>
> CFDictionaryRef decoder_spec,
>                                                                     int
> width,
>                                                                     int
> height)
>  {
> -    CMFormatDescriptionRef cm_fmt_desc;
> -    OSStatus status;
> -
> -    status = CMVideoFormatDescriptionCreate(kCFAllocatorDefault,
> -                                            codec_type,
> -                                            width,
> -                                            height,
> -                                            decoder_spec, // Dictionary
> of extension
> -                                            &cm_fmt_desc);
> -
> -    if (status)
> -        return NULL;
> +    CMFormatDescriptionRef cm_fmt_desc = NULL;
> +    int status;
> +    H264Context *h = codec_type == kCMVideoCodecType_H264 ?
> avctx->priv_data : NULL;
> +
> +    if (h && h->sps.data_size && h->pps.data_size) {
> +        int ps_count = 2;
> +        const uint8_t **ps_data = av_malloc(sizeof(uint8_t*) * ps_count);
> +        size_t *ps_sizes = av_malloc(sizeof(size_t)  * ps_count);
> +
> +        ps_data[0]  = h->sps.data;
> +        ps_sizes[0] = h->sps.data_size;
> +
> +        ps_data[1]  = h->pps.data;
> +        ps_sizes[1] = h->pps.data_size;
> +
> +        status = CMVideoFormatDescriptionCreateFromH264ParameterSets(NULL,
> +
>  ps_count,
> +
>  ps_data,
> +
>  ps_sizes,
> +                                                                     4,
> +
>  &cm_fmt_desc);
> +        av_freep(&ps_sizes);
> +        av_freep(&ps_data);
> +
> +        if (status) {
> +            av_log(avctx, AV_LOG_ERROR, "Error creating H.264 format
> description: %d\n", status);
> +            return NULL;
> +        }
> +    } else {
> +        status = CMVideoFormatDescriptionCreate(kCFAllocatorDefault,
> +                                                codec_type,
> +                                                width,
> +                                                height,
> +                                                decoder_spec, //
> Dictionary of extension
> +                                                &cm_fmt_desc);
> +
> +        if (status) {
> +            av_log(avctx, AV_LOG_ERROR, "Error creating format
> description: %d\n", status);
> +            return NULL;
> +        }
> +    }
>
>      return cm_fmt_desc;
>  }
> @@ -543,7 +573,8 @@ static int videotoolbox_default_init(AVCodecContext
> *avctx)
>
>      decoder_spec =
> videotoolbox_decoder_config_create(videotoolbox->cm_codec_type, avctx);
>
> -    videotoolbox->cm_fmt_desc =
> videotoolbox_format_desc_create(videotoolbox->cm_codec_type,
> +    videotoolbox->cm_fmt_desc = videotoolbox_format_desc_create(avctx,
> +
> videotoolbox->cm_codec_type,
>
>  decoder_spec,
>
>  avctx->width,
>
>  avctx->height);
> --
> 2.7.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list