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