Skip to main content

ffmpeg_the_third/codec/packet/
side_data.rs

1use std::marker::PhantomData;
2use std::slice;
3
4use super::Packet;
5use crate::ffi::*;
6#[cfg(feature = "serialize")]
7use serde::{Deserialize, Serialize};
8
9#[derive(Eq, PartialEq, Copy, Clone, Debug)]
10#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
11pub enum Type {
12    Palette,
13    NewExtraData,
14    ParamChange,
15    H263MbInfo,
16    ReplayGain,
17    DisplayMatrix,
18    Stereo3d,
19    AudioServiceType,
20    QualityStats,
21    FallbackTrack,
22    CBPProperties,
23    SkipSamples,
24    JpDualMono,
25    StringsMetadata,
26    SubtitlePosition,
27    MatroskaBlockAdditional,
28    WebVTTIdentifier,
29    WebVTTSettings,
30    MetadataUpdate,
31    MPEGTSStreamID,
32    MasteringDisplayMetadata,
33    DataSpherical,
34    DataNb,
35
36    ContentLightLevel,
37    A53CC,
38
39    EncryptionInitInfo,
40    EncryptionInfo,
41
42    AFD,
43
44    PRFT,
45    ICC_PROFILE,
46    DOVI_CONF,
47
48    S12M_TIMECODE,
49
50    DYNAMIC_HDR10_PLUS,
51
52    #[cfg(feature = "ffmpeg_7_0")]
53    IAMF_MIX_GAIN_PARAM,
54    #[cfg(feature = "ffmpeg_7_0")]
55    IAMF_DEMIXING_INFO_PARAM,
56    #[cfg(feature = "ffmpeg_7_0")]
57    IAMF_RECON_GAIN_INFO_PARAM,
58    #[cfg(feature = "ffmpeg_7_0")]
59    AMBIENT_VIEWING_ENVIRONMENT,
60
61    #[cfg(feature = "ffmpeg_7_1")]
62    FrameCropping,
63    #[cfg(feature = "ffmpeg_7_1")]
64    LCEVC,
65
66    #[cfg(feature = "ffmpeg_8_0")]
67    _3DReferenceDisplays,
68    #[cfg(feature = "ffmpeg_8_0")]
69    RTCP_SR,
70
71    #[cfg(feature = "ffmpeg_8_1")]
72    EXIF,
73
74    #[cfg(feature = "ffmpeg_9_0")]
75    DYNAMIC_HDR_SMPTE_2094_APP5,
76    #[cfg(feature = "ffmpeg_9_0")]
77    HEVC_CONF,
78}
79
80impl From<AVPacketSideDataType> for Type {
81    fn from(value: AVPacketSideDataType) -> Self {
82        use AVPacketSideDataType as AV;
83
84        match value {
85            AV::PALETTE => Type::Palette,
86            AV::NEW_EXTRADATA => Type::NewExtraData,
87            AV::PARAM_CHANGE => Type::ParamChange,
88            AV::H263_MB_INFO => Type::H263MbInfo,
89            AV::REPLAYGAIN => Type::ReplayGain,
90            AV::DISPLAYMATRIX => Type::DisplayMatrix,
91            AV::STEREO3D => Type::Stereo3d,
92            AV::AUDIO_SERVICE_TYPE => Type::AudioServiceType,
93            AV::QUALITY_STATS => Type::QualityStats,
94            AV::FALLBACK_TRACK => Type::FallbackTrack,
95            AV::CPB_PROPERTIES => Type::CBPProperties,
96            AV::SKIP_SAMPLES => Type::SkipSamples,
97            AV::JP_DUALMONO => Type::JpDualMono,
98            AV::STRINGS_METADATA => Type::StringsMetadata,
99            AV::SUBTITLE_POSITION => Type::SubtitlePosition,
100            AV::MATROSKA_BLOCKADDITIONAL => Type::MatroskaBlockAdditional,
101            AV::WEBVTT_IDENTIFIER => Type::WebVTTIdentifier,
102            AV::WEBVTT_SETTINGS => Type::WebVTTSettings,
103            AV::METADATA_UPDATE => Type::MetadataUpdate,
104            AV::MPEGTS_STREAM_ID => Type::MPEGTSStreamID,
105            AV::MASTERING_DISPLAY_METADATA => Type::MasteringDisplayMetadata,
106            AV::SPHERICAL => Type::DataSpherical,
107            AV::NB => Type::DataNb,
108
109            AV::CONTENT_LIGHT_LEVEL => Type::ContentLightLevel,
110            AV::A53_CC => Type::A53CC,
111
112            AV::ENCRYPTION_INIT_INFO => Type::EncryptionInitInfo,
113            AV::ENCRYPTION_INFO => Type::EncryptionInfo,
114
115            AV::AFD => Type::AFD,
116
117            AV::PRFT => Type::PRFT,
118            AV::ICC_PROFILE => Type::ICC_PROFILE,
119            AV::DOVI_CONF => Type::DOVI_CONF,
120
121            AV::S12M_TIMECODE => Type::S12M_TIMECODE,
122
123            AV::DYNAMIC_HDR10_PLUS => Type::DYNAMIC_HDR10_PLUS,
124
125            #[cfg(feature = "ffmpeg_7_0")]
126            AV::IAMF_MIX_GAIN_PARAM => Type::IAMF_MIX_GAIN_PARAM,
127            #[cfg(feature = "ffmpeg_7_0")]
128            AV::IAMF_DEMIXING_INFO_PARAM => Type::IAMF_DEMIXING_INFO_PARAM,
129            #[cfg(feature = "ffmpeg_7_0")]
130            AV::IAMF_RECON_GAIN_INFO_PARAM => Type::IAMF_RECON_GAIN_INFO_PARAM,
131            #[cfg(feature = "ffmpeg_7_0")]
132            AV::AMBIENT_VIEWING_ENVIRONMENT => Type::AMBIENT_VIEWING_ENVIRONMENT,
133
134            #[cfg(feature = "ffmpeg_7_1")]
135            AV::FRAME_CROPPING => Type::FrameCropping,
136            #[cfg(feature = "ffmpeg_7_1")]
137            AV::LCEVC => Type::LCEVC,
138
139            #[cfg(feature = "ffmpeg_8_0")]
140            AV::_3D_REFERENCE_DISPLAYS => Type::_3DReferenceDisplays,
141            #[cfg(feature = "ffmpeg_8_0")]
142            AV::RTCP_SR => Type::RTCP_SR,
143
144            #[cfg(feature = "ffmpeg_8_1")]
145            AV::EXIF => Type::EXIF,
146
147            #[cfg(feature = "ffmpeg_9_0")]
148            AV::DYNAMIC_HDR_SMPTE_2094_APP5 => Type::DYNAMIC_HDR_SMPTE_2094_APP5,
149            #[cfg(feature = "ffmpeg_9_0")]
150            AV::HEVC_CONF => Type::HEVC_CONF,
151
152            _ => unimplemented!(),
153        }
154    }
155}
156
157impl From<Type> for AVPacketSideDataType {
158    fn from(value: Type) -> AVPacketSideDataType {
159        use AVPacketSideDataType as AV;
160
161        match value {
162            Type::Palette => AV::PALETTE,
163            Type::NewExtraData => AV::NEW_EXTRADATA,
164            Type::ParamChange => AV::PARAM_CHANGE,
165            Type::H263MbInfo => AV::H263_MB_INFO,
166            Type::ReplayGain => AV::REPLAYGAIN,
167            Type::DisplayMatrix => AV::DISPLAYMATRIX,
168            Type::Stereo3d => AV::STEREO3D,
169            Type::AudioServiceType => AV::AUDIO_SERVICE_TYPE,
170            Type::QualityStats => AV::QUALITY_STATS,
171            Type::FallbackTrack => AV::FALLBACK_TRACK,
172            Type::CBPProperties => AV::CPB_PROPERTIES,
173            Type::SkipSamples => AV::SKIP_SAMPLES,
174            Type::JpDualMono => AV::JP_DUALMONO,
175            Type::StringsMetadata => AV::STRINGS_METADATA,
176            Type::SubtitlePosition => AV::SUBTITLE_POSITION,
177            Type::MatroskaBlockAdditional => AV::MATROSKA_BLOCKADDITIONAL,
178            Type::WebVTTIdentifier => AV::WEBVTT_IDENTIFIER,
179            Type::WebVTTSettings => AV::WEBVTT_SETTINGS,
180            Type::MetadataUpdate => AV::METADATA_UPDATE,
181            Type::MPEGTSStreamID => AV::MPEGTS_STREAM_ID,
182            Type::MasteringDisplayMetadata => AV::MASTERING_DISPLAY_METADATA,
183            Type::DataSpherical => AV::SPHERICAL,
184            Type::DataNb => AV::NB,
185
186            Type::ContentLightLevel => AV::CONTENT_LIGHT_LEVEL,
187            Type::A53CC => AV::A53_CC,
188
189            Type::EncryptionInitInfo => AV::ENCRYPTION_INIT_INFO,
190            Type::EncryptionInfo => AV::ENCRYPTION_INFO,
191
192            Type::AFD => AV::AFD,
193
194            Type::PRFT => AV::PRFT,
195            Type::ICC_PROFILE => AV::ICC_PROFILE,
196            Type::DOVI_CONF => AV::DOVI_CONF,
197
198            Type::S12M_TIMECODE => AV::S12M_TIMECODE,
199
200            Type::DYNAMIC_HDR10_PLUS => AV::DYNAMIC_HDR10_PLUS,
201
202            #[cfg(feature = "ffmpeg_7_0")]
203            Type::IAMF_MIX_GAIN_PARAM => AV::IAMF_MIX_GAIN_PARAM,
204            #[cfg(feature = "ffmpeg_7_0")]
205            Type::IAMF_DEMIXING_INFO_PARAM => AV::IAMF_DEMIXING_INFO_PARAM,
206            #[cfg(feature = "ffmpeg_7_0")]
207            Type::IAMF_RECON_GAIN_INFO_PARAM => AV::IAMF_RECON_GAIN_INFO_PARAM,
208            #[cfg(feature = "ffmpeg_7_0")]
209            Type::AMBIENT_VIEWING_ENVIRONMENT => AV::AMBIENT_VIEWING_ENVIRONMENT,
210
211            #[cfg(feature = "ffmpeg_7_1")]
212            Type::FrameCropping => AV::FRAME_CROPPING,
213            #[cfg(feature = "ffmpeg_7_1")]
214            Type::LCEVC => AV::LCEVC,
215
216            #[cfg(feature = "ffmpeg_8_0")]
217            Type::_3DReferenceDisplays => AV::_3D_REFERENCE_DISPLAYS,
218            #[cfg(feature = "ffmpeg_8_0")]
219            Type::RTCP_SR => AV::RTCP_SR,
220
221            #[cfg(feature = "ffmpeg_8_1")]
222            Type::EXIF => AV::EXIF,
223
224            #[cfg(feature = "ffmpeg_9_0")]
225            Type::DYNAMIC_HDR_SMPTE_2094_APP5 => AV::DYNAMIC_HDR_SMPTE_2094_APP5,
226            #[cfg(feature = "ffmpeg_9_0")]
227            Type::HEVC_CONF => AV::HEVC_CONF,
228        }
229    }
230}
231
232pub struct SideData<'a> {
233    ptr: *mut AVPacketSideData,
234
235    _marker: PhantomData<&'a Packet>,
236}
237
238impl<'a> SideData<'a> {
239    pub unsafe fn wrap(ptr: *mut AVPacketSideData) -> Self {
240        SideData {
241            ptr,
242            _marker: PhantomData,
243        }
244    }
245
246    pub unsafe fn as_ptr(&self) -> *const AVPacketSideData {
247        self.ptr as *const _
248    }
249}
250
251impl<'a> SideData<'a> {
252    pub fn kind(&self) -> Type {
253        unsafe { Type::from((*self.as_ptr()).type_) }
254    }
255
256    pub fn data(&self) -> &[u8] {
257        unsafe { slice::from_raw_parts((*self.as_ptr()).data, (*self.as_ptr()).size as usize) }
258    }
259}
260
261#[cfg(all(test, feature = "ffmpeg_9_0"))]
262mod tests {
263    use super::*;
264
265    #[test]
266    fn ffmpeg_9_side_data_round_trips() {
267        for kind in [Type::DYNAMIC_HDR_SMPTE_2094_APP5, Type::HEVC_CONF] {
268            let raw: AVPacketSideDataType = kind.into();
269            assert_eq!(Type::from(raw), kind);
270        }
271    }
272}