Le jeudi 9 octobre 2014, 11:21:26 Luca Barbato a écrit :
> Bitstream-based hw acceleration does not fit well the per-slice model.
> Provide a decode() and a flush() callback to completely override the
> software decoder.
> ---
>  doc/APIchanges       |  4 ++++
>  libavcodec/avcodec.h | 12 ++++++++++++
>  libavcodec/utils.c   |  9 +++++++--
>  libavcodec/version.h |  4 ++--
>  4 files changed, 25 insertions(+), 4 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index ee31719..0818a48 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -13,6 +13,10 @@ libavutil:     2014-08-09
> 
>  API changes, most recent first:
> 
> +2014-10-xx - xxxxxxx - lavc 56.3.0 - avcodec.h
> +  Add AVHWAccel.decode and AVHWAccel.flush callbacks to support
> +  bitstream oriented hardware acceleration frameworks.
> +
>  2014-09-xx - xxxxxxx - lavu 54.04.0 - pixdesc.h
>    Add API to return the name of frame and context color properties.
> 
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index f0fa7a9..72a5618 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -3014,6 +3014,18 @@ typedef struct AVHWAccel {
>       * AVCodecInternal.hwaccel_priv_data.
>       */
>      int priv_data_size;
> +
> +    /**
> +     * Directly decode the avpacket, it is called instead of the normal
> +     * AVCodec callback.
> +     */
> +    int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,
> +                  AVPacket *avpkt);
> +    /**
> +     * Flush the decoder, it is called instead of the normal AVCodec
> +     * callback.
> +     */
> +    void (*flush)(AVCodecContext *);

Based on the VDPAU series review, I have to believe that adding new visible 
but internal members to AVHWAccel is not allowed.

>  } AVHWAccel;
> 
>  /**
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 89f249f..1736949 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -1634,7 +1634,10 @@ int attribute_align_arg
> avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
> av_frame_unref(picture);
> 
>      if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size ||
> (avctx->active_thread_type & FF_THREAD_FRAME)) {
> -        if (HAVE_THREADS
> && avctx->active_thread_type & FF_THREAD_FRAME)
> +        if (avctx->hwaccel
> && avctx->hwaccel->decode)
> +            ret = avctx->hwaccel->decode(avctx, picture, got_picture_ptr,
> +                                         avpkt);

Are the codec profile and resolution known at that point? I would not think so.

If not, that will never going to work smoothly, unless the back-end supported 
all profiles and all resolutions. In particular, that will prevent software 
fallback.

> +        else if (HAVE_THREADS && avctx->active_thread_type &
> FF_THREAD_FRAME) ret = ff_thread_decode_frame(avctx, picture,
> got_picture_ptr, avpkt);
>          else {
> @@ -2055,7 +2058,9 @@ const char *avcodec_license(void)
> 
>  void avcodec_flush_buffers(AVCodecContext *avctx)
>  {
> -    if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
> +    if (avctx->hwaccel && avctx->codec->flush)
> +        avctx->hwaccel->flush(avctx);
> +    else if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
>          ff_thread_flush(avctx);
>      else if (avctx->codec->flush)
>          avctx->codec->flush(avctx);
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 90b1f10..d9c4500 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -29,8 +29,8 @@
>  #include "libavutil/version.h"
> 
>  #define LIBAVCODEC_VERSION_MAJOR 56
> -#define LIBAVCODEC_VERSION_MINOR  2
> -#define LIBAVCODEC_VERSION_MICRO  2
> +#define LIBAVCODEC_VERSION_MINOR  3
> +#define LIBAVCODEC_VERSION_MICRO  0
> 
>  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
>                                                 LIBAVCODEC_VERSION_MINOR, \

-- 
Rémi Denis-Courmont
http://www.remlab.net/

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to