On Tue, Jun 21, 2016 at 12:59:32PM -0400, Richard Kern wrote: > > > On Jun 21, 2016, at 11:48 AM, Matthieu Bouron <matthieu.bou...@gmail.com> > > wrote: > > > > From: Matthieu Bouron <matthieu.bou...@stupeflix.com> > > > > Fixes properly ticket #5638. > > > > Since 772ad7142dff590c7bb30370acf5d3c9a8fb512b PPS and SPS contain the > > nal type byte. > > > > This reverts commit b8d754c5d0a2e99022c27bd1159ea3f597f67452. > > This reverts commit 8e47a99f576da10b2a36e33b6b9acbf1c2da7485. > > --- > > libavcodec/videotoolbox.c | 82 > > +++++++++++++---------------------------------- > > 1 file changed, 22 insertions(+), 60 deletions(-) > > > > diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c > > index 7b5245a..c2c621d 100644 > > --- a/libavcodec/videotoolbox.c > > +++ b/libavcodec/videotoolbox.c > > @@ -84,7 +84,7 @@ CFDataRef > > ff_videotoolbox_avcc_extradata_create(AVCodecContext *avctx) > > H264Context *h = avctx->priv_data; > > CFDataRef data = NULL; > > uint8_t *p; > > - int vt_extradata_size = 6 + 3 + h->ps.sps->data_size + 4 + > > h->ps.pps->data_size; > > + int vt_extradata_size = 6 + 2 + h->ps.sps->data_size + 3 + > > h->ps.pps->data_size; > > uint8_t *vt_extradata = av_malloc(vt_extradata_size); > > if (!vt_extradata) > > return NULL; > > @@ -92,21 +92,19 @@ CFDataRef > > ff_videotoolbox_avcc_extradata_create(AVCodecContext *avctx) > > p = vt_extradata; > > > > AV_W8(p + 0, 1); /* version */ > > - AV_W8(p + 1, h->ps.sps->data[0]); /* profile */ > > - AV_W8(p + 2, h->ps.sps->data[1]); /* profile compat */ > > - AV_W8(p + 3, h->ps.sps->data[2]); /* level */ > > + AV_W8(p + 1, h->ps.sps->data[1]); /* profile */ > > + AV_W8(p + 2, h->ps.sps->data[2]); /* profile compat */ > > + AV_W8(p + 3, h->ps.sps->data[3]); /* level */ > > AV_W8(p + 4, 0xff); /* 6 bits reserved (111111) + 2 bits nal size > > length - 3 (11) */ > > AV_W8(p + 5, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps > > (00001) */ > > - AV_WB16(p + 6, h->ps.sps->data_size + 1); > > - AV_W8(p + 8, NAL_SPS | (3 << 5)); // NAL unit header > > - memcpy(p + 9, h->ps.sps->data, h->ps.sps->data_size); > > - p += 9 + h->ps.sps->data_size; > > + AV_WB16(p + 6, h->ps.sps->data_size); > > + memcpy(p + 8, h->ps.sps->data, h->ps.sps->data_size); > > + p += 8 + h->ps.sps->data_size; > > AV_W8(p + 0, 1); /* number of pps */ > > - AV_WB16(p + 1, h->ps.pps->data_size + 1); > > - AV_W8(p + 3, NAL_PPS | (3 << 5)); // NAL unit header > > - memcpy(p + 4, h->ps.pps->data, h->ps.pps->data_size); > > + AV_WB16(p + 1, h->ps.pps->data_size); > > + memcpy(p + 3, h->ps.pps->data, h->ps.pps->data_size); > > > > - p += 4 + h->ps.pps->data_size; > > + p += 3 + h->ps.pps->data_size; > > av_assert0(p - vt_extradata == vt_extradata_size); > > > > data = CFDataCreate(kCFAllocatorDefault, vt_extradata, > > vt_extradata_size); > > @@ -487,58 +485,23 @@ static CFDictionaryRef > > videotoolbox_buffer_attributes_create(int width, > > return buffer_attributes; > > } > > > > -static CMVideoFormatDescriptionRef > > videotoolbox_format_desc_create(AVCodecContext *avctx, > > - > > CMVideoCodecType codec_type, > > +static CMVideoFormatDescriptionRef > > videotoolbox_format_desc_create(CMVideoCodecType codec_type, > > > > CFDictionaryRef decoder_spec, > > int > > width, > > int > > height) > > { > > - CMFormatDescriptionRef cm_fmt_desc = NULL; > > - int status; > > - > > -#if TARGET_OS_IPHONE || defined(__MAC_10_9) > > - 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; > > + CMFormatDescriptionRef cm_fmt_desc; > > + OSStatus status; > > > > - status = CMVideoFormatDescriptionCreateFromH264ParameterSets(NULL, > > - > > ps_count, > > - > > ps_data, > > - > > ps_sizes, > > - 4, > > - > > &cm_fmt_desc); > > - av_freep(&ps_sizes); > > - av_freep(&ps_data); > > + 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 H.264 format > > description: %d\n", status); > > - return NULL; > > - } > > - } else { > > -#endif > > - 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; > > - } > > -#if TARGET_OS_IPHONE || defined(__MAC_10_9) > > - } > > -#endif > > + if (status) > > + return NULL; > > > > return cm_fmt_desc; > > } > > @@ -578,8 +541,7 @@ 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(avctx, > > - > > videotoolbox->cm_codec_type, > > + videotoolbox->cm_fmt_desc = > > videotoolbox_format_desc_create(videotoolbox->cm_codec_type, > > > > decoder_spec, > > > > avctx->width, > > > > avctx->height); > > -- > > 2.8.3 > > > > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > LGTM. As mentioned in IRC, this works on OS X. I haven’t been able to test > decoding on iOS, but the hwaccel’s VTDecompressionSession inits (this is > where it failed originally).
Pushed. Thanks. [...] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel