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 | |
59 | impl From<AVPacketSideDataType> for Type { |
60 | fn from(value: AVPacketSideDataType) -> Self { |
61 | match value { |
62 | AV_PKT_DATA_PALETTE => Type::Palette, |
63 | AV_PKT_DATA_NEW_EXTRADATA => Type::NewExtraData, |
64 | AV_PKT_DATA_PARAM_CHANGE => Type::ParamChange, |
65 | AV_PKT_DATA_H263_MB_INFO => Type::H263MbInfo, |
66 | AV_PKT_DATA_REPLAYGAIN => Type::ReplayGain, |
67 | AV_PKT_DATA_DISPLAYMATRIX => Type::DisplayMatrix, |
68 | AV_PKT_DATA_STEREO3D => Type::Stereo3d, |
69 | AV_PKT_DATA_AUDIO_SERVICE_TYPE => Type::AudioServiceType, |
70 | AV_PKT_DATA_QUALITY_STATS => Type::QualityStats, |
71 | AV_PKT_DATA_FALLBACK_TRACK => Type::FallbackTrack, |
72 | AV_PKT_DATA_CPB_PROPERTIES => Type::CBPProperties, |
73 | AV_PKT_DATA_SKIP_SAMPLES => Type::SkipSamples, |
74 | AV_PKT_DATA_JP_DUALMONO => Type::JpDualMono, |
75 | AV_PKT_DATA_STRINGS_METADATA => Type::StringsMetadata, |
76 | AV_PKT_DATA_SUBTITLE_POSITION => Type::SubtitlePosition, |
77 | AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL => Type::MatroskaBlockAdditional, |
78 | AV_PKT_DATA_WEBVTT_IDENTIFIER => Type::WebVTTIdentifier, |
79 | AV_PKT_DATA_WEBVTT_SETTINGS => Type::WebVTTSettings, |
80 | AV_PKT_DATA_METADATA_UPDATE => Type::MetadataUpdate, |
81 | AV_PKT_DATA_MPEGTS_STREAM_ID => Type::MPEGTSStreamID, |
82 | AV_PKT_DATA_MASTERING_DISPLAY_METADATA => Type::MasteringDisplayMetadata, |
83 | AV_PKT_DATA_SPHERICAL => Type::DataSpherical, |
84 | AV_PKT_DATA_NB => Type::DataNb, |
85 | |
86 | AV_PKT_DATA_CONTENT_LIGHT_LEVEL => Type::ContentLightLevel, |
87 | AV_PKT_DATA_A53_CC => Type::A53CC, |
88 | |
89 | #[cfg (feature = "ffmpeg_4_0" )] |
90 | AV_PKT_DATA_ENCRYPTION_INIT_INFO => Type::EncryptionInitInfo, |
91 | #[cfg (feature = "ffmpeg_4_0" )] |
92 | AV_PKT_DATA_ENCRYPTION_INFO => Type::EncryptionInfo, |
93 | |
94 | #[cfg (feature = "ffmpeg_4_1" )] |
95 | AV_PKT_DATA_AFD => Type::AFD, |
96 | |
97 | #[cfg (feature = "ffmpeg_4_3" )] |
98 | AV_PKT_DATA_PRFT => Type::PRFT, |
99 | #[cfg (feature = "ffmpeg_4_3" )] |
100 | AV_PKT_DATA_ICC_PROFILE => Type::ICC_PROFILE, |
101 | #[cfg (feature = "ffmpeg_4_3" )] |
102 | AV_PKT_DATA_DOVI_CONF => Type::DOVI_CONF, |
103 | |
104 | #[cfg (feature = "ffmpeg_4_4" )] |
105 | AV_PKT_DATA_S12M_TIMECODE => Type::S12M_TIMECODE, |
106 | |
107 | #[cfg (feature = "ffmpeg_5_0" )] |
108 | AV_PKT_DATA_DYNAMIC_HDR10_PLUS => Type::DYNAMIC_HDR10_PLUS, |
109 | } |
110 | } |
111 | } |
112 | |
113 | impl From<Type> for AVPacketSideDataType { |
114 | fn from(value: Type) -> AVPacketSideDataType { |
115 | match value { |
116 | Type::Palette => AV_PKT_DATA_PALETTE, |
117 | Type::NewExtraData => AV_PKT_DATA_NEW_EXTRADATA, |
118 | Type::ParamChange => AV_PKT_DATA_PARAM_CHANGE, |
119 | Type::H263MbInfo => AV_PKT_DATA_H263_MB_INFO, |
120 | Type::ReplayGain => AV_PKT_DATA_REPLAYGAIN, |
121 | Type::DisplayMatrix => AV_PKT_DATA_DISPLAYMATRIX, |
122 | Type::Stereo3d => AV_PKT_DATA_STEREO3D, |
123 | Type::AudioServiceType => AV_PKT_DATA_AUDIO_SERVICE_TYPE, |
124 | Type::QualityStats => AV_PKT_DATA_QUALITY_STATS, |
125 | Type::FallbackTrack => AV_PKT_DATA_FALLBACK_TRACK, |
126 | Type::CBPProperties => AV_PKT_DATA_CPB_PROPERTIES, |
127 | Type::SkipSamples => AV_PKT_DATA_SKIP_SAMPLES, |
128 | Type::JpDualMono => AV_PKT_DATA_JP_DUALMONO, |
129 | Type::StringsMetadata => AV_PKT_DATA_STRINGS_METADATA, |
130 | Type::SubtitlePosition => AV_PKT_DATA_SUBTITLE_POSITION, |
131 | Type::MatroskaBlockAdditional => AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, |
132 | Type::WebVTTIdentifier => AV_PKT_DATA_WEBVTT_IDENTIFIER, |
133 | Type::WebVTTSettings => AV_PKT_DATA_WEBVTT_SETTINGS, |
134 | Type::MetadataUpdate => AV_PKT_DATA_METADATA_UPDATE, |
135 | Type::MPEGTSStreamID => AV_PKT_DATA_MPEGTS_STREAM_ID, |
136 | Type::MasteringDisplayMetadata => AV_PKT_DATA_MASTERING_DISPLAY_METADATA, |
137 | Type::DataSpherical => AV_PKT_DATA_SPHERICAL, |
138 | Type::DataNb => AV_PKT_DATA_NB, |
139 | |
140 | Type::ContentLightLevel => AV_PKT_DATA_CONTENT_LIGHT_LEVEL, |
141 | Type::A53CC => AV_PKT_DATA_A53_CC, |
142 | |
143 | #[cfg (feature = "ffmpeg_4_0" )] |
144 | Type::EncryptionInitInfo => AV_PKT_DATA_ENCRYPTION_INIT_INFO, |
145 | #[cfg (feature = "ffmpeg_4_0" )] |
146 | Type::EncryptionInfo => AV_PKT_DATA_ENCRYPTION_INFO, |
147 | |
148 | #[cfg (feature = "ffmpeg_4_1" )] |
149 | Type::AFD => AV_PKT_DATA_AFD, |
150 | |
151 | #[cfg (feature = "ffmpeg_4_3" )] |
152 | Type::PRFT => AV_PKT_DATA_PRFT, |
153 | #[cfg (feature = "ffmpeg_4_3" )] |
154 | Type::ICC_PROFILE => AV_PKT_DATA_ICC_PROFILE, |
155 | #[cfg (feature = "ffmpeg_4_3" )] |
156 | Type::DOVI_CONF => AV_PKT_DATA_DOVI_CONF, |
157 | |
158 | #[cfg (feature = "ffmpeg_4_4" )] |
159 | Type::S12M_TIMECODE => AV_PKT_DATA_S12M_TIMECODE, |
160 | |
161 | #[cfg (feature = "ffmpeg_5_0" )] |
162 | Type::DYNAMIC_HDR10_PLUS => AV_PKT_DATA_DYNAMIC_HDR10_PLUS, |
163 | } |
164 | } |
165 | } |
166 | |
167 | pub struct SideData<'a> { |
168 | ptr: *mut AVPacketSideData, |
169 | |
170 | _marker: PhantomData<&'a Packet>, |
171 | } |
172 | |
173 | impl<'a> SideData<'a> { |
174 | pub unsafe fn wrap(ptr: *mut AVPacketSideData) -> Self { |
175 | SideData { |
176 | ptr, |
177 | _marker: PhantomData, |
178 | } |
179 | } |
180 | |
181 | pub unsafe fn as_ptr(&self) -> *const AVPacketSideData { |
182 | self.ptr as *const _ |
183 | } |
184 | } |
185 | |
186 | impl<'a> SideData<'a> { |
187 | pub fn kind(&self) -> Type { |
188 | unsafe { Type::from((*self.as_ptr()).type_) } |
189 | } |
190 | |
191 | pub fn data(&self) -> &[u8] { |
192 | #[allow (clippy::unnecessary_cast)] |
193 | unsafe { |
194 | slice::from_raw_parts((*self.as_ptr()).data, (*self.as_ptr()).size as usize) |
195 | } |
196 | } |
197 | } |
198 | |