Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Niklas Haas <ffmpeg@haasn.xyz>
To: ffmpeg-devel@ffmpeg.org
Cc: Niklas Haas <git@haasn.dev>
Subject: [FFmpeg-devel] [PATCH v3 5/9] avutil/film_grain_params: add av_film_grain_params_select()
Date: Fri, 15 Mar 2024 12:58:58 +0100
Message-ID: <20240315120442.73754-6-ffmpeg@haasn.xyz> (raw)
In-Reply-To: <20240315120442.73754-1-ffmpeg@haasn.xyz>

From: Niklas Haas <git@haasn.dev>

Common utility function that can be used by all codecs to select the
right (any valid) film grain parameter set. In particular, this is
useful for AFGS1, which has support for multiple parameters.

However, it also performs parameter validation for H274.
---
 doc/APIchanges                |  3 ++
 libavutil/film_grain_params.c | 57 +++++++++++++++++++++++++++++++++++
 libavutil/film_grain_params.h |  7 +++++
 libavutil/version.h           |  2 +-
 4 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 5a192b600af..34245c8b708 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07
 
 API changes, most recent first:
 
+2024-03-08 - xxxxxxxxxx - lavu 59.3.100 - film_grain_params.h
+  Add av_film_grain_params_select().
+
 2024-03-08 - xxxxxxxxxx - lavu 59.2.100 - film_grain_params.h
   Add AVFilmGrainAOMParams.color_range, color_primaries, color_trc,
   color_space, width, height, subx, suby and bit_depth.
diff --git a/libavutil/film_grain_params.c b/libavutil/film_grain_params.c
index 930d23c7fe9..8c80adc66a7 100644
--- a/libavutil/film_grain_params.c
+++ b/libavutil/film_grain_params.c
@@ -17,6 +17,7 @@
  */
 
 #include "film_grain_params.h"
+#include "pixdesc.h"
 
 AVFilmGrainParams *av_film_grain_params_alloc(size_t *size)
 {
@@ -40,3 +41,59 @@ AVFilmGrainParams *av_film_grain_params_create_side_data(AVFrame *frame)
 
     return (AVFilmGrainParams *)side_data->data;
 }
+
+const AVFilmGrainParams *av_film_grain_params_select(const AVFrame *frame)
+{
+    const AVFilmGrainParams *fgp, *best = NULL;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
+    const AVFilmGrainAOMParams *aom;
+    const AVFilmGrainH274Params *h274;
+    if (!desc)
+        return NULL;
+
+#define CHECK(a, b, unspec)                                     \
+    do {                                                        \
+        if ((a) != (unspec) && (b) != (unspec) && (a) != (b))   \
+            continue;                                           \
+    } while (0)
+
+    for (int i = 0; i < frame->nb_side_data; i++) {
+        if (frame->side_data[i]->type != AV_FRAME_DATA_FILM_GRAIN_PARAMS)
+            continue;
+        fgp = (const AVFilmGrainParams*)frame->side_data[i]->data;
+        switch (fgp->type) {
+        case AV_FILM_GRAIN_PARAMS_NONE:
+            continue;
+        case AV_FILM_GRAIN_PARAMS_AV1:
+            aom = &fgp->codec.aom;
+            if (aom->subx != desc->log2_chroma_w || aom->suby != desc->log2_chroma_h)
+                continue;
+            CHECK(aom->bit_depth,       desc->comp[0].depth, 0);
+            CHECK(aom->width,           frame->width, 0);
+            CHECK(aom->height,          frame->height, 0);
+            CHECK(aom->color_range,     frame->color_range,     AVCOL_RANGE_UNSPECIFIED);
+            CHECK(aom->color_primaries, frame->color_primaries, AVCOL_PRI_UNSPECIFIED);
+            CHECK(aom->color_trc,       frame->color_trc,       AVCOL_TRC_UNSPECIFIED);
+            CHECK(aom->color_space,     frame->colorspace,      AVCOL_SPC_UNSPECIFIED);
+
+            if (!best ||
+                best->codec.aom.width < aom->width ||
+                best->codec.aom.height < aom->height)
+                best = fgp;
+            break;
+        case AV_FILM_GRAIN_PARAMS_H274:
+            h274 = &fgp->codec.h274;
+            /* There are no YUV formats with different bit depth per component,
+             * so just check both against the first component for simplicity */
+            CHECK(h274->bit_depth_luma,   desc->comp[0].depth, 0);
+            CHECK(h274->bit_depth_chroma, desc->comp[0].depth, 0);
+            CHECK(h274->color_range,      frame->color_range,     AVCOL_RANGE_UNSPECIFIED);
+            CHECK(h274->color_primaries,  frame->color_primaries, AVCOL_PRI_UNSPECIFIED);
+            CHECK(h274->color_trc,        frame->color_trc,       AVCOL_TRC_UNSPECIFIED);
+            CHECK(h274->color_space,      frame->colorspace,      AVCOL_SPC_UNSPECIFIED);
+            return fgp; /* H274 can't have multiple resolutions */
+        }
+    }
+
+    return best;
+}
diff --git a/libavutil/film_grain_params.h b/libavutil/film_grain_params.h
index 17fefeb06c3..75c020ceb92 100644
--- a/libavutil/film_grain_params.h
+++ b/libavutil/film_grain_params.h
@@ -272,4 +272,11 @@ AVFilmGrainParams *av_film_grain_params_alloc(size_t *size);
  */
 AVFilmGrainParams *av_film_grain_params_create_side_data(AVFrame *frame);
 
+/**
+ * Select the most appropriate film grain parameters set for the frame,
+ * taking into account the frame's format, resolution and video signal
+ * characteristics.
+ */
+const AVFilmGrainParams *av_film_grain_params_select(const AVFrame *frame);
+
 #endif /* AVUTIL_FILM_GRAIN_PARAMS_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index 57cad02ec0a..5027b025be4 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  59
-#define LIBAVUTIL_VERSION_MINOR   2
+#define LIBAVUTIL_VERSION_MINOR   3
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
-- 
2.44.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2024-03-15 12:05 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-15 11:58 [FFmpeg-devel] [PATCH v3 0/9] AFGS1 film grain support Niklas Haas
2024-03-15 11:58 ` [FFmpeg-devel] [PATCH v3 1/9] avutil/film_grain_params: add extra AFGS1 metadata Niklas Haas
2024-03-15 12:18   ` James Almer
2024-03-15 11:58 ` [FFmpeg-devel] [PATCH v3 2/9] avcodec/av1dec: initialize AFGS1 VSC metadata Niklas Haas
2024-03-15 12:20   ` James Almer
2024-03-15 12:23     ` Niklas Haas
2024-03-15 12:25       ` James Almer
2024-03-15 11:58 ` [FFmpeg-devel] [PATCH v3 3/9] avcodec/libdav1d: " Niklas Haas
2024-03-15 11:58 ` [FFmpeg-devel] [PATCH v3 4/9] avutil/frame: clarify AV_FRAME_DATA_FILM_GRAIN_PARAMS usage Niklas Haas
2024-03-15 11:58 ` Niklas Haas [this message]
2024-03-15 12:22   ` [FFmpeg-devel] [PATCH v3 5/9] avutil/film_grain_params: add av_film_grain_params_select() Niklas Haas
2024-03-15 11:58 ` [FFmpeg-devel] [PATCH v3 6/9] avcodec/aom_film_grain: add AOM film grain synthesis Niklas Haas
2024-03-15 11:59 ` [FFmpeg-devel] [PATCH v3 7/9] avcodec/aom_film_grain: implement AFGS1 parsing Niklas Haas
2024-03-15 11:59 ` [FFmpeg-devel] [PATCH v3 8/9] avcodec/h2645_sei: decode AFGS1 T.35 SEI Niklas Haas
2024-03-15 11:59 ` [FFmpeg-devel] [PATCH v3 9/9] avcodec/hevcdec: apply AOM film grain synthesis Niklas Haas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240315120442.73754-6-ffmpeg@haasn.xyz \
    --to=ffmpeg@haasn.xyz \
    --cc=ffmpeg-devel@ffmpeg.org \
    --cc=git@haasn.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git