On Mon, 24 Mar 2014 10:03:16 +0100 Anton Khirnov <[email protected]> wrote:
> > 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. I use separate AVCodecContexts for software and hardware decoding. If initializing hardware decoding somehow fails, I return AV_PIX_FMT_NONE from get_format to make the decoder return as soon as possible. Pretty violent, but works well. > > 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. > _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
