[FFmpeg-devel] [PATCH] avcodec: Add flag for experimental HWAccels and use it for VDPAU/HEVC

wm4 nfxjfg at googlemail.com
Fri Jun 26 18:09:55 CEST 2015


On Fri, 26 Jun 2015 08:45:09 -0700
Philip Langdale <philipl at overt.org> wrote:

> This HWAccel isn't really usable right now due to an nvidia driver bug,
> so we don't want it selected by default.
> 
> HWAccels have a capabilities field and there's a comment about flags,
> but no flags exist today, so let's add one for experimental hwaccels.
> 
> Signed-off-by: Philip Langdale <philipl at overt.org>
> ---
>  libavcodec/avcodec.h    | 8 +++++++-
>  libavcodec/utils.c      | 7 +++++++
>  libavcodec/vdpau_hevc.c | 1 +
>  libavcodec/version.h    | 2 +-
>  4 files changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 761d3c1..ddbf0a3 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -894,6 +894,12 @@ typedef struct RcOverride{
>   */
>  #define CODEC_CAP_LOSSLESS         0x80000000
>  
> +/**
> + * HWAccel is experimental and is thus avoided in favor of non experimental
> + * codecs
> + */
> +#define HWACCEL_CODEC_CAP_EXPERIMENTAL     0x0200
> +
>  #if FF_API_MB_TYPE
>  //The following defines may change, don't expect compatibility if you use them.
>  #define MB_TYPE_INTRA4x4   0x0001
> @@ -3336,7 +3342,7 @@ typedef struct AVHWAccel {
>  
>      /**
>       * Hardware accelerated codec capabilities.
> -     * see FF_HWACCEL_CODEC_CAP_*
> +     * see HWACCEL_CODEC_CAP_*
>       */
>      int capabilities;
>  
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 7696582..40ea544 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -1176,6 +1176,13 @@ static int setup_hwaccel(AVCodecContext *avctx,
>          return AVERROR(ENOENT);
>      }
>  
> +    if (hwa->capabilities & HWACCEL_CODEC_CAP_EXPERIMENTAL &&
> +        avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
> +        av_log(avctx, AV_LOG_WARNING, "Ignoring experimental hwaccel: %s\n",
> +               hwa->name);
> +        return AVERROR(ENOTSUP);
> +    }
> +
>      if (hwa->priv_data_size) {
>          avctx->internal->hwaccel_priv_data = av_mallocz(hwa->priv_data_size);
>          if (!avctx->internal->hwaccel_priv_data)
> diff --git a/libavcodec/vdpau_hevc.c b/libavcodec/vdpau_hevc.c
> index 99e1a8d..928513b 100644
> --- a/libavcodec/vdpau_hevc.c
> +++ b/libavcodec/vdpau_hevc.c
> @@ -427,6 +427,7 @@ AVHWAccel ff_hevc_vdpau_hwaccel = {
>      .type           = AVMEDIA_TYPE_VIDEO,
>      .id             = AV_CODEC_ID_HEVC,
>      .pix_fmt        = AV_PIX_FMT_VDPAU,
> +    .capabilities   = HWACCEL_CODEC_CAP_EXPERIMENTAL,
>      .start_frame    = vdpau_hevc_start_frame,
>      .end_frame      = vdpau_hevc_end_frame,
>      .decode_slice   = vdpau_hevc_decode_slice,
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index eff8820..1073588 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -29,7 +29,7 @@
>  #include "libavutil/version.h"
>  
>  #define LIBAVCODEC_VERSION_MAJOR 56
> -#define LIBAVCODEC_VERSION_MINOR  45
> +#define LIBAVCODEC_VERSION_MINOR  46
>  #define LIBAVCODEC_VERSION_MICRO 100
>  
>  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \

LGTM, but not sure if the flag really has to be public API. This is
pretty much just a one-time thing with the vdpau code.


More information about the ffmpeg-devel mailing list