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