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