| 1 | use std::marker::PhantomData; |
| 2 | use std::slice; |
| 3 | |
| 4 | use super::Packet; |
| 5 | use ffi::AVPacketSideDataType::*; |
| 6 | use ffi::*; |
| 7 | |
| 8 | #[derive (Eq, PartialEq, Copy, Clone, Debug)] |
| 9 | pub 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 | #[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 | FRAME_CROPPING, |
| 69 | #[cfg (feature = "ffmpeg_7_1" )] |
| 70 | LCEVC, |
| 71 | } |
| 72 | |
| 73 | impl From<AVPacketSideDataType> for Type { |
| 74 | fn from(value: AVPacketSideDataType) -> Self { |
| 75 | match value { |
| 76 | AV_PKT_DATA_PALETTE => Type::Palette, |
| 77 | AV_PKT_DATA_NEW_EXTRADATA => Type::NewExtraData, |
| 78 | AV_PKT_DATA_PARAM_CHANGE => Type::ParamChange, |
| 79 | AV_PKT_DATA_H263_MB_INFO => Type::H263MbInfo, |
| 80 | AV_PKT_DATA_REPLAYGAIN => Type::ReplayGain, |
| 81 | AV_PKT_DATA_DISPLAYMATRIX => Type::DisplayMatrix, |
| 82 | AV_PKT_DATA_STEREO3D => Type::Stereo3d, |
| 83 | AV_PKT_DATA_AUDIO_SERVICE_TYPE => Type::AudioServiceType, |
| 84 | AV_PKT_DATA_QUALITY_STATS => Type::QualityStats, |
| 85 | AV_PKT_DATA_FALLBACK_TRACK => Type::FallbackTrack, |
| 86 | AV_PKT_DATA_CPB_PROPERTIES => Type::CBPProperties, |
| 87 | AV_PKT_DATA_SKIP_SAMPLES => Type::SkipSamples, |
| 88 | AV_PKT_DATA_JP_DUALMONO => Type::JpDualMono, |
| 89 | AV_PKT_DATA_STRINGS_METADATA => Type::StringsMetadata, |
| 90 | AV_PKT_DATA_SUBTITLE_POSITION => Type::SubtitlePosition, |
| 91 | AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL => Type::MatroskaBlockAdditional, |
| 92 | AV_PKT_DATA_WEBVTT_IDENTIFIER => Type::WebVTTIdentifier, |
| 93 | AV_PKT_DATA_WEBVTT_SETTINGS => Type::WebVTTSettings, |
| 94 | AV_PKT_DATA_METADATA_UPDATE => Type::MetadataUpdate, |
| 95 | AV_PKT_DATA_MPEGTS_STREAM_ID => Type::MPEGTSStreamID, |
| 96 | AV_PKT_DATA_MASTERING_DISPLAY_METADATA => Type::MasteringDisplayMetadata, |
| 97 | AV_PKT_DATA_SPHERICAL => Type::DataSpherical, |
| 98 | AV_PKT_DATA_NB => Type::DataNb, |
| 99 | |
| 100 | AV_PKT_DATA_CONTENT_LIGHT_LEVEL => Type::ContentLightLevel, |
| 101 | AV_PKT_DATA_A53_CC => Type::A53CC, |
| 102 | |
| 103 | #[cfg (feature = "ffmpeg_4_0" )] |
| 104 | AV_PKT_DATA_ENCRYPTION_INIT_INFO => Type::EncryptionInitInfo, |
| 105 | #[cfg (feature = "ffmpeg_4_0" )] |
| 106 | AV_PKT_DATA_ENCRYPTION_INFO => Type::EncryptionInfo, |
| 107 | |
| 108 | #[cfg (feature = "ffmpeg_4_1" )] |
| 109 | AV_PKT_DATA_AFD => Type::AFD, |
| 110 | |
| 111 | #[cfg (feature = "ffmpeg_4_3" )] |
| 112 | AV_PKT_DATA_PRFT => Type::PRFT, |
| 113 | #[cfg (feature = "ffmpeg_4_3" )] |
| 114 | AV_PKT_DATA_ICC_PROFILE => Type::ICC_PROFILE, |
| 115 | #[cfg (feature = "ffmpeg_4_3" )] |
| 116 | AV_PKT_DATA_DOVI_CONF => Type::DOVI_CONF, |
| 117 | |
| 118 | #[cfg (feature = "ffmpeg_4_4" )] |
| 119 | AV_PKT_DATA_S12M_TIMECODE => Type::S12M_TIMECODE, |
| 120 | |
| 121 | #[cfg (feature = "ffmpeg_5_0" )] |
| 122 | AV_PKT_DATA_DYNAMIC_HDR10_PLUS => Type::DYNAMIC_HDR10_PLUS, |
| 123 | |
| 124 | #[cfg (feature = "ffmpeg_7_0" )] |
| 125 | AV_PKT_DATA_IAMF_MIX_GAIN_PARAM => Type::IAMF_MIX_GAIN_PARAM, |
| 126 | #[cfg (feature = "ffmpeg_7_0" )] |
| 127 | AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM => Type::IAMF_DEMIXING_INFO_PARAM, |
| 128 | #[cfg (feature = "ffmpeg_7_0" )] |
| 129 | AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM => Type::IAMF_RECON_GAIN_INFO_PARAM, |
| 130 | #[cfg (feature = "ffmpeg_7_0" )] |
| 131 | AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT => Type::AMBIENT_VIEWING_ENVIRONMENT, |
| 132 | |
| 133 | #[cfg (feature = "ffmpeg_7_1" )] |
| 134 | AV_PKT_DATA_FRAME_CROPPING => Type::FRAME_CROPPING, |
| 135 | #[cfg (feature = "ffmpeg_7_1" )] |
| 136 | AV_PKT_DATA_LCEVC => Type::LCEVC, |
| 137 | } |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | impl From<Type> for AVPacketSideDataType { |
| 142 | fn from(value: Type) -> AVPacketSideDataType { |
| 143 | match value { |
| 144 | Type::Palette => AV_PKT_DATA_PALETTE, |
| 145 | Type::NewExtraData => AV_PKT_DATA_NEW_EXTRADATA, |
| 146 | Type::ParamChange => AV_PKT_DATA_PARAM_CHANGE, |
| 147 | Type::H263MbInfo => AV_PKT_DATA_H263_MB_INFO, |
| 148 | Type::ReplayGain => AV_PKT_DATA_REPLAYGAIN, |
| 149 | Type::DisplayMatrix => AV_PKT_DATA_DISPLAYMATRIX, |
| 150 | Type::Stereo3d => AV_PKT_DATA_STEREO3D, |
| 151 | Type::AudioServiceType => AV_PKT_DATA_AUDIO_SERVICE_TYPE, |
| 152 | Type::QualityStats => AV_PKT_DATA_QUALITY_STATS, |
| 153 | Type::FallbackTrack => AV_PKT_DATA_FALLBACK_TRACK, |
| 154 | Type::CBPProperties => AV_PKT_DATA_CPB_PROPERTIES, |
| 155 | Type::SkipSamples => AV_PKT_DATA_SKIP_SAMPLES, |
| 156 | Type::JpDualMono => AV_PKT_DATA_JP_DUALMONO, |
| 157 | Type::StringsMetadata => AV_PKT_DATA_STRINGS_METADATA, |
| 158 | Type::SubtitlePosition => AV_PKT_DATA_SUBTITLE_POSITION, |
| 159 | Type::MatroskaBlockAdditional => AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, |
| 160 | Type::WebVTTIdentifier => AV_PKT_DATA_WEBVTT_IDENTIFIER, |
| 161 | Type::WebVTTSettings => AV_PKT_DATA_WEBVTT_SETTINGS, |
| 162 | Type::MetadataUpdate => AV_PKT_DATA_METADATA_UPDATE, |
| 163 | Type::MPEGTSStreamID => AV_PKT_DATA_MPEGTS_STREAM_ID, |
| 164 | Type::MasteringDisplayMetadata => AV_PKT_DATA_MASTERING_DISPLAY_METADATA, |
| 165 | Type::DataSpherical => AV_PKT_DATA_SPHERICAL, |
| 166 | Type::DataNb => AV_PKT_DATA_NB, |
| 167 | |
| 168 | Type::ContentLightLevel => AV_PKT_DATA_CONTENT_LIGHT_LEVEL, |
| 169 | Type::A53CC => AV_PKT_DATA_A53_CC, |
| 170 | |
| 171 | #[cfg (feature = "ffmpeg_4_0" )] |
| 172 | Type::EncryptionInitInfo => AV_PKT_DATA_ENCRYPTION_INIT_INFO, |
| 173 | #[cfg (feature = "ffmpeg_4_0" )] |
| 174 | Type::EncryptionInfo => AV_PKT_DATA_ENCRYPTION_INFO, |
| 175 | |
| 176 | #[cfg (feature = "ffmpeg_4_1" )] |
| 177 | Type::AFD => AV_PKT_DATA_AFD, |
| 178 | |
| 179 | #[cfg (feature = "ffmpeg_4_3" )] |
| 180 | Type::PRFT => AV_PKT_DATA_PRFT, |
| 181 | #[cfg (feature = "ffmpeg_4_3" )] |
| 182 | Type::ICC_PROFILE => AV_PKT_DATA_ICC_PROFILE, |
| 183 | #[cfg (feature = "ffmpeg_4_3" )] |
| 184 | Type::DOVI_CONF => AV_PKT_DATA_DOVI_CONF, |
| 185 | |
| 186 | #[cfg (feature = "ffmpeg_4_4" )] |
| 187 | Type::S12M_TIMECODE => AV_PKT_DATA_S12M_TIMECODE, |
| 188 | |
| 189 | #[cfg (feature = "ffmpeg_5_0" )] |
| 190 | Type::DYNAMIC_HDR10_PLUS => AV_PKT_DATA_DYNAMIC_HDR10_PLUS, |
| 191 | |
| 192 | #[cfg (feature = "ffmpeg_7_0" )] |
| 193 | Type::IAMF_MIX_GAIN_PARAM => AV_PKT_DATA_IAMF_MIX_GAIN_PARAM, |
| 194 | #[cfg (feature = "ffmpeg_7_0" )] |
| 195 | Type::IAMF_DEMIXING_INFO_PARAM => AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM, |
| 196 | #[cfg (feature = "ffmpeg_7_0" )] |
| 197 | Type::IAMF_RECON_GAIN_INFO_PARAM => AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM, |
| 198 | #[cfg (feature = "ffmpeg_7_0" )] |
| 199 | Type::AMBIENT_VIEWING_ENVIRONMENT => AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT, |
| 200 | |
| 201 | #[cfg (feature = "ffmpeg_7_1" )] |
| 202 | Type::FRAME_CROPPING => AV_PKT_DATA_FRAME_CROPPING, |
| 203 | #[cfg (feature = "ffmpeg_7_1" )] |
| 204 | Type::LCEVC => AV_PKT_DATA_LCEVC, |
| 205 | } |
| 206 | } |
| 207 | } |
| 208 | |
| 209 | pub struct SideData<'a> { |
| 210 | ptr: *mut AVPacketSideData, |
| 211 | |
| 212 | _marker: PhantomData<&'a Packet>, |
| 213 | } |
| 214 | |
| 215 | impl<'a> SideData<'a> { |
| 216 | pub unsafe fn wrap(ptr: *mut AVPacketSideData) -> Self { |
| 217 | SideData { |
| 218 | ptr, |
| 219 | _marker: PhantomData, |
| 220 | } |
| 221 | } |
| 222 | |
| 223 | pub unsafe fn as_ptr(&self) -> *const AVPacketSideData { |
| 224 | self.ptr as *const _ |
| 225 | } |
| 226 | } |
| 227 | |
| 228 | impl<'a> SideData<'a> { |
| 229 | pub fn kind(&self) -> Type { |
| 230 | unsafe { Type::from((*self.as_ptr()).type_) } |
| 231 | } |
| 232 | |
| 233 | pub fn data(&self) -> &[u8] { |
| 234 | #[allow (clippy::unnecessary_cast)] |
| 235 | unsafe { |
| 236 | slice::from_raw_parts((*self.as_ptr()).data, (*self.as_ptr()).size as usize) |
| 237 | } |
| 238 | } |
| 239 | } |
| 240 | |