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