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.
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.
> + }
> + } else {
> + avctx->hwaccel = NULL;
> + }
> +
> + return ret;
> }
>
> #if FF_API_AVFRAME_LAVC
--
Rémi Denis-Courmont
Sent from my collocated server
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel