ffmpeg_the_third/codec/
profile.rs

1use super::Id;
2use crate::ffi::*;
3use libc::c_int;
4#[cfg(feature = "serialize")]
5use serde::{Deserialize, Serialize};
6
7#[allow(non_camel_case_types)]
8#[derive(Eq, PartialEq, Clone, Copy, Debug)]
9#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
10pub enum Profile {
11    Unknown,
12    Reserved,
13
14    AAC(AAC),
15    DNXHD(DNXHD),
16    DTS(DTS),
17    EAC3_DDP_Atmos,
18    TrueHD_Atmos,
19    MPEG2(MPEG2),
20    H264(H264),
21    VC1(VC1),
22    MPEG4(MPEG4),
23    JPEG2000(JPEG2000),
24    HEVC(HEVC),
25    VP9(VP9),
26    VVC(VVC),
27    AV1(AV1),
28    MJPEG(MJPEG),
29    SBC_MSBC,
30    ProRes(ProRes),
31    #[cfg(feature = "ffmpeg_8_0")]
32    ProResRAW(ProResRAW),
33    ARIB(ARIB),
34    KLVA(KLVA),
35    EVC(EVC),
36    #[cfg(feature = "ffmpeg_8_0")]
37    APV(APV),
38}
39
40#[allow(non_camel_case_types)]
41#[derive(Eq, PartialEq, Clone, Copy, Debug)]
42#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
43pub enum AAC {
44    Main,
45    Low,
46    SSR,
47    LTP,
48    HE,
49    HEv2,
50    LD,
51    ELD,
52
53    MPEG2Low,
54    MPEG2HE,
55}
56
57#[allow(non_camel_case_types)]
58#[derive(Eq, PartialEq, Clone, Copy, Debug)]
59#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
60pub enum DNXHD {
61    HD,
62    HR_LB,
63    HR_SQ,
64    HR_HQ,
65    HR_HQX,
66    HR_444,
67}
68
69#[allow(non_camel_case_types)]
70#[derive(Eq, PartialEq, Clone, Copy, Debug)]
71#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
72pub enum DTS {
73    Default,
74    ES,
75    _96_24,
76    HD_HRA,
77    HD_MA,
78    Express,
79    HD_MA_X,
80    HD_MA_X_IMAX,
81}
82
83#[allow(non_camel_case_types)]
84#[derive(Eq, PartialEq, Clone, Copy, Debug)]
85#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
86pub enum MPEG2 {
87    _422,
88    High,
89    SS,
90    SNRScalable,
91    Main,
92    Simple,
93}
94
95#[allow(non_camel_case_types)]
96#[derive(Eq, PartialEq, Clone, Copy, Debug)]
97#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
98pub enum H264 {
99    Constrained,
100    Intra,
101    Baseline,
102    ConstrainedBaseline,
103    Main,
104    Extended,
105    High,
106    High10,
107    High10Intra,
108    High422,
109    High422Intra,
110    High444,
111    High444Predictive,
112    High444Intra,
113    CAVLC444,
114}
115
116#[allow(non_camel_case_types)]
117#[derive(Eq, PartialEq, Clone, Copy, Debug)]
118#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
119pub enum VC1 {
120    Simple,
121    Main,
122    Complex,
123    Advanced,
124}
125
126#[allow(non_camel_case_types)]
127#[derive(Eq, PartialEq, Clone, Copy, Debug)]
128#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
129pub enum MPEG4 {
130    Simple,
131    SimpleScalable,
132    Core,
133    Main,
134    NBit,
135    ScalableTexture,
136    SimpleFaceAnimation,
137    BasicAnimatedTexture,
138    Hybrid,
139    AdvancedRealTime,
140    CoreScalable,
141    AdvancedCoding,
142    AdvancedCore,
143    AdvancedScalableTexture,
144    SimpleStudio,
145    AdvancedSimple,
146}
147
148#[allow(non_camel_case_types)]
149#[derive(Eq, PartialEq, Clone, Copy, Debug)]
150#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
151pub enum JPEG2000 {
152    CStreamRestriction0,
153    CStreamRestriction1,
154    CStreamNoRestriction,
155    DCinema2K,
156    DCinema4K,
157}
158
159#[allow(non_camel_case_types)]
160#[derive(Eq, PartialEq, Clone, Copy, Debug)]
161#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
162pub enum VP9 {
163    _0,
164    _1,
165    _2,
166    _3,
167}
168
169#[allow(non_camel_case_types)]
170#[derive(Eq, PartialEq, Clone, Copy, Debug)]
171#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
172pub enum HEVC {
173    Main,
174    Main10,
175    MainStillPicture,
176    Rext,
177}
178
179#[allow(non_camel_case_types)]
180#[derive(Eq, PartialEq, Clone, Copy, Debug)]
181#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
182pub enum VVC {
183    Main10,
184    Main10_444,
185}
186
187#[allow(non_camel_case_types)]
188#[derive(Eq, PartialEq, Clone, Copy, Debug)]
189#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
190pub enum AV1 {
191    Main,
192    High,
193    Professional,
194}
195
196#[allow(non_camel_case_types)]
197#[derive(Eq, PartialEq, Clone, Copy, Debug)]
198#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
199pub enum MJPEG {
200    HuffmanBaselineDCT,
201    HuffmanExtendedSequentialDCT,
202    HuffmanProgressiveDCT,
203    HuffmanLossless,
204    JPEG_LS,
205}
206
207#[allow(non_camel_case_types)]
208#[derive(Eq, PartialEq, Clone, Copy, Debug)]
209#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
210pub enum ProRes {
211    Proxy,
212    LT,
213    Standard,
214    HQ,
215    _4444,
216    XQ,
217}
218
219#[cfg(feature = "ffmpeg_8_0")]
220#[allow(non_camel_case_types)]
221#[derive(Eq, PartialEq, Clone, Copy, Debug)]
222#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
223pub enum ProResRAW {
224    Default,
225    HQ,
226}
227
228#[allow(non_camel_case_types)]
229#[derive(Eq, PartialEq, Clone, Copy, Debug)]
230#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
231pub enum ARIB {
232    ProfileA,
233    ProfileC,
234}
235
236#[allow(non_camel_case_types)]
237#[derive(Eq, PartialEq, Clone, Copy, Debug)]
238#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
239pub enum KLVA {
240    Sync,
241    Async,
242}
243
244#[allow(non_camel_case_types)]
245#[derive(Eq, PartialEq, Clone, Copy, Debug)]
246#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
247pub enum EVC {
248    Baseline,
249    Main,
250}
251
252#[cfg(feature = "ffmpeg_8_0")]
253#[allow(non_camel_case_types)]
254#[derive(Eq, PartialEq, Clone, Copy, Debug)]
255#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
256pub enum APV {
257    _422_10,
258    _422_12,
259    _444_10,
260    _444_12,
261    _4444_10,
262    _4444_12,
263    _400_10,
264}
265
266impl From<(Id, c_int)> for Profile {
267    fn from((id, value): (Id, c_int)) -> Profile {
268        if value == AV_PROFILE_UNKNOWN {
269            return Profile::Unknown;
270        }
271
272        if value == AV_PROFILE_RESERVED {
273            return Profile::Reserved;
274        }
275
276        match id {
277            Id::AAC => match value {
278                AV_PROFILE_AAC_MAIN => Profile::AAC(AAC::Main),
279                AV_PROFILE_AAC_LOW => Profile::AAC(AAC::Low),
280                AV_PROFILE_AAC_SSR => Profile::AAC(AAC::SSR),
281                AV_PROFILE_AAC_LTP => Profile::AAC(AAC::LTP),
282                AV_PROFILE_AAC_HE => Profile::AAC(AAC::HE),
283                AV_PROFILE_AAC_HE_V2 => Profile::AAC(AAC::HEv2),
284                AV_PROFILE_AAC_LD => Profile::AAC(AAC::LD),
285                AV_PROFILE_AAC_ELD => Profile::AAC(AAC::ELD),
286
287                AV_PROFILE_MPEG2_AAC_LOW => Profile::AAC(AAC::MPEG2Low),
288                AV_PROFILE_MPEG2_AAC_HE => Profile::AAC(AAC::MPEG2HE),
289
290                _ => Profile::Unknown,
291            },
292
293            Id::DNXHD => Profile::DNXHD(match value {
294                AV_PROFILE_DNXHD => DNXHD::HD,
295                AV_PROFILE_DNXHR_LB => DNXHD::HR_LB,
296                AV_PROFILE_DNXHR_SQ => DNXHD::HR_SQ,
297                AV_PROFILE_DNXHR_HQ => DNXHD::HR_HQ,
298                AV_PROFILE_DNXHR_HQX => DNXHD::HR_HQX,
299                AV_PROFILE_DNXHR_444 => DNXHD::HR_444,
300
301                _ => return Profile::Unknown,
302            }),
303
304            Id::DTS => match value {
305                AV_PROFILE_DTS => Profile::DTS(DTS::Default),
306                AV_PROFILE_DTS_ES => Profile::DTS(DTS::ES),
307                AV_PROFILE_DTS_96_24 => Profile::DTS(DTS::_96_24),
308                AV_PROFILE_DTS_HD_HRA => Profile::DTS(DTS::HD_HRA),
309                AV_PROFILE_DTS_HD_MA => Profile::DTS(DTS::HD_MA),
310                AV_PROFILE_DTS_EXPRESS => Profile::DTS(DTS::Express),
311
312                _ => Profile::Unknown,
313            },
314
315            Id::MPEG2VIDEO => match value {
316                AV_PROFILE_MPEG2_422 => Profile::MPEG2(MPEG2::_422),
317                AV_PROFILE_MPEG2_HIGH => Profile::MPEG2(MPEG2::High),
318                AV_PROFILE_MPEG2_SS => Profile::MPEG2(MPEG2::SS),
319                AV_PROFILE_MPEG2_SNR_SCALABLE => Profile::MPEG2(MPEG2::SNRScalable),
320                AV_PROFILE_MPEG2_MAIN => Profile::MPEG2(MPEG2::Main),
321                AV_PROFILE_MPEG2_SIMPLE => Profile::MPEG2(MPEG2::Simple),
322
323                _ => Profile::Unknown,
324            },
325
326            Id::H264 => match value {
327                AV_PROFILE_H264_CONSTRAINED => Profile::H264(H264::Constrained),
328                AV_PROFILE_H264_INTRA => Profile::H264(H264::Intra),
329                AV_PROFILE_H264_BASELINE => Profile::H264(H264::Baseline),
330                AV_PROFILE_H264_CONSTRAINED_BASELINE => Profile::H264(H264::ConstrainedBaseline),
331                AV_PROFILE_H264_MAIN => Profile::H264(H264::Main),
332                AV_PROFILE_H264_EXTENDED => Profile::H264(H264::Extended),
333                AV_PROFILE_H264_HIGH => Profile::H264(H264::High),
334                AV_PROFILE_H264_HIGH_10 => Profile::H264(H264::High10),
335                AV_PROFILE_H264_HIGH_10_INTRA => Profile::H264(H264::High10Intra),
336                AV_PROFILE_H264_HIGH_422 => Profile::H264(H264::High422),
337                AV_PROFILE_H264_HIGH_422_INTRA => Profile::H264(H264::High422Intra),
338                AV_PROFILE_H264_HIGH_444 => Profile::H264(H264::High444),
339                AV_PROFILE_H264_HIGH_444_PREDICTIVE => Profile::H264(H264::High444Predictive),
340                AV_PROFILE_H264_HIGH_444_INTRA => Profile::H264(H264::High444Intra),
341                AV_PROFILE_H264_CAVLC_444 => Profile::H264(H264::CAVLC444),
342
343                _ => Profile::Unknown,
344            },
345
346            Id::VC1 => match value {
347                AV_PROFILE_VC1_SIMPLE => Profile::VC1(VC1::Simple),
348                AV_PROFILE_VC1_MAIN => Profile::VC1(VC1::Main),
349                AV_PROFILE_VC1_COMPLEX => Profile::VC1(VC1::Complex),
350                AV_PROFILE_VC1_ADVANCED => Profile::VC1(VC1::Advanced),
351
352                _ => Profile::Unknown,
353            },
354
355            Id::MPEG4 => match value {
356                AV_PROFILE_MPEG4_SIMPLE => Profile::MPEG4(MPEG4::Simple),
357                AV_PROFILE_MPEG4_SIMPLE_SCALABLE => Profile::MPEG4(MPEG4::SimpleScalable),
358                AV_PROFILE_MPEG4_CORE => Profile::MPEG4(MPEG4::Core),
359                AV_PROFILE_MPEG4_MAIN => Profile::MPEG4(MPEG4::Main),
360                AV_PROFILE_MPEG4_N_BIT => Profile::MPEG4(MPEG4::NBit),
361                AV_PROFILE_MPEG4_SCALABLE_TEXTURE => Profile::MPEG4(MPEG4::ScalableTexture),
362                AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION => {
363                    Profile::MPEG4(MPEG4::SimpleFaceAnimation)
364                }
365                AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE => {
366                    Profile::MPEG4(MPEG4::BasicAnimatedTexture)
367                }
368                AV_PROFILE_MPEG4_HYBRID => Profile::MPEG4(MPEG4::Hybrid),
369                AV_PROFILE_MPEG4_ADVANCED_REAL_TIME => Profile::MPEG4(MPEG4::AdvancedRealTime),
370                AV_PROFILE_MPEG4_CORE_SCALABLE => Profile::MPEG4(MPEG4::CoreScalable),
371                AV_PROFILE_MPEG4_ADVANCED_CODING => Profile::MPEG4(MPEG4::AdvancedCoding),
372                AV_PROFILE_MPEG4_ADVANCED_CORE => Profile::MPEG4(MPEG4::AdvancedCore),
373                AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE => {
374                    Profile::MPEG4(MPEG4::AdvancedScalableTexture)
375                }
376                AV_PROFILE_MPEG4_SIMPLE_STUDIO => Profile::MPEG4(MPEG4::SimpleStudio),
377                AV_PROFILE_MPEG4_ADVANCED_SIMPLE => Profile::MPEG4(MPEG4::AdvancedSimple),
378
379                _ => Profile::Unknown,
380            },
381
382            Id::JPEG2000 => match value {
383                AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 => {
384                    Profile::JPEG2000(JPEG2000::CStreamRestriction0)
385                }
386                AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 => {
387                    Profile::JPEG2000(JPEG2000::CStreamRestriction1)
388                }
389                AV_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION => {
390                    Profile::JPEG2000(JPEG2000::CStreamNoRestriction)
391                }
392                AV_PROFILE_JPEG2000_DCINEMA_2K => Profile::JPEG2000(JPEG2000::DCinema2K),
393                AV_PROFILE_JPEG2000_DCINEMA_4K => Profile::JPEG2000(JPEG2000::DCinema4K),
394
395                _ => Profile::Unknown,
396            },
397
398            Id::VP9 => match value {
399                AV_PROFILE_VP9_0 => Profile::VP9(VP9::_0),
400                AV_PROFILE_VP9_1 => Profile::VP9(VP9::_1),
401                AV_PROFILE_VP9_2 => Profile::VP9(VP9::_2),
402                AV_PROFILE_VP9_3 => Profile::VP9(VP9::_3),
403
404                _ => Profile::Unknown,
405            },
406
407            Id::HEVC => match value {
408                AV_PROFILE_HEVC_MAIN => Profile::HEVC(HEVC::Main),
409                AV_PROFILE_HEVC_MAIN_10 => Profile::HEVC(HEVC::Main10),
410                AV_PROFILE_HEVC_MAIN_STILL_PICTURE => Profile::HEVC(HEVC::MainStillPicture),
411                AV_PROFILE_HEVC_REXT => Profile::HEVC(HEVC::Rext),
412
413                _ => Profile::Unknown,
414            },
415
416            Id::VVC => Profile::VVC(match value {
417                AV_PROFILE_VVC_MAIN_10 => VVC::Main10,
418                AV_PROFILE_VVC_MAIN_10_444 => VVC::Main10_444,
419
420                _ => return Profile::Unknown,
421            }),
422
423            Id::AV1 => Profile::AV1(match value {
424                AV_PROFILE_AV1_MAIN => AV1::Main,
425                AV_PROFILE_AV1_HIGH => AV1::High,
426                AV_PROFILE_AV1_PROFESSIONAL => AV1::Professional,
427
428                _ => return Profile::Unknown,
429            }),
430
431            Id::MJPEG => Profile::MJPEG(match value {
432                AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT => MJPEG::HuffmanBaselineDCT,
433                AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT => {
434                    MJPEG::HuffmanExtendedSequentialDCT
435                }
436                AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT => MJPEG::HuffmanProgressiveDCT,
437                AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS => MJPEG::HuffmanLossless,
438                AV_PROFILE_MJPEG_JPEG_LS => MJPEG::JPEG_LS,
439
440                _ => return Profile::Unknown,
441            }),
442
443            Id::PRORES => Profile::ProRes(match value {
444                AV_PROFILE_PRORES_PROXY => ProRes::Proxy,
445                AV_PROFILE_PRORES_LT => ProRes::LT,
446                AV_PROFILE_PRORES_STANDARD => ProRes::Standard,
447                AV_PROFILE_PRORES_HQ => ProRes::HQ,
448                AV_PROFILE_PRORES_4444 => ProRes::_4444,
449                AV_PROFILE_PRORES_XQ => ProRes::XQ,
450
451                _ => return Profile::Unknown,
452            }),
453
454            #[cfg(feature = "ffmpeg_8_0")]
455            Id::PRORES_RAW => Profile::ProResRAW(match value {
456                AV_PROFILE_PRORES_RAW => ProResRAW::Default,
457                AV_PROFILE_PRORES_RAW_HQ => ProResRAW::HQ,
458
459                _ => return Profile::Unknown,
460            }),
461
462            Id::ARIB_CAPTION => Profile::ARIB(match value {
463                AV_PROFILE_ARIB_PROFILE_A => ARIB::ProfileA,
464                AV_PROFILE_ARIB_PROFILE_C => ARIB::ProfileC,
465
466                _ => return Profile::Unknown,
467            }),
468
469            Id::SMPTE_KLV => Profile::KLVA(match value {
470                AV_PROFILE_KLVA_SYNC => KLVA::Sync,
471                AV_PROFILE_KLVA_ASYNC => KLVA::Async,
472
473                _ => return Profile::Unknown,
474            }),
475
476            Id::EVC => Profile::EVC(match value {
477                AV_PROFILE_EVC_BASELINE => EVC::Baseline,
478                AV_PROFILE_EVC_MAIN => EVC::Main,
479
480                _ => return Profile::Unknown,
481            }),
482
483            #[cfg(feature = "ffmpeg_8_0")]
484            Id::APV => Profile::APV(match value {
485                AV_PROFILE_APV_422_10 => APV::_422_10,
486                AV_PROFILE_APV_422_12 => APV::_422_12,
487                AV_PROFILE_APV_444_10 => APV::_444_10,
488                AV_PROFILE_APV_444_12 => APV::_444_12,
489                AV_PROFILE_APV_4444_10 => APV::_4444_10,
490                AV_PROFILE_APV_4444_12 => APV::_4444_12,
491                AV_PROFILE_APV_400_10 => APV::_400_10,
492
493                _ => return Profile::Unknown,
494            }),
495
496            _ => Profile::Unknown,
497        }
498    }
499}
500
501impl From<Profile> for c_int {
502    fn from(value: Profile) -> c_int {
503        match value {
504            Profile::Unknown => AV_PROFILE_UNKNOWN,
505            Profile::Reserved => AV_PROFILE_RESERVED,
506
507            Profile::AAC(AAC::Main) => AV_PROFILE_AAC_MAIN,
508            Profile::AAC(AAC::Low) => AV_PROFILE_AAC_LOW,
509            Profile::AAC(AAC::SSR) => AV_PROFILE_AAC_SSR,
510            Profile::AAC(AAC::LTP) => AV_PROFILE_AAC_LTP,
511            Profile::AAC(AAC::HE) => AV_PROFILE_AAC_HE,
512            Profile::AAC(AAC::HEv2) => AV_PROFILE_AAC_HE_V2,
513            Profile::AAC(AAC::LD) => AV_PROFILE_AAC_LD,
514            Profile::AAC(AAC::ELD) => AV_PROFILE_AAC_ELD,
515
516            Profile::AAC(AAC::MPEG2Low) => AV_PROFILE_MPEG2_AAC_LOW,
517            Profile::AAC(AAC::MPEG2HE) => AV_PROFILE_MPEG2_AAC_HE,
518
519            Profile::DNXHD(DNXHD::HD) => AV_PROFILE_DNXHD,
520            Profile::DNXHD(DNXHD::HR_LB) => AV_PROFILE_DNXHR_LB,
521            Profile::DNXHD(DNXHD::HR_SQ) => AV_PROFILE_DNXHR_SQ,
522            Profile::DNXHD(DNXHD::HR_HQ) => AV_PROFILE_DNXHR_HQ,
523            Profile::DNXHD(DNXHD::HR_HQX) => AV_PROFILE_DNXHR_HQX,
524            Profile::DNXHD(DNXHD::HR_444) => AV_PROFILE_DNXHR_444,
525
526            Profile::DTS(DTS::Default) => AV_PROFILE_DTS,
527            Profile::DTS(DTS::ES) => AV_PROFILE_DTS_ES,
528            Profile::DTS(DTS::_96_24) => AV_PROFILE_DTS_96_24,
529            Profile::DTS(DTS::HD_HRA) => AV_PROFILE_DTS_HD_HRA,
530            Profile::DTS(DTS::HD_MA) => AV_PROFILE_DTS_HD_MA,
531            Profile::DTS(DTS::Express) => AV_PROFILE_DTS_EXPRESS,
532            Profile::DTS(DTS::HD_MA_X) => AV_PROFILE_DTS_HD_MA_X,
533            Profile::DTS(DTS::HD_MA_X_IMAX) => AV_PROFILE_DTS_HD_MA_X_IMAX,
534
535            Profile::EAC3_DDP_Atmos => AV_PROFILE_EAC3_DDP_ATMOS,
536
537            Profile::TrueHD_Atmos => AV_PROFILE_TRUEHD_ATMOS,
538
539            Profile::MPEG2(MPEG2::_422) => AV_PROFILE_MPEG2_422,
540            Profile::MPEG2(MPEG2::High) => AV_PROFILE_MPEG2_HIGH,
541            Profile::MPEG2(MPEG2::SS) => AV_PROFILE_MPEG2_SS,
542            Profile::MPEG2(MPEG2::SNRScalable) => AV_PROFILE_MPEG2_SNR_SCALABLE,
543            Profile::MPEG2(MPEG2::Main) => AV_PROFILE_MPEG2_MAIN,
544            Profile::MPEG2(MPEG2::Simple) => AV_PROFILE_MPEG2_SIMPLE,
545
546            Profile::H264(H264::Constrained) => AV_PROFILE_H264_CONSTRAINED,
547            Profile::H264(H264::Intra) => AV_PROFILE_H264_INTRA,
548            Profile::H264(H264::Baseline) => AV_PROFILE_H264_BASELINE,
549            Profile::H264(H264::ConstrainedBaseline) => AV_PROFILE_H264_CONSTRAINED_BASELINE,
550            Profile::H264(H264::Main) => AV_PROFILE_H264_MAIN,
551            Profile::H264(H264::Extended) => AV_PROFILE_H264_EXTENDED,
552            Profile::H264(H264::High) => AV_PROFILE_H264_HIGH,
553            Profile::H264(H264::High10) => AV_PROFILE_H264_HIGH_10,
554            Profile::H264(H264::High10Intra) => AV_PROFILE_H264_HIGH_10_INTRA,
555            Profile::H264(H264::High422) => AV_PROFILE_H264_HIGH_422,
556            Profile::H264(H264::High422Intra) => AV_PROFILE_H264_HIGH_422_INTRA,
557            Profile::H264(H264::High444) => AV_PROFILE_H264_HIGH_444,
558            Profile::H264(H264::High444Predictive) => AV_PROFILE_H264_HIGH_444_PREDICTIVE,
559            Profile::H264(H264::High444Intra) => AV_PROFILE_H264_HIGH_444_INTRA,
560            Profile::H264(H264::CAVLC444) => AV_PROFILE_H264_CAVLC_444,
561
562            Profile::VC1(VC1::Simple) => AV_PROFILE_VC1_SIMPLE,
563            Profile::VC1(VC1::Main) => AV_PROFILE_VC1_MAIN,
564            Profile::VC1(VC1::Complex) => AV_PROFILE_VC1_COMPLEX,
565            Profile::VC1(VC1::Advanced) => AV_PROFILE_VC1_ADVANCED,
566
567            Profile::MPEG4(MPEG4::Simple) => AV_PROFILE_MPEG4_SIMPLE,
568            Profile::MPEG4(MPEG4::SimpleScalable) => AV_PROFILE_MPEG4_SIMPLE_SCALABLE,
569            Profile::MPEG4(MPEG4::Core) => AV_PROFILE_MPEG4_CORE,
570            Profile::MPEG4(MPEG4::Main) => AV_PROFILE_MPEG4_MAIN,
571            Profile::MPEG4(MPEG4::NBit) => AV_PROFILE_MPEG4_N_BIT,
572            Profile::MPEG4(MPEG4::ScalableTexture) => AV_PROFILE_MPEG4_SCALABLE_TEXTURE,
573            Profile::MPEG4(MPEG4::SimpleFaceAnimation) => AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION,
574            Profile::MPEG4(MPEG4::BasicAnimatedTexture) => AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE,
575            Profile::MPEG4(MPEG4::Hybrid) => AV_PROFILE_MPEG4_HYBRID,
576            Profile::MPEG4(MPEG4::AdvancedRealTime) => AV_PROFILE_MPEG4_ADVANCED_REAL_TIME,
577            Profile::MPEG4(MPEG4::CoreScalable) => AV_PROFILE_MPEG4_CORE_SCALABLE,
578            Profile::MPEG4(MPEG4::AdvancedCoding) => AV_PROFILE_MPEG4_ADVANCED_CODING,
579            Profile::MPEG4(MPEG4::AdvancedCore) => AV_PROFILE_MPEG4_ADVANCED_CORE,
580            Profile::MPEG4(MPEG4::AdvancedScalableTexture) => {
581                AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE
582            }
583            Profile::MPEG4(MPEG4::SimpleStudio) => AV_PROFILE_MPEG4_SIMPLE_STUDIO,
584            Profile::MPEG4(MPEG4::AdvancedSimple) => AV_PROFILE_MPEG4_ADVANCED_SIMPLE,
585
586            Profile::JPEG2000(JPEG2000::CStreamRestriction0) => {
587                AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0
588            }
589            Profile::JPEG2000(JPEG2000::CStreamRestriction1) => {
590                AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1
591            }
592            Profile::JPEG2000(JPEG2000::CStreamNoRestriction) => {
593                AV_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION
594            }
595            Profile::JPEG2000(JPEG2000::DCinema2K) => AV_PROFILE_JPEG2000_DCINEMA_2K,
596            Profile::JPEG2000(JPEG2000::DCinema4K) => AV_PROFILE_JPEG2000_DCINEMA_4K,
597
598            Profile::VP9(VP9::_0) => AV_PROFILE_VP9_0,
599            Profile::VP9(VP9::_1) => AV_PROFILE_VP9_1,
600            Profile::VP9(VP9::_2) => AV_PROFILE_VP9_2,
601            Profile::VP9(VP9::_3) => AV_PROFILE_VP9_3,
602
603            Profile::HEVC(HEVC::Main) => AV_PROFILE_HEVC_MAIN,
604            Profile::HEVC(HEVC::Main10) => AV_PROFILE_HEVC_MAIN_10,
605            Profile::HEVC(HEVC::MainStillPicture) => AV_PROFILE_HEVC_MAIN_STILL_PICTURE,
606            Profile::HEVC(HEVC::Rext) => AV_PROFILE_HEVC_REXT,
607
608            Profile::VVC(VVC::Main10) => AV_PROFILE_VVC_MAIN_10,
609            Profile::VVC(VVC::Main10_444) => AV_PROFILE_VVC_MAIN_10_444,
610
611            Profile::AV1(AV1::Main) => AV_PROFILE_AV1_MAIN,
612            Profile::AV1(AV1::High) => AV_PROFILE_AV1_HIGH,
613            Profile::AV1(AV1::Professional) => AV_PROFILE_AV1_PROFESSIONAL,
614
615            Profile::MJPEG(MJPEG::HuffmanBaselineDCT) => AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT,
616            Profile::MJPEG(MJPEG::HuffmanExtendedSequentialDCT) => {
617                AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT
618            }
619            Profile::MJPEG(MJPEG::HuffmanProgressiveDCT) => {
620                AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT
621            }
622            Profile::MJPEG(MJPEG::HuffmanLossless) => AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS,
623            Profile::MJPEG(MJPEG::JPEG_LS) => AV_PROFILE_MJPEG_JPEG_LS,
624
625            Profile::SBC_MSBC => AV_PROFILE_SBC_MSBC,
626
627            Profile::ProRes(ProRes::Proxy) => AV_PROFILE_PRORES_PROXY,
628            Profile::ProRes(ProRes::LT) => AV_PROFILE_PRORES_LT,
629            Profile::ProRes(ProRes::Standard) => AV_PROFILE_PRORES_STANDARD,
630            Profile::ProRes(ProRes::HQ) => AV_PROFILE_PRORES_HQ,
631            Profile::ProRes(ProRes::_4444) => AV_PROFILE_PRORES_4444,
632            Profile::ProRes(ProRes::XQ) => AV_PROFILE_PRORES_XQ,
633
634            #[cfg(feature = "ffmpeg_8_0")]
635            Profile::ProResRAW(ProResRAW::Default) => AV_PROFILE_PRORES_RAW,
636            #[cfg(feature = "ffmpeg_8_0")]
637            Profile::ProResRAW(ProResRAW::HQ) => AV_PROFILE_PRORES_RAW_HQ,
638
639            Profile::ARIB(ARIB::ProfileA) => AV_PROFILE_ARIB_PROFILE_A,
640            Profile::ARIB(ARIB::ProfileC) => AV_PROFILE_ARIB_PROFILE_C,
641
642            Profile::KLVA(KLVA::Sync) => AV_PROFILE_KLVA_SYNC,
643            Profile::KLVA(KLVA::Async) => AV_PROFILE_KLVA_ASYNC,
644
645            Profile::EVC(EVC::Baseline) => AV_PROFILE_EVC_BASELINE,
646            Profile::EVC(EVC::Main) => AV_PROFILE_EVC_MAIN,
647
648            #[cfg(feature = "ffmpeg_8_0")]
649            Profile::APV(APV::_422_10) => AV_PROFILE_APV_422_10,
650            #[cfg(feature = "ffmpeg_8_0")]
651            Profile::APV(APV::_422_12) => AV_PROFILE_APV_422_12,
652            #[cfg(feature = "ffmpeg_8_0")]
653            Profile::APV(APV::_444_10) => AV_PROFILE_APV_444_10,
654            #[cfg(feature = "ffmpeg_8_0")]
655            Profile::APV(APV::_444_12) => AV_PROFILE_APV_444_12,
656            #[cfg(feature = "ffmpeg_8_0")]
657            Profile::APV(APV::_4444_10) => AV_PROFILE_APV_4444_10,
658            #[cfg(feature = "ffmpeg_8_0")]
659            Profile::APV(APV::_4444_12) => AV_PROFILE_APV_4444_12,
660            #[cfg(feature = "ffmpeg_8_0")]
661            Profile::APV(APV::_400_10) => AV_PROFILE_APV_400_10,
662        }
663    }
664}
665
666pub struct ProfileIter {
667    id: Id,
668    ptr: *const AVProfile,
669}
670
671impl ProfileIter {
672    pub fn new(id: Id, ptr: *const AVProfile) -> Self {
673        ProfileIter { id, ptr }
674    }
675}
676
677impl Iterator for ProfileIter {
678    type Item = Profile;
679
680    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
681        unsafe {
682            if (*self.ptr).profile == AV_PROFILE_UNKNOWN {
683                return None;
684            }
685
686            let profile = Profile::from((self.id, (*self.ptr).profile));
687            self.ptr = self.ptr.offset(1);
688
689            Some(profile)
690        }
691    }
692}