diff mbox series

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

Message ID 20201208050412.335967-1-philipl@overt.org
State Superseded
Headers show
Series [FFmpeg-devel] avcodec/libaom: Support monochrome encoding with libaom >= 2.0.1 | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Philip Langdale Dec. 8, 2020, 5:04 a.m. UTC
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).

Surprisingly, we've never had an external library feature flag in
configure before, but it seems reasonable to add such a category.

Signed-off-by: Philip Langdale <philipl@overt.org>
---
 Changelog              |  1 +
 configure              |  8 ++++++++
 libavcodec/libaomenc.c | 14 ++++++++++++++
 libavcodec/version.h   |  2 +-
 4 files changed, 24 insertions(+), 1 deletion(-)

Comments

James Almer Dec. 8, 2020, 1:26 p.m. UTC | #1
On 12/8/2020 2:04 AM, 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).
> 
> Surprisingly, we've never had an external library feature flag in
> configure before, but it seems reasonable to add such a category.
> 
> Signed-off-by: Philip Langdale <philipl@overt.org>
> ---
>   Changelog              |  1 +
>   configure              |  8 ++++++++
>   libavcodec/libaomenc.c | 14 ++++++++++++++
>   libavcodec/version.h   |  2 +-
>   4 files changed, 24 insertions(+), 1 deletion(-)
> 
> 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/configure b/configure
> index 10dd40cab8..6c83895414 100755
> --- a/configure
> +++ b/configure
> @@ -1829,6 +1829,10 @@ EXTERNAL_LIBRARY_LIST="
>       vapoursynth
>   "
>   
> +EXTERNAL_LIBRARY_FEATURES="
> +    libaom2
> +"
> +
>   HWACCEL_AUTODETECT_LIBRARY_LIST="
>       amf
>       audiotoolbox
> @@ -2314,6 +2318,7 @@ HAVE_LIST="
>       $ARCH_FEATURES
>       $BUILTIN_LIST
>       $COMPLEX_FUNCS
> +    $EXTERNAL_LIBRARY_FEATURES
>       $HAVE_LIST_CMDLINE
>       $HAVE_LIST_PUB
>       $HEADERS_LIST
> @@ -6329,6 +6334,9 @@ enabled gnutls            && require_pkg_config gnutls gnutls gnutls/gnutls.h gn
>   enabled jni               && { [ $target_os = "android" ] && check_headers jni.h && enabled pthreads || die "ERROR: jni not found"; }
>   enabled ladspa            && require_headers "ladspa.h dlfcn.h"
>   enabled libaom            && require_pkg_config libaom "aom >= 1.0.0" aom/aom_codec.h aom_codec_version
> +if enabled libaom; then
> +    check_pkg_config libaom2 "aom >= 2.0.1" aom/aom_codec.h aom_codec_version

It should be cleaner to do the version check in libaomenc.c

Look at av1_init_static(), where we check for libaom 2 in order to tag 
the wrapper as experimental if the library is too old. In there you can 
add a check for 2.0.1 (like aom_codec_version() >= 0x20001) and make it 
set codec->pix_fmts to a new list of formats that include the gray ones 
depending on the result.

> +fi
>   enabled libaribb24        && { check_pkg_config libaribb24 "aribb24 > 1.0.3" "aribb24/aribb24.h" arib_instance_new ||
>                                  { enabled gpl && require_pkg_config libaribb24 aribb24 "aribb24/aribb24.h" arib_instance_new; } ||
>                                  die "ERROR: libaribb24 requires version higher than 1.0.3 or --enable-gpl."; }
> diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
> index 2b0581b15a..6110472b68 100644
> --- a/libavcodec/libaomenc.c
> +++ b/libavcodec/libaomenc.c
> @@ -338,6 +338,10 @@ 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) {
> +#if HAVE_LIBAOM2
> +    case AV_PIX_FMT_GRAY8:
> +        enccfg->monochrome = 1;
> +#endif

Add a line like

// Fall-through

Here, to hint the compiler to not warn about a missing break.

>       case AV_PIX_FMT_YUV420P:
>           enccfg->g_profile = FF_PROFILE_AV1_MAIN;
>           *img_fmt = AOM_IMG_FMT_I420;
> @@ -351,6 +355,11 @@ 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;
> +#if HAVE_LIBAOM2
> +    case AV_PIX_FMT_GRAY10:
> +    case AV_PIX_FMT_GRAY12:
> +        enccfg->monochrome = 1;
> +#endif

Ditto.

>       case AV_PIX_FMT_YUV420P10:
>       case AV_PIX_FMT_YUV420P12:
>           if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
> @@ -1171,6 +1180,11 @@ static const enum AVPixelFormat av1_pix_fmts_highbd[] = {
>       AV_PIX_FMT_YUV444P12,
>       AV_PIX_FMT_GBRP10,
>       AV_PIX_FMT_GBRP12,
> +#if HAVE_LIBAOM2
> +    AV_PIX_FMT_GRAY8,
> +    AV_PIX_FMT_GRAY10,
> +    AV_PIX_FMT_GRAY12,
> +#endif
>       AV_PIX_FMT_NONE
>   };
>   
> 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, \
>
diff mbox series

Patch

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/configure b/configure
index 10dd40cab8..6c83895414 100755
--- a/configure
+++ b/configure
@@ -1829,6 +1829,10 @@  EXTERNAL_LIBRARY_LIST="
     vapoursynth
 "
 
+EXTERNAL_LIBRARY_FEATURES="
+    libaom2
+"
+
 HWACCEL_AUTODETECT_LIBRARY_LIST="
     amf
     audiotoolbox
@@ -2314,6 +2318,7 @@  HAVE_LIST="
     $ARCH_FEATURES
     $BUILTIN_LIST
     $COMPLEX_FUNCS
+    $EXTERNAL_LIBRARY_FEATURES
     $HAVE_LIST_CMDLINE
     $HAVE_LIST_PUB
     $HEADERS_LIST
@@ -6329,6 +6334,9 @@  enabled gnutls            && require_pkg_config gnutls gnutls gnutls/gnutls.h gn
 enabled jni               && { [ $target_os = "android" ] && check_headers jni.h && enabled pthreads || die "ERROR: jni not found"; }
 enabled ladspa            && require_headers "ladspa.h dlfcn.h"
 enabled libaom            && require_pkg_config libaom "aom >= 1.0.0" aom/aom_codec.h aom_codec_version
+if enabled libaom; then
+    check_pkg_config libaom2 "aom >= 2.0.1" aom/aom_codec.h aom_codec_version
+fi
 enabled libaribb24        && { check_pkg_config libaribb24 "aribb24 > 1.0.3" "aribb24/aribb24.h" arib_instance_new ||
                                { enabled gpl && require_pkg_config libaribb24 aribb24 "aribb24/aribb24.h" arib_instance_new; } ||
                                die "ERROR: libaribb24 requires version higher than 1.0.3 or --enable-gpl."; }
diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
index 2b0581b15a..6110472b68 100644
--- a/libavcodec/libaomenc.c
+++ b/libavcodec/libaomenc.c
@@ -338,6 +338,10 @@  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) {
+#if HAVE_LIBAOM2
+    case AV_PIX_FMT_GRAY8:
+        enccfg->monochrome = 1;
+#endif
     case AV_PIX_FMT_YUV420P:
         enccfg->g_profile = FF_PROFILE_AV1_MAIN;
         *img_fmt = AOM_IMG_FMT_I420;
@@ -351,6 +355,11 @@  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;
+#if HAVE_LIBAOM2
+    case AV_PIX_FMT_GRAY10:
+    case AV_PIX_FMT_GRAY12:
+        enccfg->monochrome = 1;
+#endif
     case AV_PIX_FMT_YUV420P10:
     case AV_PIX_FMT_YUV420P12:
         if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
@@ -1171,6 +1180,11 @@  static const enum AVPixelFormat av1_pix_fmts_highbd[] = {
     AV_PIX_FMT_YUV444P12,
     AV_PIX_FMT_GBRP10,
     AV_PIX_FMT_GBRP12,
+#if HAVE_LIBAOM2
+    AV_PIX_FMT_GRAY8,
+    AV_PIX_FMT_GRAY10,
+    AV_PIX_FMT_GRAY12,
+#endif
     AV_PIX_FMT_NONE
 };
 
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, \