[FFmpeg-devel] [PATCH] avutil/frame: use bitfields for some boolean and enum fields
James Almer
jamrial at gmail.com
Mon Apr 17 17:39:30 EEST 2023
Should reduce the size of AVFrame in the next major bump without changing the API.
Suggested-by: Anton Khirnov <anton at khirnov.net>
Signed-off-by: James Almer <jamrial at gmail.com>
---
This supersedes "avutil/frame: add new interlaced and top_field_first flags"
and "avutil/frame: add a keyframe flag to AVFrame".
libavutil/frame.h | 56 +++++++++++++++++++++++++++++++++++++++++++++
libavutil/version.h | 1 +
2 files changed, 57 insertions(+)
diff --git a/libavutil/frame.h b/libavutil/frame.h
index f85d630c5c..c26067f383 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -416,6 +416,7 @@ typedef struct AVFrame {
*/
int format;
+#if FF_API_BITFIELDS
/**
* 1 -> keyframe, 0-> not
*/
@@ -425,6 +426,57 @@ typedef struct AVFrame {
* Picture type of the frame.
*/
enum AVPictureType pict_type;
+#else
+ /**
+ * 1 -> keyframe, 0-> not
+ */
+ unsigned int key_frame: 1;
+
+ /**
+ * The content of the picture is interlaced.
+ */
+ unsigned int interlaced_frame: 1;
+
+ /**
+ * If the content is interlaced, is top field displayed first.
+ */
+ unsigned int top_field_first: 1;
+
+ /**
+ * Tell user application that palette has changed from previous frame.
+ */
+ unsigned int palette_has_changed: 1;
+
+ /**
+ * Reserved. Must not be touched.
+ */
+ unsigned int reserved_bitfield: (sizeof(unsigned int) * 8) - 9;
+
+ /**
+ * MPEG vs JPEG YUV range.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorRange color_range: 2;
+
+ enum AVChromaLocation chroma_location: 3;
+
+ /**
+ * Picture type of the frame.
+ */
+ enum AVPictureType pict_type: 8;
+
+ enum AVColorPrimaries color_primaries: 8;
+
+ enum AVColorTransferCharacteristic color_trc: 8;
+
+ /**
+ * YUV colorspace type.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorSpace colorspace: 8;
+#endif
/**
* Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
@@ -491,6 +543,7 @@ typedef struct AVFrame {
*/
int repeat_pict;
+#if FF_API_BITFIELDS
/**
* The content of the picture is interlaced.
*/
@@ -505,6 +558,7 @@ typedef struct AVFrame {
* Tell user application that palette has changed from previous frame.
*/
int palette_has_changed;
+#endif
#if FF_API_REORDERED_OPAQUE
/**
@@ -595,6 +649,7 @@ typedef struct AVFrame {
*/
int flags;
+#if FF_API_BITFIELDS
/**
* MPEG vs JPEG YUV range.
* - encoding: Set by user
@@ -614,6 +669,7 @@ typedef struct AVFrame {
enum AVColorSpace colorspace;
enum AVChromaLocation chroma_location;
+#endif
/**
* frame timestamp estimated using various heuristics, in stream time base
diff --git a/libavutil/version.h b/libavutil/version.h
index 40f92af055..23cad31b46 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -115,6 +115,7 @@
#define FF_API_FRAME_PICTURE_NUMBER (LIBAVUTIL_VERSION_MAJOR < 59)
#define FF_API_HDR_VIVID_THREE_SPLINE (LIBAVUTIL_VERSION_MAJOR < 59)
#define FF_API_FRAME_PKT (LIBAVUTIL_VERSION_MAJOR < 59)
+#define FF_API_BITFIELDS (LIBAVUTIL_VERSION_MAJOR < 59)
/**
* @}
--
2.40.0
More information about the ffmpeg-devel
mailing list