ffmpeg_the_third/codec/packet/
side_data.rs

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