Skip to main content

ffmpeg_next/codec/packet/
side_data.rs

1use std::marker::PhantomData;
2use std::slice;
3
4use super::Packet;
5use crate::ffi::AVPacketSideDataType::*;
6use crate::ffi::*;
7
8#[derive(Eq, PartialEq, Copy, Clone, Debug)]
9pub enum Type {
10    Palette,
11    NewExtraData,
12    ParamChange,
13    H263MbInfo,
14    ReplayGain,
15    DisplayMatrix,
16    Stereo3d,
17    AudioServiceType,
18    QualityStats,
19    FallbackTrack,
20    CBPProperties,
21    SkipSamples,
22    JpDualMono,
23    StringsMetadata,
24    SubtitlePosition,
25    MatroskaBlockAdditional,
26    WebVTTIdentifier,
27    WebVTTSettings,
28    MetadataUpdate,
29    MPEGTSStreamID,
30    MasteringDisplayMetadata,
31    DataSpherical,
32    DataNb,
33
34    ContentLightLevel,
35    A53CC,
36
37    #[cfg(feature = "ffmpeg_4_0")]
38    EncryptionInitInfo,
39    #[cfg(feature = "ffmpeg_4_0")]
40    EncryptionInfo,
41
42    #[cfg(feature = "ffmpeg_4_1")]
43    AFD,
44
45    #[cfg(feature = "ffmpeg_4_3")]
46    PRFT,
47    #[cfg(feature = "ffmpeg_4_3")]
48    ICC_PROFILE,
49    #[cfg(feature = "ffmpeg_4_3")]
50    DOVI_CONF,
51
52    #[cfg(feature = "ffmpeg_4_4")]
53    S12M_TIMECODE,
54
55    #[cfg(feature = "ffmpeg_5_0")]
56    DYNAMIC_HDR10_PLUS,
57
58    #[cfg(feature = "ffmpeg_7_0")]
59    IAMF_MIX_GAIN_PARAM,
60    #[cfg(feature = "ffmpeg_7_0")]
61    IAMF_DEMIXING_INFO_PARAM,
62    #[cfg(feature = "ffmpeg_7_0")]
63    IAMF_RECON_GAIN_INFO_PARAM,
64    #[cfg(feature = "ffmpeg_7_0")]
65    AMBIENT_VIEWING_ENVIRONMENT,
66
67    #[cfg(feature = "ffmpeg_7_1")]
68    FRAME_CROPPING,
69    #[cfg(feature = "ffmpeg_7_1")]
70    LCEVC,
71
72    #[cfg(feature = "ffmpeg_8_0")]
73    THREE_D_REFERENCE_DISPLAYS,
74    #[cfg(feature = "ffmpeg_8_0")]
75    RTCP_SR,
76
77    #[cfg(feature = "ffmpeg_8_1")]
78    EXIF,
79
80    #[cfg(feature = "ffmpeg_9_0")]
81    DYNAMIC_HDR_SMPTE_2094_APP5,
82    #[cfg(feature = "ffmpeg_9_0")]
83    HEVC_CONF,
84}
85
86impl From<AVPacketSideDataType> for Type {
87    fn from(value: AVPacketSideDataType) -> Self {
88        match value {
89            AV_PKT_DATA_PALETTE => Type::Palette,
90            AV_PKT_DATA_NEW_EXTRADATA => Type::NewExtraData,
91            AV_PKT_DATA_PARAM_CHANGE => Type::ParamChange,
92            AV_PKT_DATA_H263_MB_INFO => Type::H263MbInfo,
93            AV_PKT_DATA_REPLAYGAIN => Type::ReplayGain,
94            AV_PKT_DATA_DISPLAYMATRIX => Type::DisplayMatrix,
95            AV_PKT_DATA_STEREO3D => Type::Stereo3d,
96            AV_PKT_DATA_AUDIO_SERVICE_TYPE => Type::AudioServiceType,
97            AV_PKT_DATA_QUALITY_STATS => Type::QualityStats,
98            AV_PKT_DATA_FALLBACK_TRACK => Type::FallbackTrack,
99            AV_PKT_DATA_CPB_PROPERTIES => Type::CBPProperties,
100            AV_PKT_DATA_SKIP_SAMPLES => Type::SkipSamples,
101            AV_PKT_DATA_JP_DUALMONO => Type::JpDualMono,
102            AV_PKT_DATA_STRINGS_METADATA => Type::StringsMetadata,
103            AV_PKT_DATA_SUBTITLE_POSITION => Type::SubtitlePosition,
104            AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL => Type::MatroskaBlockAdditional,
105            AV_PKT_DATA_WEBVTT_IDENTIFIER => Type::WebVTTIdentifier,
106            AV_PKT_DATA_WEBVTT_SETTINGS => Type::WebVTTSettings,
107            AV_PKT_DATA_METADATA_UPDATE => Type::MetadataUpdate,
108            AV_PKT_DATA_MPEGTS_STREAM_ID => Type::MPEGTSStreamID,
109            AV_PKT_DATA_MASTERING_DISPLAY_METADATA => Type::MasteringDisplayMetadata,
110            AV_PKT_DATA_SPHERICAL => Type::DataSpherical,
111            AV_PKT_DATA_NB => Type::DataNb,
112
113            AV_PKT_DATA_CONTENT_LIGHT_LEVEL => Type::ContentLightLevel,
114            AV_PKT_DATA_A53_CC => Type::A53CC,
115
116            #[cfg(feature = "ffmpeg_4_0")]
117            AV_PKT_DATA_ENCRYPTION_INIT_INFO => Type::EncryptionInitInfo,
118            #[cfg(feature = "ffmpeg_4_0")]
119            AV_PKT_DATA_ENCRYPTION_INFO => Type::EncryptionInfo,
120
121            #[cfg(feature = "ffmpeg_4_1")]
122            AV_PKT_DATA_AFD => Type::AFD,
123
124            #[cfg(feature = "ffmpeg_4_3")]
125            AV_PKT_DATA_PRFT => Type::PRFT,
126            #[cfg(feature = "ffmpeg_4_3")]
127            AV_PKT_DATA_ICC_PROFILE => Type::ICC_PROFILE,
128            #[cfg(feature = "ffmpeg_4_3")]
129            AV_PKT_DATA_DOVI_CONF => Type::DOVI_CONF,
130
131            #[cfg(feature = "ffmpeg_4_4")]
132            AV_PKT_DATA_S12M_TIMECODE => Type::S12M_TIMECODE,
133
134            #[cfg(feature = "ffmpeg_5_0")]
135            AV_PKT_DATA_DYNAMIC_HDR10_PLUS => Type::DYNAMIC_HDR10_PLUS,
136
137            #[cfg(feature = "ffmpeg_7_0")]
138            AV_PKT_DATA_IAMF_MIX_GAIN_PARAM => Type::IAMF_MIX_GAIN_PARAM,
139            #[cfg(feature = "ffmpeg_7_0")]
140            AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM => Type::IAMF_DEMIXING_INFO_PARAM,
141            #[cfg(feature = "ffmpeg_7_0")]
142            AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM => Type::IAMF_RECON_GAIN_INFO_PARAM,
143            #[cfg(feature = "ffmpeg_7_0")]
144            AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT => Type::AMBIENT_VIEWING_ENVIRONMENT,
145
146            #[cfg(feature = "ffmpeg_7_1")]
147            AV_PKT_DATA_FRAME_CROPPING => Type::FRAME_CROPPING,
148            #[cfg(feature = "ffmpeg_7_1")]
149            AV_PKT_DATA_LCEVC => Type::LCEVC,
150
151            #[cfg(feature = "ffmpeg_8_0")]
152            AV_PKT_DATA_3D_REFERENCE_DISPLAYS => Type::THREE_D_REFERENCE_DISPLAYS,
153            #[cfg(feature = "ffmpeg_8_0")]
154            AV_PKT_DATA_RTCP_SR => Type::RTCP_SR,
155
156            #[cfg(feature = "ffmpeg_8_1")]
157            AV_PKT_DATA_EXIF => Type::EXIF,
158
159            #[cfg(feature = "ffmpeg_9_0")]
160            AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5 => Type::DYNAMIC_HDR_SMPTE_2094_APP5,
161            #[cfg(feature = "ffmpeg_9_0")]
162            AV_PKT_DATA_HEVC_CONF => Type::HEVC_CONF,
163
164            #[cfg(feature = "non-exhaustive-enums")]
165            _ => unimplemented!(),
166        }
167    }
168}
169
170impl From<Type> for AVPacketSideDataType {
171    fn from(value: Type) -> AVPacketSideDataType {
172        match value {
173            Type::Palette => AV_PKT_DATA_PALETTE,
174            Type::NewExtraData => AV_PKT_DATA_NEW_EXTRADATA,
175            Type::ParamChange => AV_PKT_DATA_PARAM_CHANGE,
176            Type::H263MbInfo => AV_PKT_DATA_H263_MB_INFO,
177            Type::ReplayGain => AV_PKT_DATA_REPLAYGAIN,
178            Type::DisplayMatrix => AV_PKT_DATA_DISPLAYMATRIX,
179            Type::Stereo3d => AV_PKT_DATA_STEREO3D,
180            Type::AudioServiceType => AV_PKT_DATA_AUDIO_SERVICE_TYPE,
181            Type::QualityStats => AV_PKT_DATA_QUALITY_STATS,
182            Type::FallbackTrack => AV_PKT_DATA_FALLBACK_TRACK,
183            Type::CBPProperties => AV_PKT_DATA_CPB_PROPERTIES,
184            Type::SkipSamples => AV_PKT_DATA_SKIP_SAMPLES,
185            Type::JpDualMono => AV_PKT_DATA_JP_DUALMONO,
186            Type::StringsMetadata => AV_PKT_DATA_STRINGS_METADATA,
187            Type::SubtitlePosition => AV_PKT_DATA_SUBTITLE_POSITION,
188            Type::MatroskaBlockAdditional => AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
189            Type::WebVTTIdentifier => AV_PKT_DATA_WEBVTT_IDENTIFIER,
190            Type::WebVTTSettings => AV_PKT_DATA_WEBVTT_SETTINGS,
191            Type::MetadataUpdate => AV_PKT_DATA_METADATA_UPDATE,
192            Type::MPEGTSStreamID => AV_PKT_DATA_MPEGTS_STREAM_ID,
193            Type::MasteringDisplayMetadata => AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
194            Type::DataSpherical => AV_PKT_DATA_SPHERICAL,
195            Type::DataNb => AV_PKT_DATA_NB,
196
197            Type::ContentLightLevel => AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
198            Type::A53CC => AV_PKT_DATA_A53_CC,
199
200            #[cfg(feature = "ffmpeg_4_0")]
201            Type::EncryptionInitInfo => AV_PKT_DATA_ENCRYPTION_INIT_INFO,
202            #[cfg(feature = "ffmpeg_4_0")]
203            Type::EncryptionInfo => AV_PKT_DATA_ENCRYPTION_INFO,
204
205            #[cfg(feature = "ffmpeg_4_1")]
206            Type::AFD => AV_PKT_DATA_AFD,
207
208            #[cfg(feature = "ffmpeg_4_3")]
209            Type::PRFT => AV_PKT_DATA_PRFT,
210            #[cfg(feature = "ffmpeg_4_3")]
211            Type::ICC_PROFILE => AV_PKT_DATA_ICC_PROFILE,
212            #[cfg(feature = "ffmpeg_4_3")]
213            Type::DOVI_CONF => AV_PKT_DATA_DOVI_CONF,
214
215            #[cfg(feature = "ffmpeg_4_4")]
216            Type::S12M_TIMECODE => AV_PKT_DATA_S12M_TIMECODE,
217
218            #[cfg(feature = "ffmpeg_5_0")]
219            Type::DYNAMIC_HDR10_PLUS => AV_PKT_DATA_DYNAMIC_HDR10_PLUS,
220
221            #[cfg(feature = "ffmpeg_7_0")]
222            Type::IAMF_MIX_GAIN_PARAM => AV_PKT_DATA_IAMF_MIX_GAIN_PARAM,
223            #[cfg(feature = "ffmpeg_7_0")]
224            Type::IAMF_DEMIXING_INFO_PARAM => AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM,
225            #[cfg(feature = "ffmpeg_7_0")]
226            Type::IAMF_RECON_GAIN_INFO_PARAM => AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM,
227            #[cfg(feature = "ffmpeg_7_0")]
228            Type::AMBIENT_VIEWING_ENVIRONMENT => AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT,
229
230            #[cfg(feature = "ffmpeg_7_1")]
231            Type::FRAME_CROPPING => AV_PKT_DATA_FRAME_CROPPING,
232            #[cfg(feature = "ffmpeg_7_1")]
233            Type::LCEVC => AV_PKT_DATA_LCEVC,
234
235            #[cfg(feature = "ffmpeg_8_0")]
236            Type::THREE_D_REFERENCE_DISPLAYS => AV_PKT_DATA_3D_REFERENCE_DISPLAYS,
237            #[cfg(feature = "ffmpeg_8_0")]
238            Type::RTCP_SR => AV_PKT_DATA_RTCP_SR,
239
240            #[cfg(feature = "ffmpeg_8_1")]
241            Type::EXIF => AV_PKT_DATA_EXIF,
242
243            #[cfg(feature = "ffmpeg_9_0")]
244            Type::DYNAMIC_HDR_SMPTE_2094_APP5 => AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5,
245            #[cfg(feature = "ffmpeg_9_0")]
246            Type::HEVC_CONF => AV_PKT_DATA_HEVC_CONF,
247        }
248    }
249}
250
251pub struct SideData<'a> {
252    ptr: *mut AVPacketSideData,
253
254    _marker: PhantomData<&'a Packet>,
255}
256
257impl<'a> SideData<'a> {
258    pub unsafe fn wrap(ptr: *mut AVPacketSideData) -> Self {
259        SideData {
260            ptr,
261            _marker: PhantomData,
262        }
263    }
264
265    pub unsafe fn as_ptr(&self) -> *const AVPacketSideData {
266        self.ptr as *const _
267    }
268}
269
270impl<'a> SideData<'a> {
271    pub fn kind(&self) -> Type {
272        unsafe { Type::from((*self.as_ptr()).type_) }
273    }
274
275    pub fn data(&self) -> &[u8] {
276        #[allow(clippy::unnecessary_cast)]
277        unsafe {
278            slice::from_raw_parts((*self.as_ptr()).data, (*self.as_ptr()).size as usize)
279        }
280    }
281}