[FFmpeg-devel] [PATCH v2] avcodec/libaom: Support monochrome encoding with libaom >= 2.0.1

James Almer jamrial at gmail.com
Tue Dec 8 23:55:18 EET 2020


On 12/8/2020 6:45 PM, Philip Langdale wrote:
> Monochrome encoding with libaom was buggy for a long time, but this was
> finally sorted out in libaom 2.0.1 (2.0.0 is almost there but was still
> buggy in realtime mode).
> 
> Signed-off-by: Philip Langdale <philipl at overt.org>
> ---
>   Changelog              |  1 +
>   libavcodec/libaomenc.c | 42 ++++++++++++++++++++++++++++++++++++++++--
>   libavcodec/version.h   |  2 +-
>   3 files changed, 42 insertions(+), 3 deletions(-)
> 
> diff --git a/Changelog b/Changelog
> index 503317dfae..8f5e849f8d 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -51,6 +51,7 @@ version <next>:
>   - asubcut filter
>   - Microsoft Paint (MSP) version 2 decoder
>   - Microsoft Paint (MSP) demuxer
> +- AV1 monochrome encoding support via libaom >= 2.0.1
>   
>   
>   version 4.3:
> diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
> index 2b0581b15a..342d0883e4 100644
> --- a/libavcodec/libaomenc.c
> +++ b/libavcodec/libaomenc.c
> @@ -338,6 +338,9 @@ static int set_pix_fmt(AVCodecContext *avctx, aom_codec_caps_t codec_caps,
>       const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
>       enccfg->g_bit_depth = enccfg->g_input_bit_depth = desc->comp[0].depth;
>       switch (avctx->pix_fmt) {
> +    case AV_PIX_FMT_GRAY8:
> +        enccfg->monochrome = 1;
> +        /* Fall-through */
>       case AV_PIX_FMT_YUV420P:
>           enccfg->g_profile = FF_PROFILE_AV1_MAIN;
>           *img_fmt = AOM_IMG_FMT_I420;
> @@ -351,6 +354,10 @@ static int set_pix_fmt(AVCodecContext *avctx, aom_codec_caps_t codec_caps,
>           enccfg->g_profile = FF_PROFILE_AV1_HIGH;
>           *img_fmt = AOM_IMG_FMT_I444;
>           return 0;
> +    case AV_PIX_FMT_GRAY10:
> +    case AV_PIX_FMT_GRAY12:
> +        enccfg->monochrome = 1;
> +        /* Fall-through */
>       case AV_PIX_FMT_YUV420P10:
>       case AV_PIX_FMT_YUV420P12:
>           if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
> @@ -1158,6 +1165,15 @@ static const enum AVPixelFormat av1_pix_fmts[] = {
>       AV_PIX_FMT_NONE
>   };
>   
> +static const enum AVPixelFormat av1_pix_fmts_with_gray[] = {
> +    AV_PIX_FMT_YUV420P,
> +    AV_PIX_FMT_YUV422P,
> +    AV_PIX_FMT_YUV444P,
> +    AV_PIX_FMT_GBRP,
> +    AV_PIX_FMT_GRAY8,
> +    AV_PIX_FMT_NONE
> +};
> +
>   static const enum AVPixelFormat av1_pix_fmts_highbd[] = {
>       AV_PIX_FMT_YUV420P,
>       AV_PIX_FMT_YUV422P,
> @@ -1174,13 +1190,35 @@ static const enum AVPixelFormat av1_pix_fmts_highbd[] = {
>       AV_PIX_FMT_NONE
>   };
>   
> +static const enum AVPixelFormat av1_pix_fmts_highbd_with_gray[] = {
> +    AV_PIX_FMT_YUV420P,
> +    AV_PIX_FMT_YUV422P,
> +    AV_PIX_FMT_YUV444P,
> +    AV_PIX_FMT_GBRP,
> +    AV_PIX_FMT_YUV420P10,
> +    AV_PIX_FMT_YUV422P10,
> +    AV_PIX_FMT_YUV444P10,
> +    AV_PIX_FMT_YUV420P12,
> +    AV_PIX_FMT_YUV422P12,
> +    AV_PIX_FMT_YUV444P12,
> +    AV_PIX_FMT_GBRP10,
> +    AV_PIX_FMT_GBRP12,
> +    AV_PIX_FMT_GRAY8,
> +    AV_PIX_FMT_GRAY10,
> +    AV_PIX_FMT_GRAY12,
> +    AV_PIX_FMT_NONE
> +};
> +
>   static av_cold void av1_init_static(AVCodec *codec)
>   {
> +    int supports_monochrome = aom_codec_version() >= 20001;
>       aom_codec_caps_t codec_caps = aom_codec_get_caps(aom_codec_av1_cx());
>       if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH)
> -        codec->pix_fmts = av1_pix_fmts_highbd;
> +        codec->pix_fmts = supports_monochrome ? av1_pix_fmts_highbd_with_gray :
> +                                                av1_pix_fmts_highbd;
>       else
> -        codec->pix_fmts = av1_pix_fmts;
> +        codec->pix_fmts = supports_monochrome ? av1_pix_fmts_with_gray :
> +                                                av1_pix_fmts;
>   
>       if (aom_codec_version_major() < 2)
>           codec->capabilities |= AV_CODEC_CAP_EXPERIMENTAL;
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 1c10d105f6..5b92afe60a 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -29,7 +29,7 @@
>   
>   #define LIBAVCODEC_VERSION_MAJOR  58
>   #define LIBAVCODEC_VERSION_MINOR 115
> -#define LIBAVCODEC_VERSION_MICRO 101
> +#define LIBAVCODEC_VERSION_MICRO 102
>   
>   #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
>                                                  LIBAVCODEC_VERSION_MINOR, \

LGTM.

Once all LTS distros shipping libaom 1.0.0 are EOL we can remove support 
for anything older than 2.0.1 and simplify this.


More information about the ffmpeg-devel mailing list