[FFmpeg-devel] [PATCH] lavc/videotoolbox: fix avcc creation for h264 streams missing extradata
Aman Gupta
aman at tmm1.net
Mon Oct 24 09:20:47 EEST 2016
On Sunday, October 23, 2016, Richard Kern <kernrj at gmail.com> wrote:
>
> > On Oct 19, 2016, at 8:45 PM, Aman Gupta <ffmpeg at tmm1.net <javascript:;>>
> wrote:
> >
> > From: Aman Gupta <aman at tmm1.net <javascript:;>>
> >
> > ff_videotoolbox_avcc_extradata_create() was never being called if
> > avctx->extradata_size==0, even though the function does not need or use
> > the avctx->extradata.
>
> Could this be a bug in another part of the code? It seems like extradata
> should be set.
Yes it definitely could be. I can verify if extradata is present on macOS
where the same sample and ffmpeg version worked.
>
> >
> > This manifested itself only on h264 streams in specific containers, and
> > only on iOS. I guess the macOS version of VideoToolbox is more
> > forgiving, atleast on my specific combination of OS version and hardware.
>
> Which container has this issue?
I saw it with an mpegts file, but only on iOS.
>
> >
> > I also added an error log message when VTDecompressionSessionCreate()
> > fails, to help the next poor soul who runs into a bug in this area of the
> > code. The native OSStatus error codes are much easier to google than
> > their AVERROR counterparts (especially in this case, with
> AVERROR_UNKNOWN).
> > ---
> > libavcodec/videotoolbox.c | 7 +++++--
> > 1 file changed, 5 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
> > index 1288aa5..b21eccb 100644
> > --- a/libavcodec/videotoolbox.c
> > +++ b/libavcodec/videotoolbox.c
> > @@ -413,7 +413,7 @@ static CFDictionaryRef videotoolbox_decoder_config_create(CMVideoCodecType
> codec
> > kVTVideoDecoderSpecification_
> RequireHardwareAcceleratedVideoDecoder,
> > kCFBooleanTrue);
> >
> > - if (avctx->extradata_size) {
> > + if (avctx->extradata_size || codec_type == kCMVideoCodecType_H264) {
>
> This is somewhat confusing. The extradata_size check is only needed for
> videotoolbox_esds_extradata_create(). It should check the sps and pps
> sizes are valid before creating the avcc atom.
I can remove this outer if statement altogether, and add a check either
around or inside the esds_create if that makes more sense.
>
> > CFMutableDictionaryRef avc_info;
> > CFDataRef data = NULL;
> >
> > @@ -572,13 +572,16 @@ static int videotoolbox_default_init(AVCodecContext
> *avctx)
> > if (buf_attr)
> > CFRelease(buf_attr);
> >
> > + if (status != 0)
> > + av_log(avctx, AV_LOG_ERROR, "Error creating videotoolbox
> decompression session: %d\n", status);
> > +
> > switch (status) {
> > case kVTVideoDecoderNotAvailableNowErr:
> > case kVTVideoDecoderUnsupportedDataFormatErr:
> > return AVERROR(ENOSYS);
> > case kVTVideoDecoderMalfunctionErr:
> > return AVERROR(EINVAL);
> > - case kVTVideoDecoderBadDataErr :
> > + case kVTVideoDecoderBadDataErr:
> > return AVERROR_INVALIDDATA;
> > case 0:
> > return 0;
> > --
> > 2.8.1
> >
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel at ffmpeg.org <javascript:;>
> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
More information about the ffmpeg-devel
mailing list