[FFmpeg-devel] [PATCH v3 2/8] avutil/frame: add AV_SIDE_DATA_PROP_{SIZE, COLOR}_DEPENDENT
Niklas Haas
ffmpeg at haasn.xyz
Mon Dec 23 14:48:43 EET 2024
From: Niklas Haas <git at haasn.dev>
Many filters modify certain aspects of frame data, e.g. through resizing
(vf_*scale* family), color volume mapping (vf_lut*, vf_tonemap*), or
possibly others.
When this happens, we should strip all frame side data that will no
longer be correct/relevant after the operation. For example, changing
the image size should invalidate AV_FRAME_DATA_PANSCAN because the crop
window (given in pixels) no longer corresponds to the actual image size.
For another example, tone-mapping filters (e.g. from HDR to SDR) should
strip all of the dynamic HDR related metadata.
Since there are a lot of different side data types that are affected by such
operations, it makes sense to establish this information in a common, easily
accessible way. The existing side data properties enum is a perfect fit for
this.
---
doc/APIchanges | 3 +++
libavutil/frame.c | 26 +++++++++++++-------------
libavutil/frame.h | 14 ++++++++++++++
libavutil/version.h | 2 +-
4 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index 7f5b3ef3d3..f6c4b6797e 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-12-xx - xxxxxxxxxx - lavu 59.52.100 - frame.h
+ Add AV_SIDE_DATA_PROP_SIZE_DEPENDENT and AV_FRAME_DATA_PROP_COLOR_DEPENDENT.
+
2024-12-xx - xxxxxxxxxx - lsws 8.13.100 - swscale.h
Add enum SwsIntent and SwsContext.intent.
diff --git a/libavutil/frame.c b/libavutil/frame.c
index 3020845ef8..1dced3b52b 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -29,36 +29,36 @@
#include "hwcontext.h"
static const AVSideDataDescriptor sd_props[] = {
- [AV_FRAME_DATA_PANSCAN] = { "AVPanScan" },
+ [AV_FRAME_DATA_PANSCAN] = { "AVPanScan", AV_SIDE_DATA_PROP_SIZE_DEPENDENT },
[AV_FRAME_DATA_A53_CC] = { "ATSC A53 Part 4 Closed Captions" },
[AV_FRAME_DATA_MATRIXENCODING] = { "AVMatrixEncoding" },
[AV_FRAME_DATA_DOWNMIX_INFO] = { "Metadata relevant to a downmix procedure" },
[AV_FRAME_DATA_AFD] = { "Active format description" },
- [AV_FRAME_DATA_MOTION_VECTORS] = { "Motion vectors" },
+ [AV_FRAME_DATA_MOTION_VECTORS] = { "Motion vectors", AV_SIDE_DATA_PROP_SIZE_DEPENDENT },
[AV_FRAME_DATA_SKIP_SAMPLES] = { "Skip samples" },
[AV_FRAME_DATA_GOP_TIMECODE] = { "GOP timecode" },
[AV_FRAME_DATA_S12M_TIMECODE] = { "SMPTE 12-1 timecode" },
- [AV_FRAME_DATA_DYNAMIC_HDR_PLUS] = { "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)" },
- [AV_FRAME_DATA_DYNAMIC_HDR_VIVID] = { "HDR Dynamic Metadata CUVA 005.1 2021 (Vivid)" },
- [AV_FRAME_DATA_REGIONS_OF_INTEREST] = { "Regions Of Interest" },
+ [AV_FRAME_DATA_DYNAMIC_HDR_PLUS] = { "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)", AV_SIDE_DATA_PROP_COLOR_DEPENDENT },
+ [AV_FRAME_DATA_DYNAMIC_HDR_VIVID] = { "HDR Dynamic Metadata CUVA 005.1 2021 (Vivid)", AV_SIDE_DATA_PROP_COLOR_DEPENDENT },
+ [AV_FRAME_DATA_REGIONS_OF_INTEREST] = { "Regions Of Interest", AV_SIDE_DATA_PROP_SIZE_DEPENDENT },
[AV_FRAME_DATA_VIDEO_ENC_PARAMS] = { "Video encoding parameters" },
[AV_FRAME_DATA_FILM_GRAIN_PARAMS] = { "Film grain parameters" },
- [AV_FRAME_DATA_DETECTION_BBOXES] = { "Bounding boxes for object detection and classification" },
- [AV_FRAME_DATA_DOVI_RPU_BUFFER] = { "Dolby Vision RPU Data" },
- [AV_FRAME_DATA_DOVI_METADATA] = { "Dolby Vision Metadata" },
+ [AV_FRAME_DATA_DETECTION_BBOXES] = { "Bounding boxes for object detection and classification", AV_SIDE_DATA_PROP_SIZE_DEPENDENT },
+ [AV_FRAME_DATA_DOVI_RPU_BUFFER] = { "Dolby Vision RPU Data", AV_SIDE_DATA_PROP_COLOR_DEPENDENT },
+ [AV_FRAME_DATA_DOVI_METADATA] = { "Dolby Vision Metadata", AV_SIDE_DATA_PROP_COLOR_DEPENDENT },
[AV_FRAME_DATA_LCEVC] = { "LCEVC NAL data" },
[AV_FRAME_DATA_VIEW_ID] = { "View ID" },
[AV_FRAME_DATA_STEREO3D] = { "Stereo 3D", AV_SIDE_DATA_PROP_GLOBAL },
[AV_FRAME_DATA_REPLAYGAIN] = { "AVReplayGain", AV_SIDE_DATA_PROP_GLOBAL },
[AV_FRAME_DATA_DISPLAYMATRIX] = { "3x3 displaymatrix", AV_SIDE_DATA_PROP_GLOBAL },
[AV_FRAME_DATA_AUDIO_SERVICE_TYPE] = { "Audio service type", AV_SIDE_DATA_PROP_GLOBAL },
- [AV_FRAME_DATA_MASTERING_DISPLAY_METADATA] = { "Mastering display metadata", AV_SIDE_DATA_PROP_GLOBAL },
- [AV_FRAME_DATA_CONTENT_LIGHT_LEVEL] = { "Content light level metadata", AV_SIDE_DATA_PROP_GLOBAL },
+ [AV_FRAME_DATA_MASTERING_DISPLAY_METADATA] = { "Mastering display metadata", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_COLOR_DEPENDENT },
+ [AV_FRAME_DATA_CONTENT_LIGHT_LEVEL] = { "Content light level metadata", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_COLOR_DEPENDENT },
[AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT] = { "Ambient viewing environment", AV_SIDE_DATA_PROP_GLOBAL },
- [AV_FRAME_DATA_SPHERICAL] = { "Spherical Mapping", AV_SIDE_DATA_PROP_GLOBAL },
- [AV_FRAME_DATA_ICC_PROFILE] = { "ICC profile", AV_SIDE_DATA_PROP_GLOBAL },
+ [AV_FRAME_DATA_SPHERICAL] = { "Spherical Mapping", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_SIZE_DEPENDENT },
+ [AV_FRAME_DATA_ICC_PROFILE] = { "ICC profile", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_COLOR_DEPENDENT },
[AV_FRAME_DATA_SEI_UNREGISTERED] = { "H.26[45] User Data Unregistered SEI message", AV_SIDE_DATA_PROP_MULTI },
- [AV_FRAME_DATA_VIDEO_HINT] = { "Encoding video hint" },
+ [AV_FRAME_DATA_VIDEO_HINT] = { "Encoding video hint", AV_SIDE_DATA_PROP_SIZE_DEPENDENT },
};
static void get_frame_defaults(AVFrame *frame)
diff --git a/libavutil/frame.h b/libavutil/frame.h
index c107f43bc0..8345010e22 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -283,6 +283,20 @@ enum AVSideDataProps {
* a single side data array.
*/
AV_SIDE_DATA_PROP_MULTI = (1 << 1),
+
+ /**
+ * Side data depends on the video dimensions. Side data with this property
+ * loses its meaning when rescaling or cropping the image, unless
+ * either recomputed or adjusted to the new resolution.
+ */
+ AV_SIDE_DATA_PROP_SIZE_DEPENDENT = (1 << 2),
+
+ /**
+ * Side data depends on the video color space. Side data with this property
+ * loses its meaning when changing the video color encoding, e.g. by
+ * adapting to a different set of primaries or transfer characteristics.
+ */
+ AV_SIDE_DATA_PROP_COLOR_DEPENDENT = (1 << 3),
};
/**
diff --git a/libavutil/version.h b/libavutil/version.h
index e515a95378..0eb07e5e3d 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 59
-#define LIBAVUTIL_VERSION_MINOR 51
+#define LIBAVUTIL_VERSION_MINOR 52
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
--
2.47.0
More information about the ffmpeg-devel
mailing list