ffmpeg_rs/codec/packet/
side_data.rs

1use std::marker::PhantomData;
2use std::slice;
3
4use super::Packet;
5use ffi::AVPacketSideDataType::*;
6use ffi::*;
7
8#[derive(Eq, PartialEq, Copy, Clone, Debug)]
9pub 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
59impl 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
113impl 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
167pub struct SideData<'a> {
168    ptr: *mut AVPacketSideData,
169
170    _marker: PhantomData<&'a Packet>,
171}
172
173impl<'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
186impl<'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        unsafe { slice::from_raw_parts((*self.as_ptr()).data, (*self.as_ptr()).size as usize) }
193    }
194}