From: "Jan Ekström" <jeebjp@gmail.com>
To: ffmpeg-devel@ffmpeg.org
Subject: [FFmpeg-devel] [PATCH v9 00/14] encoder AVCodecContext configuration side data
Date: Sun, 17 Mar 2024 22:00:37 +0200
Message-ID: <20240317200100.152097-1-jeebjp@gmail.com> (raw)
Differences to v8:
1. rebased on top of current master
2. Applied changes based on comments done regarding the AVCodecContext, such
as added details to the docstring as well as renaming the variable to
`encoder_side_data` (ref: https://patchwork.ffmpeg.org/project/ffmpeg/patch/20240229164307.3535613-10-jeebjp@gmail.com/ ).
Comparison URL (mostly configure and wrappers, avutil/frame.c):
https://github.com/jeeb/ffmpeg/compare/avcodec_cll_mdcv_side_data_v8..avcodec_cll_mdcv_side_data_v9
This patch set I've now been working for a while since I felt like it was weird
we couldn't pass through information such as static HDR metadata to encoders
from decoded input. This initial version adds the necessary framework, as well
as adds static HDR metadata support for libsvtav1, libx264 as well as libx265
wrappers.
An alternative to this would be to make encoders only properly initialize when
they receive the first AVFrame, but that seems to be a bigger, nastier change
than introducing an AVFrameSideDataSet in avctx as everything seems to
presume that extradata etc are available after opening the encoder.
Note: Any opinions on whether FFCodec or AVCodec should have
handled_side_data list, so that if format specific generic logic is
added, it could be checked whether the codec itself handles this side
data? This could also be utilized to list handled side data from f.ex.
`ffmpeg -h encoder=libsvtav1`.
Jan
Jan Ekström (14):
avutil/frame: split side data list wiping out to non-AVFrame function
avutil/frame: add helper for freeing arrays of side data
avutil/frame: split side_data_from_buf to base and AVFrame func
avutil/frame: split side data removal out to non-AVFrame function
avutil/frame: add helper for adding side data to array
avutil/frame: add helper for adding existing side data to array
avutil/frame: add helper for adding side data w/ AVBufferRef to array
avutil/frame: add helper for getting side data from array
avcodec: add frame side data array to AVCodecContext
avcodec: add helper for configuring AVCodecContext's frame side data
ffmpeg: pass first video AVFrame's side data to encoder
avcodec/libsvtav1: add support for writing out CLL and MDCV
avcodec/libx264: add support for writing out CLL and MDCV
avcodec/libx265: add support for writing out CLL and MDCV
configure | 2 +
fftools/ffmpeg_enc.c | 10 ++
libavcodec/avcodec.c | 31 ++++++
libavcodec/avcodec.h | 33 ++++++
libavcodec/libsvtav1.c | 69 ++++++++++++
libavcodec/libx264.c | 80 ++++++++++++++
libavcodec/libx265.c | 89 ++++++++++++++++
libavcodec/options.c | 2 +
libavutil/Makefile | 1 +
libavutil/frame.c | 180 ++++++++++++++++++++++++++------
libavutil/frame.h | 88 ++++++++++++++++
libavutil/tests/side_data_set.c | 103 ++++++++++++++++++
tests/fate/enc_external.mak | 15 +++
tests/fate/libavutil.mak | 4 +
tests/ref/fate/libsvtav1-hdr10 | 14 +++
tests/ref/fate/libx264-hdr10 | 15 +++
tests/ref/fate/libx265-hdr10 | 16 +++
tests/ref/fate/side_data_set | 14 +++
18 files changed, 736 insertions(+), 30 deletions(-)
create mode 100644 libavutil/tests/side_data_set.c
create mode 100644 tests/ref/fate/libsvtav1-hdr10
create mode 100644 tests/ref/fate/libx264-hdr10
create mode 100644 tests/ref/fate/libx265-hdr10
create mode 100644 tests/ref/fate/side_data_set
Full diff based on the same base hash for v8->v9:
diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 0ced87b946..3183952172 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -696,20 +696,21 @@ int avcodec_configure_side_data(AVCodecContext *avctx,
if (!sd) {
av_frame_side_data_free(
- &avctx->frame_side_data, &avctx->nb_frame_side_data);
+ &avctx->encoder_side_data, &avctx->nb_encoder_side_data);
return 0;
}
- if (nb_sd > 0 && nb_sd == avctx->nb_frame_side_data &&
- sd == (const AVFrameSideData **)avctx->frame_side_data)
+ if (nb_sd > 0 && nb_sd == avctx->nb_encoder_side_data &&
+ sd == (const AVFrameSideData **)avctx->encoder_side_data)
return AVERROR(EINVAL);
for (int i = 0; i < nb_sd; i++) {
int ret = av_frame_side_data_clone(
- &avctx->frame_side_data, &avctx->nb_frame_side_data, sd[i], flags);
+ &avctx->encoder_side_data, &avctx->nb_encoder_side_data, sd[i],
+ flags);
if (ret < 0) {
av_frame_side_data_free(
- &avctx->frame_side_data, &avctx->nb_frame_side_data);
+ &avctx->encoder_side_data, &avctx->nb_encoder_side_data);
return ret;
}
}
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 46523698ae..01085cc3c8 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2064,12 +2064,16 @@ typedef struct AVCodecContext {
unsigned nb_side_data_prefer_packet;
/**
- * Set containing static side data, such as HDR10 CLL / MDCV structures.
- * - encoding: set by user
+ * Array containing static side data, such as HDR10 CLL / MDCV structures.
+ * Side data entries should be allocated by usage of helpers defined in
+ * libavutil/frame.h.
+ *
+ * - encoding: may be set by user before calling avcodec_open2() for
+ * encoder configuration.
* - decoding: unused
*/
- AVFrameSideData **frame_side_data;
- int nb_frame_side_data;
+ AVFrameSideData **encoder_side_data;
+ int nb_encoder_side_data;
} AVCodecContext;
/**
diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c
index 66fa019aa0..73bfdba3cf 100644
--- a/libavcodec/libsvtav1.c
+++ b/libavcodec/libsvtav1.c
@@ -181,12 +181,13 @@ static void handle_side_data(AVCodecContext *avctx,
{
const AVFrameSideData *cll_sd =
av_frame_side_data_get(
- (const AVFrameSideData **)avctx->frame_side_data,
- avctx->nb_frame_side_data, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+ (const AVFrameSideData **)avctx->encoder_side_data,
+ avctx->nb_encoder_side_data, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
const AVFrameSideData *mdcv_sd =
av_frame_side_data_get(
- (const AVFrameSideData **)avctx->frame_side_data,
- avctx->nb_frame_side_data, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+ (const AVFrameSideData **)avctx->encoder_side_data,
+ avctx->nb_encoder_side_data,
+ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
if (cll_sd) {
const AVContentLightMetadata *cll =
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index afeb285487..2a8d71cd0b 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -907,12 +907,13 @@ static void handle_side_data(AVCodecContext *avctx, x264_param_t *params)
#if CONFIG_LIBX264_HDR10
const AVFrameSideData *cll_sd =
av_frame_side_data_get(
- (const AVFrameSideData **)avctx->frame_side_data,
- avctx->nb_frame_side_data, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+ (const AVFrameSideData **)avctx->encoder_side_data,
+ avctx->nb_encoder_side_data, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
const AVFrameSideData *mdcv_sd =
av_frame_side_data_get(
- (const AVFrameSideData **)avctx->frame_side_data,
- avctx->nb_frame_side_data, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+ (const AVFrameSideData **)avctx->encoder_side_data,
+ avctx->nb_encoder_side_data,
+ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
if (cll_sd) {
const AVContentLightMetadata *cll =
diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c
index b77da1c2f1..0c884fe04d 100644
--- a/libavcodec/libx265.c
+++ b/libavcodec/libx265.c
@@ -231,12 +231,13 @@ static int handle_side_data(AVCodecContext *avctx, const x265_api *api,
{
const AVFrameSideData *cll_sd =
av_frame_side_data_get(
- (const AVFrameSideData **)avctx->frame_side_data,
- avctx->nb_frame_side_data, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+ (const AVFrameSideData **)avctx->encoder_side_data,
+ avctx->nb_encoder_side_data, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
const AVFrameSideData *mdcv_sd =
av_frame_side_data_get(
- (const AVFrameSideData **)avctx->frame_side_data,
- avctx->nb_frame_side_data, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+ (const AVFrameSideData **)avctx->encoder_side_data,
+ avctx->nb_encoder_side_data,
+ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
if (cll_sd) {
const AVContentLightMetadata *cll =
diff --git a/libavcodec/options.c b/libavcodec/options.c
index 29b961411e..dd5c697da3 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -177,7 +177,7 @@ void avcodec_free_context(AVCodecContext **pavctx)
av_freep(&avctx->rc_override);
av_channel_layout_uninit(&avctx->ch_layout);
av_frame_side_data_free(
- &avctx->frame_side_data, &avctx->nb_frame_side_data);
+ &avctx->encoder_side_data, &avctx->nb_encoder_side_data);
av_freep(pavctx);
}
--
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".
next reply other threads:[~2024-03-17 20:01 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-17 20:00 Jan Ekström [this message]
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 01/14] avutil/frame: split side data list wiping out to non-AVFrame function Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 02/14] avutil/frame: add helper for freeing arrays of side data Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 03/14] avutil/frame: split side_data_from_buf to base and AVFrame func Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 04/14] avutil/frame: split side data removal out to non-AVFrame function Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 05/14] avutil/frame: add helper for adding side data to array Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 06/14] avutil/frame: add helper for adding existing " Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 07/14] avutil/frame: add helper for adding side data w/ AVBufferRef " Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 08/14] avutil/frame: add helper for getting side data from array Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 09/14] avcodec: add frame side data array to AVCodecContext Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 10/14] avcodec: add helper for configuring AVCodecContext's frame side data Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 11/14] ffmpeg: pass first video AVFrame's side data to encoder Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 12/14] avcodec/libsvtav1: add support for writing out CLL and MDCV Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 13/14] avcodec/libx264: " Jan Ekström
2024-03-17 20:00 ` [FFmpeg-devel] [PATCH v9 14/14] avcodec/libx265: " Jan Ekström
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=20240317200100.152097-1-jeebjp@gmail.com \
--to=jeebjp@gmail.com \
--cc=ffmpeg-devel@ffmpeg.org \
/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