Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH v7 00/14] encoder AVCodecContext configuration side data
@ 2024-02-29 16:42 Jan Ekström
  2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 01/14] avutil/frame: split side data list wiping out to non-AVFrame function Jan Ekström
                   ` (13 more replies)
  0 siblings, 14 replies; 26+ messages in thread
From: Jan Ekström @ 2024-02-29 16:42 UTC (permalink / raw)
  To: ffmpeg-devel

Differences to v5:
1. rebased on top of current master
2. as requested by James, there is now a function to add new frame side data
   by means of providing a AVBufferRef.

Comparison URL (mostly configure and wrappers, avutil/frame.c):
https://github.com/jeeb/ffmpeg/compare/avcodec_cll_mdcv_side_data_v6..avcodec_cll_mdcv_side_data_v7

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            |  30 ++++++
 libavcodec/avcodec.h            |  28 +++++
 libavcodec/libsvtav1.c          |  68 ++++++++++++
 libavcodec/libx264.c            |  79 ++++++++++++++
 libavcodec/libx265.c            |  88 +++++++++++++++
 libavcodec/options.c            |   2 +
 libavutil/Makefile              |   1 +
 libavutil/frame.c               | 182 ++++++++++++++++++++++++++------
 libavutil/frame.h               |  85 +++++++++++++++
 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, 726 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 v6->v7:

diff --git a/libavutil/frame.c b/libavutil/frame.c
index e7679bf34d..fd4b53f9ff 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -889,36 +889,55 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
     return ret;
 }
 
-int av_frame_side_data_from_sd(AVFrameSideData ***sd, int *nb_sd,
-                               const AVFrameSideData *src,
-                               unsigned int flags)
+AVFrameSideData *av_frame_side_data_from_buf(AVFrameSideData ***sd, int *nb_sd,
+                                             enum AVFrameSideDataType type,
+                                             const AVBufferRef *buf,
+                                             unsigned int flags)
 {
-    if (!sd || !src || !nb_sd || (*nb_sd && !*sd))
-        return AVERROR(EINVAL);
+    if (!sd || !buf || !nb_sd || (*nb_sd && !*sd))
+        return NULL;
+
+    if (flags & AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES)
+        remove_side_data(sd, nb_sd, type);
 
     {
-        AVBufferRef           *buf    = av_buffer_ref(src->buf);
-        AVFrameSideData       *sd_dst = NULL;
+        AVBufferRef     *new_buf = av_buffer_ref(buf);
+        AVFrameSideData *sd_dst  = NULL;
 
         if (flags & AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES)
-            remove_side_data(sd, nb_sd, src->type);
+            remove_side_data(sd, nb_sd, type);
 
-        sd_dst = add_side_data_to_set_from_buf(sd, nb_sd, src->type, buf);
+        sd_dst = add_side_data_to_set_from_buf(sd, nb_sd, type, new_buf);
         if (!sd_dst) {
-            av_buffer_unref(&buf);
-            return AVERROR(ENOMEM);
+            av_buffer_unref(&new_buf);
+            return NULL;
         }
 
-        {
-            int ret = av_dict_copy(&sd_dst->metadata, src->metadata, 0);
-            if (ret < 0) {
-                remove_side_data_by_entry(sd, nb_sd, sd_dst);
-                return ret;
-            }
-        }
+        return sd_dst;
+    }
+}
 
-        return 0;
+int av_frame_side_data_from_sd(AVFrameSideData ***sd, int *nb_sd,
+                               const AVFrameSideData *src,
+                               unsigned int flags)
+{
+    AVFrameSideData *sd_dst = NULL;
+    int ret = AVERROR_BUG;
+    if (!src)
+        return AVERROR(EINVAL);
+
+    sd_dst =
+        av_frame_side_data_from_buf(sd, nb_sd, src->type, src->buf, flags);
+    if (!sd_dst)
+        return AVERROR(ENOMEM);
+
+    ret = av_dict_copy(&sd_dst->metadata, src->metadata, 0);
+    if (ret < 0) {
+        remove_side_data_by_entry(sd, nb_sd, sd_dst);
+        return ret;
     }
+
+    return 0;
 }
 
 const AVFrameSideData *av_frame_side_data_get(const AVFrameSideData **sd,
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 751f7a67d6..01311e68eb 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -1081,6 +1081,26 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
                                         enum AVFrameSideDataType type,
                                         size_t size, unsigned int flags);
 
+/**
+ * Add a new side data entry to a set from an existing AVBufferRef.
+ *
+ * @param sd    pointer to array of side data to which to add another entry.
+ * @param nb_sd pointer to an integer containing the number of entries in
+ *              the array.
+ * @param type  type of the added side data
+ * @param buf   AVBufferRef for which a new reference will be made
+ * @param flags Some combination of AV_FRAME_SIDE_DATA_SET_FLAG_* flags, or 0.
+ *
+ * @return newly added side data on success, NULL on error. In case of
+ *         AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES being set, entries
+ *         of matching AVFrameSideDataType will be removed before the
+ *         addition is attempted.
+ */
+AVFrameSideData *av_frame_side_data_from_buf(AVFrameSideData ***sd, int *nb_sd,
+                                             enum AVFrameSideDataType type,
+                                             const AVBufferRef *buf,
+                                             unsigned int flags);
+
 /**
  * Add a new side data entry to a set based on existing side data, taking
  * a reference towards the contained AVBufferRef.

-- 
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".

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2024-03-05 11:10 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-29 16:42 [FFmpeg-devel] [PATCH v7 00/14] encoder AVCodecContext configuration side data Jan Ekström
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 01/14] avutil/frame: split side data list wiping out to non-AVFrame function Jan Ekström
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 02/14] avutil/frame: add helper for freeing arrays of side data Jan Ekström
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 03/14] avutil/frame: split side_data_from_buf to base and AVFrame func Jan Ekström
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 04/14] avutil/frame: split side data removal out to non-AVFrame function Jan Ekström
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 05/14] avutil/frame: add helper for adding side data to array Jan Ekström
2024-03-01 16:07   ` James Almer
2024-03-01 18:09   ` Anton Khirnov
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 06/14] avutil/frame: add helper for adding existing " Jan Ekström
2024-03-01 18:17   ` Anton Khirnov
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 07/14] avutil/frame: add helper for adding side data w/ AVBufferRef " Jan Ekström
2024-03-01 18:19   ` Anton Khirnov
2024-03-01 20:42     ` James Almer
2024-03-05 11:04       ` Anton Khirnov
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 08/14] avutil/frame: add helper for getting side data from array Jan Ekström
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 09/14] avcodec: add frame side data array to AVCodecContext Jan Ekström
2024-03-01 16:03   ` James Almer
2024-03-01 16:10     ` James Almer
2024-03-01 18:23   ` Anton Khirnov
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 10/14] avcodec: add helper for configuring AVCodecContext's frame side data Jan Ekström
2024-03-01 18:25   ` Anton Khirnov
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 11/14] ffmpeg: pass first video AVFrame's side data to encoder Jan Ekström
2024-03-05 11:10   ` Anton Khirnov
2024-02-29 16:42 ` [FFmpeg-devel] [PATCH v7 12/14] avcodec/libsvtav1: add support for writing out CLL and MDCV Jan Ekström
2024-02-29 16:43 ` [FFmpeg-devel] [PATCH v7 13/14] avcodec/libx264: " Jan Ekström
2024-02-29 16:43 ` [FFmpeg-devel] [PATCH v7 14/14] avcodec/libx265: " Jan Ekström

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