From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 4267846568 for ; Mon, 18 Mar 2024 16:58:53 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 99EE468D396; Mon, 18 Mar 2024 18:57:17 +0200 (EET) Received: from haasn.dev (haasn.dev [78.46.187.166]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1B2B068D342 for ; Mon, 18 Mar 2024 18:57:03 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1710781019; bh=cC1xVKEc9JGkEs+IpzRRnNGzwYlsLjM6FV7+M38fwXs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=U2CAq3O/b1P1T9zC8dBGZXjxHA3ZiotbisDqJ5cAMWYNqLaQZmiDlaVGXNwULRw+9 tH8e4G7h/uc/bCi3apmEoHZ3RVSre1/3xn+JXXgUHueVmyoAClcaqzqZCmSDHVKj7j ahjlHVwoKB8z7om169nRQV1LiDtSyahtfNsf2Oo0= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 4344344644; Mon, 18 Mar 2024 17:56:59 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 Mar 2024 17:54:17 +0100 Message-ID: <20240318165651.75520-10-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240318165651.75520-1-ffmpeg@haasn.xyz> References: <20240318165651.75520-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 09/13] avutil/film_grain_params: add av_film_grain_params_select() X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Niklas Haas Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: From: Niklas Haas 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 | 61 +++++++++++++++++++++++++++++++++++ libavutil/film_grain_params.h | 11 +++++++ libavutil/version.h | 2 +- 4 files changed, 76 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index 256d9c7757a..f91f4fdcec4 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-xx - xxxxxxxxxx - lavu 59.4.100 - film_grain_params.h + Add av_film_grain_params_select(). + 2024-03-xx - xxxxxxxxxx - lavu 59.3.100 - film_grain_params.h Add AVFilmGrainParams.color_range, color_primaries, color_trc, color_space, width, height, subsampling_x, subsampling_y, bit_depth_luma and diff --git a/libavutil/film_grain_params.c b/libavutil/film_grain_params.c index 230ce8d701c..fff7252f2f5 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) { @@ -47,3 +48,63 @@ AVFilmGrainParams *av_film_grain_params_create_side_data(AVFrame *frame) return fgp; } + +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; + int bit_depth_luma, bit_depth_chroma; + if (!desc) + return NULL; + + /* There are no YUV formats with different bit depth per component, + * so just check both against the first component for simplicity */ + bit_depth_luma = bit_depth_chroma = desc->comp[0].depth; + + 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; + if (fgp->width && fgp->width > frame->width || + fgp->height && fgp->height > frame->height) + continue; + +#define CHECK(a, b, unspec) \ + do { \ + if ((a) != (unspec) && (b) != (unspec) && (a) != (b)) \ + continue; \ + } while (0) + + CHECK(fgp->bit_depth_luma, bit_depth_luma, 0); + CHECK(fgp->bit_depth_chroma, bit_depth_chroma, 0); + CHECK(fgp->color_range, frame->color_range, AVCOL_RANGE_UNSPECIFIED); + CHECK(fgp->color_primaries, frame->color_primaries, AVCOL_PRI_UNSPECIFIED); + CHECK(fgp->color_trc, frame->color_trc, AVCOL_TRC_UNSPECIFIED); + CHECK(fgp->color_space, frame->colorspace, AVCOL_SPC_UNSPECIFIED); + + switch (fgp->type) { + case AV_FILM_GRAIN_PARAMS_NONE: + continue; + case AV_FILM_GRAIN_PARAMS_AV1: + aom = &fgp->codec.aom; + /* AOM FGS needs an exact match for the chroma resolution */ + if (fgp->subsampling_x != desc->log2_chroma_w || + fgp->subsampling_y != desc->log2_chroma_h) + continue; + break; + case AV_FILM_GRAIN_PARAMS_H274: + /* H.274 FGS can be adapted to any lower chroma resolution */ + if (fgp->subsampling_x > desc->log2_chroma_w || + fgp->subsampling_y > desc->log2_chroma_h) + continue; + break; + } + + if (!best || best->width < fgp->width || best->height < fgp->height) + best = fgp; + } + + return best; +} diff --git a/libavutil/film_grain_params.h b/libavutil/film_grain_params.h index a9f243351c9..ccacab88fed 100644 --- a/libavutil/film_grain_params.h +++ b/libavutil/film_grain_params.h @@ -308,4 +308,15 @@ 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. + * + * @note, for H.274, this may select a film grain parameter set with + * greater chroma resolution than the frame. Users should take care to + * correctly adjust the chroma grain frequency to the frame. + */ +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 23351316b58..5248207ec7d 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 3 +#define LIBAVUTIL_VERSION_MINOR 4 #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".