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

Reply via email to