1 /*
2  * Copyright (C) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef MEDIA_AVCODEC_INFO_H
17 #define MEDIA_AVCODEC_INFO_H
18 
19 #include <cstdint>
20 #include <memory>
21 #include <vector>
22 #include "av_common.h"
23 #include "nocopyable.h"
24 #include "avcodec_audio_common.h"
25 
26 namespace OHOS {
27 namespace MediaAVCodec {
28 /**
29  * @brief AVCodec Type
30  *
31  * @since 3.1
32  * @version 4.0
33  */
34 enum AVCodecType : int32_t {
35     AVCODEC_TYPE_NONE = -1,
36     AVCODEC_TYPE_VIDEO_ENCODER = 0,
37     AVCODEC_TYPE_VIDEO_DECODER,
38     AVCODEC_TYPE_AUDIO_ENCODER,
39     AVCODEC_TYPE_AUDIO_DECODER,
40 };
41 
42 /**
43  * @brief AVCodec Category
44  *
45  * @since 3.1
46  * @version 4.0
47  */
48 enum class AVCodecCategory : int32_t {
49     AVCODEC_NONE = -1,
50     AVCODEC_HARDWARE = 0,
51     AVCODEC_SOFTWARE,
52 };
53 
54 /**
55  * @brief The enum of optional features that can be used in specific codec seenarios.
56  *
57  * @since 5.0
58  * @version 5.0
59  */
60 enum class AVCapabilityFeature : int32_t {
61     VIDEO_ENCODER_TEMPORAL_SCALABILITY = 0,
62     VIDEO_ENCODER_LONG_TERM_REFERENCE = 1,
63     VIDEO_LOW_LATENCY = 2,
64     VIDEO_WATERMARK = 3,
65     VIDEO_RPR = 4,
66     MAX_VALUE
67 };
68 
69 /**
70  * @brief Range contain min and max value
71  *
72  * @since 3.1
73  * @version 5.0
74  */
75 struct Range {
76     int32_t minVal;
77     int32_t maxVal;
RangeOHOS::MediaAVCodec::Range78     Range() : minVal(0), maxVal(0) {}
RangeOHOS::MediaAVCodec::Range79     Range(const int32_t &min, const int32_t &max)
80     {
81         if (min <= max) {
82             this->minVal = min;
83             this->maxVal = max;
84         } else {
85             this->minVal = 0;
86             this->maxVal = 0;
87         }
88     }
89 
CreateOHOS::MediaAVCodec::Range90     Range Create(const int32_t &min, const int32_t &max)
91     {
92         return Range(min, max);
93     }
94 
IntersectOHOS::MediaAVCodec::Range95     Range Intersect(const int32_t &min, const int32_t &max)
96     {
97         int32_t minCmp = this->minVal > min ? this->minVal : min;
98         int32_t maxCmp = this->maxVal < max ? this->maxVal : max;
99         return this->Create(minCmp, maxCmp);
100     }
101 
IntersectOHOS::MediaAVCodec::Range102     Range Intersect(const Range &range)
103     {
104         int32_t minCmp = this->minVal > range.minVal ? this->minVal : range.minVal;
105         int32_t maxCmp = this->maxVal < range.maxVal ? this->maxVal : range.maxVal;
106         return this->Create(minCmp, maxCmp);
107     }
108 
InRangeOHOS::MediaAVCodec::Range109     bool InRange(int32_t value)
110     {
111         return (value >= minVal && value <= maxVal);
112     }
113 };
114 
115 /**
116  * @brief ImgSize contain width and height
117  *
118  * @since 3.1
119  * @version 4.0
120  */
121 struct ImgSize {
122     int32_t width;
123     int32_t height;
124 
ImgSizeOHOS::MediaAVCodec::ImgSize125     ImgSize() : width(0), height(0) {}
126 
ImgSizeOHOS::MediaAVCodec::ImgSize127     ImgSize(const int32_t &width, const int32_t &height)
128     {
129         this->width = width;
130         this->height = height;
131     }
132 
operator <OHOS::MediaAVCodec::ImgSize133     bool operator<(const ImgSize &p) const
134     {
135         return (width < p.width) || (width == p.width && height < p.height);
136     }
137 };
138 
139 /**
140  * @brief Capability Data struct of Codec, parser from config file
141  *
142  * @since 3.1
143  * @version 4.0
144  */
145 struct CapabilityData {
146     std::string codecName = "";
147     int32_t codecType = AVCODEC_TYPE_NONE;
148     std::string mimeType = "";
149     bool isVendor = false;
150     int32_t maxInstance = 0;
151     Range bitrate;
152     Range channels;
153     Range complexity;
154     ImgSize alignment;
155     Range width;
156     Range height;
157     Range frameRate;
158     Range encodeQuality;
159     Range blockPerFrame;
160     Range blockPerSecond;
161     ImgSize blockSize;
162     std::vector<int32_t> sampleRate;
163     std::vector<int32_t> pixFormat;
164     std::vector<int32_t> bitDepth;
165     std::vector<int32_t> profiles;
166     std::vector<int32_t> bitrateMode;
167     std::map<int32_t, std::vector<int32_t>> profileLevelsMap;
168     std::map<ImgSize, Range> measuredFrameRate;
169     bool supportSwapWidthHeight = false;
170     std::map<int32_t, Format> featuresMap;
171 };
172 
173 struct LevelParams {
174     int32_t maxBlockPerFrame = 0;
175     int32_t maxBlockPerSecond = 0;
176     int32_t maxFrameRate = 0;
177     int32_t maxWidth = 0;
178     int32_t maxHeight = 0;
LevelParamsOHOS::MediaAVCodec::LevelParams179     LevelParams(const int32_t &blockPerSecond, const int32_t &blockPerFrame, const int32_t &frameRate,
180                 const int32_t &width, const int32_t height)
181     {
182         this->maxBlockPerFrame = blockPerFrame;
183         this->maxBlockPerSecond = blockPerSecond;
184         this->maxFrameRate = frameRate;
185         this->maxWidth = width;
186         this->maxHeight = height;
187     }
LevelParamsOHOS::MediaAVCodec::LevelParams188     LevelParams(const int32_t &blockPerSecond, const int32_t &blockPerFrame)
189     {
190         this->maxBlockPerFrame = blockPerFrame;
191         this->maxBlockPerSecond = blockPerSecond;
192     }
193 };
194 
195 class __attribute__((visibility("default"))) AVCodecInfo {
196 public:
197     explicit AVCodecInfo(CapabilityData *capabilityData);
198     ~AVCodecInfo();
199 
200     /**
201      * @brief Get name of this codec, used to create the codec instance.
202      * @return Returns codec name.
203      * @since 3.1
204      * @version 4.0
205      */
206     std::string GetName();
207 
208     /**
209      * @brief Get type of this codec
210      * @return Returns codec type, see {@link AVCodecType}
211      * @since 3.1
212      * @version 4.0
213      */
214     AVCodecType GetType();
215 
216     /**
217      * @brief Get mime type of this codec
218      * @return Returns codec mime type, see {@link CodecMimeType}
219      * @since 3.1
220      * @version 4.0
221      */
222     std::string GetMimeType();
223 
224     /**
225      * @brief Check whether the codec is accelerated by hardware.
226      * @return Returns true if the codec is hardware accelerated; false otherwise.
227      * @since 3.1
228      * @version 4.0
229      */
230     bool IsHardwareAccelerated();
231 
232     /**
233      * @brief Check whether the codec is accelerated by hardware.
234      * @return Returns true if the codec is hardware accelerated; false otherwise.
235      * @since 3.1
236      * @version 4.0
237      */
238     int32_t GetMaxSupportedInstances();
239 
240     /**
241      * @brief Check whether the codec is software implemented only.
242      * @return Returns true if the codec is software implemented only; false otherwise.
243      * @since 3.1
244      * @version 4.0
245      */
246     bool IsSoftwareOnly();
247 
248     /**
249      * @brief Check whether the codec is provided by vendor.
250      * @return Returns true if the codec is provided by vendor; false otherwise.
251      * @since 3.1
252      * @version 4.0
253      */
254     bool IsVendor();
255 
256     /**
257      * @brief Get supported codec profile number.
258      * @return Returns an array of supported codec profile number. For details, see {@link AACProfile}.
259      * @since 3.1
260      * @version 4.0
261      */
262     std::map<int32_t, std::vector<int32_t>> GetSupportedLevelsForProfile();
263 
264     /**
265      * @brief Check if the codec supports a specified feature.
266      * @param feature Feature enum, refer to {@link AVCapabilityFeature} for details
267      * @return Returns true if the feature is supported, false if it is not supported
268      * @since 5.0
269      * @version 5.0
270      */
271     bool IsFeatureSupported(AVCapabilityFeature feature);
272 
273     /**
274      * @brief Get the properties of a specified feature.
275      * @param feature Feature enum, refer to {@link AVCapabilityFeature} for details
276      * @param format Output parameter, get parametr of specified feature
277      * @return Returns {@link AVCS_ERR_OK} if success, returns an error code otherwise
278      * @since 5.0
279      * @version 5.0
280      */
281     int32_t GetFeatureProperties(AVCapabilityFeature feature, Format &format);
282 
283 private:
284     bool IsFeatureValid(AVCapabilityFeature feature);
285     CapabilityData *data_;
286 };
287 
288 class __attribute__((visibility("default"))) VideoCaps {
289 public:
290     explicit VideoCaps(CapabilityData *capabilityData);
291     ~VideoCaps();
292 
293     /**
294      * @brief Get codec information,  such as the codec name, codec type,
295      * whether hardware acceleration is supported, whether only software is supported,
296      * and whether the codec is provided by the vendor.
297      * @return Returns the pointer of {@link AVCodecInfo}.
298      * @since 3.1
299      * @version 4.0
300      */
301     std::shared_ptr<AVCodecInfo> GetCodecInfo();
302 
303     /**
304      * @brief Get supported bitrate range.
305      * @return Returns the range of supported bitrates.
306      * @since 3.1
307      * @version 4.0
308      */
309     Range GetSupportedBitrate();
310 
311     /**
312      * @brief Get supported video raw formats.
313      * @return Returns an array of supported formats. For Details, see {@link VideoPixelFormat}.
314      * @since 3.1
315      * @version 4.0
316      */
317     std::vector<int32_t> GetSupportedFormats();
318 
319     /**
320      * @brief Get supported alignment of video height, only used for video codecs.
321      * @return Returns the supported alignment of video height (in pixels).
322      * @since 3.1
323      * @version 4.0
324      */
325     int32_t GetSupportedHeightAlignment();
326 
327     /**
328      * @brief Get supported alignment of video width, only used for video codecs.
329      * @return Returns the supported alignment of video width (in pixels).
330      * @since 3.1
331      * @version 4.0
332      */
333     int32_t GetSupportedWidthAlignment();
334 
335     /**
336      * @brief Get supported width range of video.
337      * @return Returns the supported width range of video.
338      * @since 3.1
339      * @version 4.0
340      */
341     Range GetSupportedWidth();
342 
343     /**
344      * @brief Get supported height range of video.
345      * @return Returns the supported height range of video.
346      * @since 3.1
347      * @version 4.0
348      */
349     Range GetSupportedHeight();
350 
351     /**
352      * @brief Get supported profiles of this codec.
353      * @return Returns an array of supported profiles:
354      * returns {@link H263Profile} array if codec is h263,
355      * returns {@link AVCProfile} array if codec is h264,
356      * returns {@link HEVCProfile} array if codec is h265,
357      * returns {@link MPEG2Profile} array if codec is mpeg2,
358      * returns {@link MPEG4Profile} array if codec is mpeg4,
359      * returns {@link VP8Profile} array if codec is vp8.
360      * @since 3.1
361      * @version 4.0
362      */
363     std::vector<int32_t> GetSupportedProfiles();
364 
365     /**
366      * @brief Get supported codec level array.
367      * @return Returns an array of supported codec level number.
368      * @since 3.1
369      * @version 4.0
370      */
371     std::vector<int32_t> GetSupportedLevels();
372 
373     /**
374      * @brief Get supported video encode quality Range.
375      * @return Returns an array of supported video encode quality Range.
376      * @since 3.1
377      * @version 4.0
378      */
379     Range GetSupportedEncodeQuality();
380 
381     /**
382      * @brief Check whether the width and height is supported.
383      * @param width Indicates the specified video width (in pixels).
384      * @param height Indicates the specified video height (in pixels).
385      * @return Returns true if the codec supports {@link width} * {@link height} size video, false otherwise.
386      * @since 3.1
387      * @version 4.0
388      */
389     bool IsSizeSupported(int32_t width, int32_t height);
390 
391     /**
392      * @brief Get supported frameRate.
393      * @return Returns the supported frameRate range of video.
394      * @since 3.1
395      * @version 4.0
396      */
397     Range GetSupportedFrameRate();
398 
399     /**
400      * @brief Get supported frameRate range for the specified width and height.
401      * @param width Indicates the specified video width (in pixels).
402      * @param height Indicates the specified video height (in pixels).
403      * @return Returns the supported frameRate range for the specified width and height.
404      * @since 3.1
405      * @version 4.0
406      */
407     Range GetSupportedFrameRatesFor(int32_t width, int32_t height);
408 
409     /**
410      * @brief Check whether the size and frameRate is supported.
411      * @param width Indicates the specified video width (in pixels).
412      * @param height Indicates the specified video height (in pixels).
413      * @param frameRate Indicates the specified video frameRate.
414      * @return Returns true if the codec supports the specified size and frameRate; false otherwise.
415      * @since 3.1
416      * @version 4.0
417      */
418     bool IsSizeAndRateSupported(int32_t width, int32_t height, double frameRate);
419 
420     /**
421      * @brief Get preferred frameRate range for the specified width and height,
422      * these framerates can be reach the performance.
423      * @param width Indicates the specified video width (in pixels).
424      * @param height Indicates the specified video height (in pixels).
425      * @return Returns preferred frameRate range for the specified width and height.
426      * @since 3.1
427      * @version 4.0
428      */
429     Range GetPreferredFrameRate(int32_t width, int32_t height);
430 
431     /**
432      * @brief Get supported encode bitrate mode.
433      * @return Returns an array of supported encode bitrate mode. For details, see {@link VideoEncodeBitrateMode}.
434      * @since 3.1
435      * @version 4.0
436      */
437     std::vector<int32_t> GetSupportedBitrateMode();
438 
439     /**
440      * @brief Get supported encode qualit range.
441      * @return Returns supported encode qualit range.
442      * @since 3.1
443      * @version 4.0
444      */
445     Range GetSupportedQuality();
446 
447     /**
448      * @brief Get supported encode complexity range.
449      * @return Returns supported encode complexity range.
450      * @since 3.1
451      * @version 4.0
452      */
453     Range GetSupportedComplexity();
454 
455     /**
456      * @brief Check video encoder wether support request key frame dynamicly.
457      * @return Returns true if support, false not support.
458      * @since 3.1
459      * @version 4.0
460      */
461     bool IsSupportDynamicIframe();
462 
463     Range GetVideoHeightRangeForWidth(int32_t width);
464     Range GetVideoWidthRangeForHeight(int32_t height);
465 
466 private:
467     CapabilityData *data_;
468     int32_t blockWidth_ = 0;
469     int32_t blockHeight_ = 0;
470     Range horizontalBlockRange_;
471     Range verticalBlockRange_;
472     Range blockPerFrameRange_;
473     Range blockPerSecondRange_;
474     Range widthRange_;
475     Range heightRange_;
476     Range frameRateRange_;
477     void InitParams();
478     void UpdateParams();
479     void LoadLevelParams();
480     void LoadAVCLevelParams();
481     void LoadMPEGLevelParams(const std::string &mime);
482     ImgSize MatchClosestSize(const ImgSize &imgSize);
483     int32_t DivCeil(const int32_t &dividend, const int32_t &divisor);
484     Range DivRange(const Range &range, const int32_t &divisor);
485     void UpdateBlockParams(const int32_t &blockWidth, const int32_t &blockHeight, Range &blockPerFrameRange,
486                            Range &blockPerSecondRange);
487 };
488 
489 constexpr uint32_t MAX_MAP_SIZE = 20;
490 
491 class __attribute__((visibility("default"))) AudioCaps {
492 public:
493     explicit AudioCaps(CapabilityData *capabilityData);
494     ~AudioCaps();
495 
496     /**
497      * @brief Get codec information,  such as the codec name, codec type,
498      * whether hardware acceleration is supported, whether only software is supported,
499      * and whether the codec is provided by the vendor.
500      * @return Returns the pointer of {@link AVCodecInfo}
501      * @since 3.1
502      * @version 4.0
503      */
504     std::shared_ptr<AVCodecInfo> GetCodecInfo();
505 
506     /**
507      * @brief Get supported bitrate range.
508      * @return Returns the range of supported bitrates.
509      * @since 3.1
510      * @version 4.0
511      */
512     Range GetSupportedBitrate();
513 
514     /**
515      * @brief Get supported channel range.
516      * @return Returns the range of supported channel.
517      * @since 3.1
518      * @version 4.0
519      */
520     Range GetSupportedChannel();
521 
522     /**
523      * @brief Get supported audio raw format range.
524      * @return Returns the range of supported audio raw format. For details, see {@link AudioSampleFormat}.
525      * @since 3.1
526      * @version 4.0
527      */
528     std::vector<int32_t> GetSupportedFormats();
529 
530     /**
531      * @brief Get supported audio samplerates.
532      * @return Returns an array of supported samplerates.
533      * @since 3.1
534      * @version 4.0
535      */
536     std::vector<int32_t> GetSupportedSampleRates();
537 
538     /**
539      * @brief Get supported codec profile number.
540      * @return Returns an array of supported codec profile number. For details, see {@link AACProfile}.
541      * @since 3.1
542      * @version 4.0
543      */
544     std::vector<int32_t> GetSupportedProfiles();
545 
546     /**
547      * @brief Get supported codec level array.
548      * @return Returns an array of supported codec level number.
549      * @since 3.1
550      * @version 4.0
551      */
552     std::vector<int32_t> GetSupportedLevels();
553 
554     /**
555      * @brief Get supported encode complexity range.
556      * @return Returns supported encode complexity range.
557      * @since 3.1
558      * @version 4.0
559      */
560     Range GetSupportedComplexity();
561 
562 private:
563     CapabilityData *data_;
564 };
565 
566 /**
567  * @brief Enumerates the codec mime type.
568  */
569 class CodecMimeType {
570 public:
571     static constexpr std::string_view VIDEO_H263 = "video/h263";
572     static constexpr std::string_view VIDEO_AVC = "video/avc";
573     static constexpr std::string_view VIDEO_MPEG2 = "video/mpeg2";
574     static constexpr std::string_view VIDEO_HEVC = "video/hevc";
575     static constexpr std::string_view VIDEO_MPEG4 = "video/mp4v-es";
576     static constexpr std::string_view VIDEO_VP8 = "video/x-vnd.on2.vp8";
577     static constexpr std::string_view VIDEO_VP9 = "video/x-vnd.on2.vp9";
578     static constexpr std::string_view AUDIO_AMR_NB = "audio/3gpp";
579     static constexpr std::string_view AUDIO_AMR_WB = "audio/amr-wb";
580     static constexpr std::string_view AUDIO_MPEG = "audio/mpeg";
581     static constexpr std::string_view AUDIO_AAC = "audio/mp4a-latm";
582     static constexpr std::string_view AUDIO_VORBIS = "audio/vorbis";
583     static constexpr std::string_view AUDIO_OPUS = "audio/opus";
584     static constexpr std::string_view AUDIO_FLAC = "audio/flac";
585     static constexpr std::string_view AUDIO_RAW = "audio/raw";
586     static constexpr std::string_view AUDIO_G711MU = "audio/g711mu";
587     static constexpr std::string_view IMAGE_JPG = "image/jpeg";
588     static constexpr std::string_view IMAGE_PNG = "image/png";
589     static constexpr std::string_view IMAGE_BMP = "image/bmp";
590     static constexpr std::string_view AUDIO_AVS3DA = "audio/av3a";
591     static constexpr std::string_view AUDIO_LBVC = "audio/lbvc";
592     static constexpr std::string_view AUDIO_APE = "audio/x-ape";
593 };
594 
595 /**
596  * @brief AVC Profile
597  *
598  * @since 3.1
599  * @version 4.0
600  */
601 enum AVCProfile : int32_t {
602     AVC_PROFILE_BASELINE = 0,
603     AVC_PROFILE_CONSTRAINED_BASELINE = 1,
604     AVC_PROFILE_CONSTRAINED_HIGH = 2,
605     AVC_PROFILE_EXTENDED = 3,
606     AVC_PROFILE_HIGH = 4,
607     AVC_PROFILE_HIGH_10 = 5,
608     AVC_PROFILE_HIGH_422 = 6,
609     AVC_PROFILE_HIGH_444 = 7,
610     AVC_PROFILE_MAIN = 8,
611 };
612 
613 /**
614  * @brief HEVC Profile
615  *
616  * @since 3.1
617  * @version 4.0
618  */
619 enum HEVCProfile : int32_t {
620     HEVC_PROFILE_MAIN = 0,
621     HEVC_PROFILE_MAIN_10 = 1,
622     HEVC_PROFILE_MAIN_STILL = 2,
623     HEVC_PROFILE_MAIN_10_HDR10 = 3,
624     HEVC_PROFILE_MAIN_10_HDR10_PLUS = 4,
625     HEVC_PROFILE_UNKNOW = -1,
626 };
627 
628 /**
629  * @brief MPEG2 Profile
630  *
631  * @since 3.1
632  * @version 4.0
633  */
634 enum MPEG2Profile : int32_t {
635     MPEG2_PROFILE_422 = 0,
636     MPEG2_PROFILE_HIGH = 1,
637     MPEG2_PROFILE_MAIN = 2,
638     MPEG2_PROFILE_SNR = 3,
639     MPEG2_PROFILE_SIMPLE = 4,
640     MPEG2_PROFILE_SPATIAL = 5,
641 };
642 
643 /**
644  * @brief MPEG4 Profile
645  *
646  * @since 3.1
647  * @version 4.0
648  */
649 enum MPEG4Profile : int32_t {
650     MPEG4_PROFILE_ADVANCED_CODING = 0,
651     MPEG4_PROFILE_ADVANCED_CORE = 1,
652     MPEG4_PROFILE_ADVANCED_REAL_TIME = 2,
653     MPEG4_PROFILE_ADVANCED_SCALABLE = 3,
654     MPEG4_PROFILE_ADVANCED_SIMPLE = 4,
655     MPEG4_PROFILE_BASIC_ANIMATED = 5,
656     MPEG4_PROFILE_CORE = 6,
657     MPEG4_PROFILE_CORE_SCALABLE = 7,
658     MPEG4_PROFILE_HYBRID = 8,
659     MPEG4_PROFILE_MAIN = 9,
660     MPEG4_PROFILE_NBIT = 10,
661     MPEG4_PROFILE_SCALABLE_TEXTURE = 11,
662     MPEG4_PROFILE_SIMPLE = 12,
663     MPEG4_PROFILE_SIMPLE_FBA = 13,
664     MPEG4_PROFILE_SIMPLE_FACE = 14,
665     MPEG4_PROFILE_SIMPLE_SCALABLE = 15,
666 };
667 
668 /**
669  * @brief H263 Profile
670  *
671  * @since 3.1
672  * @version 4.0
673  */
674 enum H263Profile : int32_t {
675     H263_PROFILE_BACKWARD_COMPATIBLE = 0,
676     H263_PROFILE_BASELINE = 1,
677     H263_PROFILE_H320_CODING = 2,
678     H263_PROFILE_HIGH_COMPRESSION = 3,
679     H263_PROFILE_HIGH_LATENCY = 4,
680     H263_PROFILE_ISW_V2 = 5,
681     H263_PROFILE_ISW_V3 = 6,
682     H263_PROFILE_INTERLACE = 7,
683     H263_PROFILE_INTERNET = 8,
684 };
685 
686 /**
687  * @brief
688  *
689  * @since 3.1
690  * @version 4.0
691  */
692 enum VP8Profile : int32_t {
693     VP8_PROFILE_MAIN = 0,
694 };
695 
696 /**
697  * @brief
698  *
699  * @since 3.1
700  * @version 4.0
701  */
702 enum AVCLevel : int32_t {
703     AVC_LEVEL_1 = 0,
704     AVC_LEVEL_1b = 1,
705     AVC_LEVEL_11 = 2,
706     AVC_LEVEL_12 = 3,
707     AVC_LEVEL_13 = 4,
708     AVC_LEVEL_2 = 5,
709     AVC_LEVEL_21 = 6,
710     AVC_LEVEL_22 = 7,
711     AVC_LEVEL_3 = 8,
712     AVC_LEVEL_31 = 9,
713     AVC_LEVEL_32 = 10,
714     AVC_LEVEL_4 = 11,
715     AVC_LEVEL_41 = 12,
716     AVC_LEVEL_42 = 13,
717     AVC_LEVEL_5 = 14,
718     AVC_LEVEL_51 = 15,
719     AVC_LEVEL_52 = 16,
720     AVC_LEVEL_6 = 17,
721     AVC_LEVEL_61 = 18,
722     AVC_LEVEL_62 = 19,
723 };
724 
725 /**
726  * @brief
727  *
728  * @since 3.1
729  * @version 4.0
730  */
731 enum HEVCLevel : int32_t {
732     HEVC_LEVEL_1 = 0,
733     HEVC_LEVEL_2 = 1,
734     HEVC_LEVEL_21 = 2,
735     HEVC_LEVEL_3 = 3,
736     HEVC_LEVEL_31 = 4,
737     HEVC_LEVEL_4 = 5,
738     HEVC_LEVEL_41 = 6,
739     HEVC_LEVEL_5 = 7,
740     HEVC_LEVEL_51 = 8,
741     HEVC_LEVEL_52 = 9,
742     HEVC_LEVEL_6 = 10,
743     HEVC_LEVEL_61 = 11,
744     HEVC_LEVEL_62 = 12,
745     HEVC_LEVEL_UNKNOW = -1,
746 };
747 
748 /**
749  * @brief
750  *
751  * @since 3.1
752  * @version 4.0
753  */
754 enum MPEG2Level : int32_t {
755     MPEG2_LEVEL_LL = 0,
756     MPEG2_LEVEL_ML = 1,
757     MPEG2_LEVEL_H14 = 2,
758     MPEG2_LEVEL_HL = 3,
759 };
760 
761 /**
762  * @brief
763  *
764  * @since 3.1
765  * @version 4.0
766  */
767 enum MPEG4Level : int32_t {
768     MPEG4_LEVEL_0 = 0,
769     MPEG4_LEVEL_0B = 1,
770     MPEG4_LEVEL_1 = 2,
771     MPEG4_LEVEL_2 = 3,
772     MPEG4_LEVEL_3 = 4,
773     MPEG4_LEVEL_4 = 5,
774     MPEG4_LEVEL_4A = 6,
775     MPEG4_LEVEL_5 = 7,
776 };
777 
778 /**
779  * @brief
780  *
781  * @since 3.1
782  * @version 4.0
783  */
784 enum VideoEncodeBitrateMode : int32_t {
785     /**
786      * constant bit rate mode.
787      */
788     CBR = 0,
789     /**
790      * variable bit rate mode.
791      */
792     VBR = 1,
793     /**
794      * constant quality mode.
795      */
796     CQ = 2,
797     /**
798      * constant bit rate mode for video call or meeting scene
799      */
800     CBR_VIDEOCALL = 3,
801 };
802 
803 /**
804  * @brief File type
805  *
806  * @since 4.0
807  * @version 4.0
808  */
809 enum FileType : int32_t {
810     FILE_TYPE_UNKNOW = 0,
811     FILE_TYPE_MP4 = 101,
812     FILE_TYPE_MPEGTS = 102,
813     FILE_TYPE_MKV = 103,
814     FILE_TYPE_AMR = 201,
815     FILE_TYPE_AAC = 202,
816     FILE_TYPE_MP3 = 203,
817     FILE_TYPE_FLAC = 204,
818     FILE_TYPE_OGG = 205,
819     FILE_TYPE_M4A = 206,
820     FILE_TYPE_WAV = 207,
821 };
822 } // namespace MediaAVCodec
823 } // namespace OHOS
824 #endif // MEDIA_AVCODEC_INFO_H