ffmpeg_next/codec/packet/
side_data.rs1use 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}