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