lavc/videotoolbox: fix H.264 hwaccel init issue

Fixes VTDecompressionSessionCreate() error.

Signed-off-by: Rick Kern <kernrj@gmail.com>
This commit is contained in:
Rick Kern 2016-06-01 21:40:22 -04:00
parent 143685a42b
commit 8e47a99f57
1 changed files with 43 additions and 12 deletions

View File

@ -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;
CMFormatDescriptionRef cm_fmt_desc = NULL;
int status;
H264Context *h = codec_type == kCMVideoCodecType_H264 ? avctx->priv_data : NULL;
status = CMVideoFormatDescriptionCreate(kCFAllocatorDefault,
codec_type,
width,
height,
decoder_spec, // Dictionary of extension
&cm_fmt_desc);
if (h && h->ps.sps->data_size && h->ps.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);
if (status)
return NULL;
ps_data[0] = h->ps.sps->data;
ps_sizes[0] = h->ps.sps->data_size;
ps_data[1] = h->ps.pps->data;
ps_sizes[1] = h->ps.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);