On Mon, Mar 24, 2014 at 3:01 AM, 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/h263dec.c b/libavcodec/h263dec.c
> index 602dafa..ddc3b01 100644
> --- a/libavcodec/h263dec.c
> +++ b/libavcodec/h263dec.c
> @@ -108,7 +108,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
> return AVERROR(ENOSYS);
> }
> s->codec_id = avctx->codec->id;
> - avctx->hwaccel = ff_find_hwaccel(avctx);
>
> /* for h263, we allocate the images after having read the header */
> if (avctx->codec->id != AV_CODEC_ID_H263 &&
> diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
> index 683dead..d6a25c4 100644
> --- a/libavcodec/h264_slice.c
> +++ b/libavcodec/h264_slice.c
> @@ -1081,8 +1081,6 @@ static int h264_slice_header_init(H264Context *h, int
> reinit)
> h->sps.num_units_in_tick, den, 1 << 30);
> }
>
> - h->avctx->hwaccel = ff_find_hwaccel(h->avctx);
> -
> if (reinit)
> ff_h264_free_tables(h, 0);
> h->first_field = 0;
> diff --git a/libavcodec/internal.h b/libavcodec/internal.h
> index eb91b6a..64765a2 100644
> --- a/libavcodec/internal.h
> +++ b/libavcodec/internal.h
> @@ -103,15 +103,6 @@ struct AVCodecDefault {
> };
>
> /**
> - * Return the hardware accelerated codec for codec codec_id and
> - * pixel format pix_fmt.
> - *
> - * @param avctx The codec context containing the codec_id and pixel format.
> - * @return the hardware accelerated codec, or NULL if none was found.
> - */
> -AVHWAccel *ff_find_hwaccel(AVCodecContext *avctx);
> -
> -/**
> * Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
> * If there is no such matching pair then size is returned.
> */
> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
> index b8e7d36..c3f06dc 100644
> --- a/libavcodec/mpeg12dec.c
> +++ b/libavcodec/mpeg12dec.c
> @@ -1295,7 +1295,6 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
> } // MPEG-2
>
> avctx->pix_fmt = mpeg_get_pixelformat(avctx);
> - avctx->hwaccel = ff_find_hwaccel(avctx);
> // until then pix_fmt may be changed right after codec init
> #if FF_API_XVMC
> if ((avctx->pix_fmt == AV_PIX_FMT_XVMC_MPEG2_IDCT ||
> @@ -2126,7 +2125,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
> s->low_delay = 1;
>
> avctx->pix_fmt = mpeg_get_pixelformat(avctx);
> - avctx->hwaccel = ff_find_hwaccel(avctx);
>
> #if FF_API_XVMC
> if ((avctx->pix_fmt == AV_PIX_FMT_XVMC_MPEG2_IDCT || avctx->hwaccel) &&
> 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;
> +}
> +
> +
nit: extra line added
> 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;
> + }
> + } else {
> + avctx->hwaccel = NULL;
> + }
> +
> + return ret;
> }
>
> #if FF_API_AVFRAME_LAVC
> @@ -2181,20 +2213,6 @@ AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel)
> return hwaccel ? hwaccel->next : first_hwaccel;
> }
>
> -AVHWAccel *ff_find_hwaccel(AVCodecContext *avctx)
> -{
> - enum AVCodecID codec_id = avctx->codec->id;
> - enum AVPixelFormat pix_fmt = avctx->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 av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op))
> {
> if (lockmgr_cb) {
> diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
> index caf33fb..b04e22d 100644
> --- a/libavcodec/vc1dec.c
> +++ b/libavcodec/vc1dec.c
> @@ -5597,7 +5597,6 @@ static av_cold int vc1_decode_init(AVCodecContext
> *avctx)
> avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
> else
> avctx->pix_fmt = AV_PIX_FMT_GRAY8;
> - avctx->hwaccel = ff_find_hwaccel(avctx);
> v->s.avctx = avctx;
>
> if (ff_vc1_init_common(v) < 0)
> --
Probably ok
--
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel