On Mon, 24 Mar 2014 08:46:01 +0100, Rémi Denis-Courmont <[email protected]> wrote: > On Mon, 24 Mar 2014 03:01:46 +0100, Luca Barbato <[email protected]> > wrote: > > From: Anton Khirnov <[email protected]> > > > > This way each decoder does not have to do the same thing manually. > > --- > > libavcodec/h263dec.c | 1 - > > libavcodec/h264_slice.c | 2 -- > > libavcodec/internal.h | 9 --------- > > libavcodec/mpeg12dec.c | 2 -- > > libavcodec/utils.c | 48 > > +++++++++++++++++++++++++++++++++--------------- > > libavcodec/vc1dec.c | 1 - > > 6 files changed, 33 insertions(+), 30 deletions(-) > > > > diff --git a/libavcodec/utils.c b/libavcodec/utils.c > > index 2b3c00a..e52d915 100644 > > --- a/libavcodec/utils.c > > +++ b/libavcodec/utils.c > > @@ -836,9 +836,41 @@ enum AVPixelFormat > avcodec_default_get_format(struct > > AVCodecContext *s, const en > > return fmt[0]; > > } > > > > +static AVHWAccel *find_hwaccel(enum AVCodecID codec_id, > > + enum AVPixelFormat pix_fmt) > > +{ > > + AVHWAccel *hwaccel = NULL; > > + > > + while ((hwaccel = av_hwaccel_next(hwaccel))) > > + if (hwaccel->id == codec_id > > + && hwaccel->pix_fmt == pix_fmt) > > + return hwaccel; > > + return NULL; > > +} > > + > > + > > int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt) > > { > > - return avctx->get_format(avctx, fmt); > > + const AVPixFmtDescriptor *desc; > > + enum AVPixelFormat ret = avctx->get_format(avctx, fmt); > > + > > + desc = av_pix_fmt_desc_get(ret); > > + if (!desc) > > + return AV_PIX_FMT_NONE; > > + > > + if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) { > > + avctx->hwaccel = find_hwaccel(avctx->codec_id, ret); > > + if (!avctx->hwaccel) { > > + av_log(avctx, AV_LOG_ERROR, > > + "Could not find an AVHWAccel for the pixel format: > %s", > > + desc->name); > > + return AV_PIX_FMT_NONE; > > Is this recoverable in any reasonably way? > > I can see three ways this situation happens: > > 1) libavcodec advertised a pxiel format in get_format() that it does not > actually support. That would be a bug in libavcodec (this bug actually does > exist if you disable some hwaccel manually in ./configure). > > 2) The application returned a pixel format that was not advertised. I > think that is a non-recoverable application bug. >
Yes, those two are bugs that should be fixed in their respective places, and in the following we can assume they do not happen. > 3) Initialization of the hwaccel back-end unexpectedly fail. I am not sure > if this should be allowed at this step. But if it should, I think the > correct solution is to call get_format again, *without* the failed pixel > format in the list. That way the application has a chance to recover by > falling back to some other format. > With this patchset, the only reason initialization can fail is out of memory. And that's not something we can easily recover from. -- Anton Khirnov _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
