[FFmpeg-cvslog] lavc/videotoolbox: fix H.264 hwaccel init issue
Rick Kern
git at videolan.org
Fri Jun 17 03:24:10 CEST 2016
ffmpeg | branch: master | Rick Kern <kernrj at gmail.com> | Wed Jun 1 21:40:22 2016 -0400| [8e47a99f576da10b2a36e33b6b9acbf1c2da7485] | committer: Rick Kern
lavc/videotoolbox: fix H.264 hwaccel init issue
Fixes VTDecompressionSessionCreate() error.
Signed-off-by: Rick Kern <kernrj at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8e47a99f576da10b2a36e33b6b9acbf1c2da7485
---
libavcodec/videotoolbox.c | 59 ++++++++++++++++++++++++++++++++++-----------
1 file changed, 45 insertions(+), 14 deletions(-)
diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
index 6bd850a..384bb8a 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->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);
+
+ 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);
More information about the ffmpeg-cvslog
mailing list