playa_ffmpeg/codec/packet/
side_data.rs

1use 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}