ffmpeg_the_third/util/frame/
side_data.rs

1use 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}