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

Reply via email to