ffmpeg_the_third/util/frame/
side_data.rs1use std::marker::PhantomData;
2use std::slice;
3
4use super::Frame;
5use crate::ffi::AVFrameSideDataType::*;
6use crate::ffi::*;
7use crate::utils;
8use crate::DictionaryRef;
9#[cfg(feature = "serialize")]
10use serde::{Deserialize, Serialize};
11
12#[derive(Eq, PartialEq, Copy, Clone, Debug)]
13#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
14pub enum Type {
15 PanScan,
16 A53CC,
17 Stereo3D,
18 MatrixEncoding,
19 DownMixInfo,
20 ReplayGain,
21 DisplayMatrix,
22 AFD,
23 MotionVectors,
24 SkipSamples,
25 AudioServiceType,
26 MasteringDisplayMetadata,
27 GOPTimecode,
28 Spherical,
29
30 ContentLightLevel,
31 IccProfile,
32
33 #[cfg(not(feature = "ffmpeg_5_0"))]
34 QPTableProperties,
35 #[cfg(not(feature = "ffmpeg_5_0"))]
36 QPTableData,
37
38 S12M_TIMECODE,
39
40 DYNAMIC_HDR_PLUS,
41 REGIONS_OF_INTEREST,
42
43 #[cfg(feature = "ffmpeg_4_3")]
44 VIDEO_ENC_PARAMS,
45
46 #[cfg(feature = "ffmpeg_4_4")]
47 SEI_UNREGISTERED,
48 #[cfg(feature = "ffmpeg_4_4")]
49 FILM_GRAIN_PARAMS,
50
51 #[cfg(feature = "ffmpeg_5_0")]
52 DETECTION_BBOXES,
53 #[cfg(feature = "ffmpeg_5_0")]
54 DOVI_RPU_BUFFER,
55 #[cfg(feature = "ffmpeg_5_0")]
56 DOVI_METADATA,
57
58 #[cfg(feature = "ffmpeg_5_1")]
59 DYNAMIC_HDR_VIVID,
60
61 #[cfg(feature = "ffmpeg_6_0")]
62 AMBIENT_VIEWING_ENVIRONMENT,
63
64 #[cfg(feature = "ffmpeg_6_1")]
65 VIDEO_HINT,
66
67 #[cfg(feature = "ffmpeg_7_1")]
68 LCEVC,
69 #[cfg(feature = "ffmpeg_7_1")]
70 ViewId,
71
72 #[cfg(feature = "ffmpeg_8_0")]
73 _3DReferenceDisplays,
74}
75
76impl Type {
77 #[inline]
78 pub fn name(&self) -> &'static str {
79 unsafe { utils::str_from_c_ptr(av_frame_side_data_name((*self).into())) }
80 }
81}
82
83impl From<AVFrameSideDataType> for Type {
84 #[inline(always)]
85 fn from(value: AVFrameSideDataType) -> Self {
86 match value {
87 AV_FRAME_DATA_PANSCAN => Type::PanScan,
88 AV_FRAME_DATA_A53_CC => Type::A53CC,
89 AV_FRAME_DATA_STEREO3D => Type::Stereo3D,
90 AV_FRAME_DATA_MATRIXENCODING => Type::MatrixEncoding,
91 AV_FRAME_DATA_DOWNMIX_INFO => Type::DownMixInfo,
92 AV_FRAME_DATA_REPLAYGAIN => Type::ReplayGain,
93 AV_FRAME_DATA_DISPLAYMATRIX => Type::DisplayMatrix,
94 AV_FRAME_DATA_AFD => Type::AFD,
95 AV_FRAME_DATA_MOTION_VECTORS => Type::MotionVectors,
96 AV_FRAME_DATA_SKIP_SAMPLES => Type::SkipSamples,
97 AV_FRAME_DATA_AUDIO_SERVICE_TYPE => Type::AudioServiceType,
98 AV_FRAME_DATA_MASTERING_DISPLAY_METADATA => Type::MasteringDisplayMetadata,
99 AV_FRAME_DATA_GOP_TIMECODE => Type::GOPTimecode,
100 AV_FRAME_DATA_SPHERICAL => Type::Spherical,
101
102 AV_FRAME_DATA_CONTENT_LIGHT_LEVEL => Type::ContentLightLevel,
103 AV_FRAME_DATA_ICC_PROFILE => Type::IccProfile,
104
105 #[cfg(not(feature = "ffmpeg_5_0"))]
106 AV_FRAME_DATA_QP_TABLE_PROPERTIES => Type::QPTableProperties,
107 #[cfg(not(feature = "ffmpeg_5_0"))]
108 AV_FRAME_DATA_QP_TABLE_DATA => Type::QPTableData,
109 AV_FRAME_DATA_S12M_TIMECODE => Type::S12M_TIMECODE,
110
111 AV_FRAME_DATA_DYNAMIC_HDR_PLUS => Type::DYNAMIC_HDR_PLUS,
112 AV_FRAME_DATA_REGIONS_OF_INTEREST => Type::REGIONS_OF_INTEREST,
113
114 #[cfg(feature = "ffmpeg_4_3")]
115 AV_FRAME_DATA_VIDEO_ENC_PARAMS => Type::VIDEO_ENC_PARAMS,
116
117 #[cfg(feature = "ffmpeg_4_4")]
118 AV_FRAME_DATA_SEI_UNREGISTERED => Type::SEI_UNREGISTERED,
119 #[cfg(feature = "ffmpeg_4_4")]
120 AV_FRAME_DATA_FILM_GRAIN_PARAMS => Type::FILM_GRAIN_PARAMS,
121
122 #[cfg(feature = "ffmpeg_5_0")]
123 AV_FRAME_DATA_DETECTION_BBOXES => Type::DETECTION_BBOXES,
124 #[cfg(feature = "ffmpeg_5_0")]
125 AV_FRAME_DATA_DOVI_RPU_BUFFER => Type::DOVI_RPU_BUFFER,
126 #[cfg(feature = "ffmpeg_5_0")]
127 AV_FRAME_DATA_DOVI_METADATA => Type::DOVI_METADATA,
128
129 #[cfg(feature = "ffmpeg_5_1")]
130 AV_FRAME_DATA_DYNAMIC_HDR_VIVID => Type::DYNAMIC_HDR_VIVID,
131
132 #[cfg(feature = "ffmpeg_6_0")]
133 AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT => Type::AMBIENT_VIEWING_ENVIRONMENT,
134
135 #[cfg(feature = "ffmpeg_6_1")]
136 AV_FRAME_DATA_VIDEO_HINT => Type::VIDEO_HINT,
137
138 #[cfg(feature = "ffmpeg_7_1")]
139 AV_FRAME_DATA_LCEVC => Type::LCEVC,
140 #[cfg(feature = "ffmpeg_7_1")]
141 AV_FRAME_DATA_VIEW_ID => Type::ViewId,
142
143 #[cfg(feature = "ffmpeg_8_0")]
144 AV_FRAME_DATA_3D_REFERENCE_DISPLAYS => Type::_3DReferenceDisplays,
145
146 #[cfg(feature = "non-exhaustive-enums")]
147 _ => unimplemented!(),
148 }
149 }
150}
151
152impl From<Type> for AVFrameSideDataType {
153 #[inline(always)]
154 fn from(value: Type) -> AVFrameSideDataType {
155 match value {
156 Type::PanScan => AV_FRAME_DATA_PANSCAN,
157 Type::A53CC => AV_FRAME_DATA_A53_CC,
158 Type::Stereo3D => AV_FRAME_DATA_STEREO3D,
159 Type::MatrixEncoding => AV_FRAME_DATA_MATRIXENCODING,
160 Type::DownMixInfo => AV_FRAME_DATA_DOWNMIX_INFO,
161 Type::ReplayGain => AV_FRAME_DATA_REPLAYGAIN,
162 Type::DisplayMatrix => AV_FRAME_DATA_DISPLAYMATRIX,
163 Type::AFD => AV_FRAME_DATA_AFD,
164 Type::MotionVectors => AV_FRAME_DATA_MOTION_VECTORS,
165 Type::SkipSamples => AV_FRAME_DATA_SKIP_SAMPLES,
166 Type::AudioServiceType => AV_FRAME_DATA_AUDIO_SERVICE_TYPE,
167 Type::MasteringDisplayMetadata => AV_FRAME_DATA_MASTERING_DISPLAY_METADATA,
168 Type::GOPTimecode => AV_FRAME_DATA_GOP_TIMECODE,
169 Type::Spherical => AV_FRAME_DATA_SPHERICAL,
170
171 Type::ContentLightLevel => AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
172 Type::IccProfile => AV_FRAME_DATA_ICC_PROFILE,
173
174 #[cfg(not(feature = "ffmpeg_5_0"))]
175 Type::QPTableProperties => AV_FRAME_DATA_QP_TABLE_PROPERTIES,
176 #[cfg(not(feature = "ffmpeg_5_0"))]
177 Type::QPTableData => AV_FRAME_DATA_QP_TABLE_DATA,
178 Type::S12M_TIMECODE => AV_FRAME_DATA_S12M_TIMECODE,
179
180 Type::DYNAMIC_HDR_PLUS => AV_FRAME_DATA_DYNAMIC_HDR_PLUS,
181 Type::REGIONS_OF_INTEREST => AV_FRAME_DATA_REGIONS_OF_INTEREST,
182
183 #[cfg(feature = "ffmpeg_4_3")]
184 Type::VIDEO_ENC_PARAMS => AV_FRAME_DATA_VIDEO_ENC_PARAMS,
185
186 #[cfg(feature = "ffmpeg_4_4")]
187 Type::SEI_UNREGISTERED => AV_FRAME_DATA_SEI_UNREGISTERED,
188 #[cfg(feature = "ffmpeg_4_4")]
189 Type::FILM_GRAIN_PARAMS => AV_FRAME_DATA_FILM_GRAIN_PARAMS,
190
191 #[cfg(feature = "ffmpeg_5_0")]
192 Type::DETECTION_BBOXES => AV_FRAME_DATA_DETECTION_BBOXES,
193 #[cfg(feature = "ffmpeg_5_0")]
194 Type::DOVI_RPU_BUFFER => AV_FRAME_DATA_DOVI_RPU_BUFFER,
195 #[cfg(feature = "ffmpeg_5_0")]
196 Type::DOVI_METADATA => AV_FRAME_DATA_DOVI_METADATA,
197
198 #[cfg(feature = "ffmpeg_5_1")]
199 Type::DYNAMIC_HDR_VIVID => AV_FRAME_DATA_DYNAMIC_HDR_VIVID,
200
201 #[cfg(feature = "ffmpeg_6_0")]
202 Type::AMBIENT_VIEWING_ENVIRONMENT => AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT,
203
204 #[cfg(feature = "ffmpeg_6_1")]
205 Type::VIDEO_HINT => AV_FRAME_DATA_VIDEO_HINT,
206
207 #[cfg(feature = "ffmpeg_7_1")]
208 Type::LCEVC => AV_FRAME_DATA_LCEVC,
209 #[cfg(feature = "ffmpeg_7_1")]
210 Type::ViewId => AV_FRAME_DATA_VIEW_ID,
211
212 #[cfg(feature = "ffmpeg_8_0")]
213 Type::_3DReferenceDisplays => AV_FRAME_DATA_3D_REFERENCE_DISPLAYS,
214 }
215 }
216}
217
218pub struct SideData<'a> {
219 ptr: *mut AVFrameSideData,
220
221 _marker: PhantomData<&'a Frame>,
222}
223
224impl<'a> SideData<'a> {
225 #[inline(always)]
226 pub unsafe fn wrap(ptr: *mut AVFrameSideData) -> Self {
227 SideData {
228 ptr,
229 _marker: PhantomData,
230 }
231 }
232
233 #[inline(always)]
234 pub unsafe fn as_ptr(&self) -> *const AVFrameSideData {
235 self.ptr as *const _
236 }
237
238 #[inline(always)]
239 pub unsafe fn as_mut_ptr(&mut self) -> *mut AVFrameSideData {
240 self.ptr
241 }
242}
243
244impl<'a> SideData<'a> {
245 #[inline]
246 pub fn kind(&self) -> Type {
247 unsafe { Type::from((*self.as_ptr()).type_) }
248 }
249
250 #[inline]
251 pub fn data(&self) -> &[u8] {
252 unsafe { slice::from_raw_parts((*self.as_ptr()).data, (*self.as_ptr()).size as usize) }
253 }
254
255 #[inline]
256 pub fn metadata(&self) -> DictionaryRef<'_> {
257 unsafe { DictionaryRef::wrap((*self.as_ptr()).metadata) }
258 }
259}