• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2025 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 #include "avcodec_log.h"
17 #include "avcodec_trace.h"
18 #include "avc_encoder_util.h"
19 
20 namespace OHOS {
21 namespace MediaAVCodec {
22 namespace Codec {
23 
24 namespace {
25 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_FRAMEWORK, "AvcEncoder"};
26 
27 std::map<AVCLevel, H264Level> g_encodeLevelMap = {
28     { AVCLevel::AVC_LEVEL_1,  H264Level::H264_LEVEL_10 },
29     { AVCLevel::AVC_LEVEL_1b, H264Level::H264_LEVEL_1B },
30     { AVCLevel::AVC_LEVEL_11, H264Level::H264_LEVEL_11 },
31     { AVCLevel::AVC_LEVEL_12, H264Level::H264_LEVEL_12 },
32     { AVCLevel::AVC_LEVEL_13, H264Level::H264_LEVEL_13 },
33     { AVCLevel::AVC_LEVEL_2,  H264Level::H264_LEVEL_20 },
34     { AVCLevel::AVC_LEVEL_21, H264Level::H264_LEVEL_21 },
35     { AVCLevel::AVC_LEVEL_22, H264Level::H264_LEVEL_22 },
36     { AVCLevel::AVC_LEVEL_3,  H264Level::H264_LEVEL_30 },
37     { AVCLevel::AVC_LEVEL_31, H264Level::H264_LEVEL_31 },
38     { AVCLevel::AVC_LEVEL_32, H264Level::H264_LEVEL_32 },
39     { AVCLevel::AVC_LEVEL_4,  H264Level::H264_LEVEL_40 },
40     { AVCLevel::AVC_LEVEL_41, H264Level::H264_LEVEL_41 },
41     { AVCLevel::AVC_LEVEL_42, H264Level::H264_LEVEL_42 },
42     { AVCLevel::AVC_LEVEL_5,  H264Level::H264_LEVEL_50 },
43     { AVCLevel::AVC_LEVEL_51, H264Level::H264_LEVEL_51 },
44     { AVCLevel::AVC_LEVEL_52, H264Level::H264_LEVEL_52 },
45     { AVCLevel::AVC_LEVEL_6,  H264Level::H264_LEVEL_60 },
46     { AVCLevel::AVC_LEVEL_61, H264Level::H264_LEVEL_61 },
47     { AVCLevel::AVC_LEVEL_62, H264Level::H264_LEVEL_62 },
48 };
49 } // namespace
50 
51 const uint32_t AVC_ENCODER_P_FRAMETYPE = 1;
52 const uint32_t AVC_ENCODER_I_FRAMETYPE = 3;
53 
54 using namespace OHOS::Media;
55 
AvcFrameTypeToBufferFlag(uint32_t frameType)56 AVCodecBufferFlag AvcFrameTypeToBufferFlag(uint32_t frameType)
57 {
58     AVCodecBufferFlag flag = AVCodecBufferFlag::AVCODEC_BUFFER_FLAG_NONE;
59     switch (frameType) {
60         case AVC_ENCODER_P_FRAMETYPE:
61             flag = AVCodecBufferFlag::AVCODEC_BUFFER_FLAG_PARTIAL_FRAME;
62             break;
63         case AVC_ENCODER_I_FRAMETYPE:
64             flag = AVCodecBufferFlag::AVCODEC_BUFFER_FLAG_SYNC_FRAME;
65             break;
66         default:
67             flag = AVCodecBufferFlag::AVCODEC_BUFFER_FLAG_CODEC_DATA;
68             break;
69     }
70     return flag;
71 }
72 
TranslateVideoPixelFormat(GraphicPixelFormat surfaceFormat)73 VideoPixelFormat TranslateVideoPixelFormat(GraphicPixelFormat surfaceFormat)
74 {
75     switch (surfaceFormat) {
76         case GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCBCR_420_P: {
77             return VideoPixelFormat::YUVI420;
78         }
79         case GraphicPixelFormat::GRAPHIC_PIXEL_FMT_RGBA_8888: {
80             return VideoPixelFormat::RGBA;
81         }
82         case GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCBCR_P010:
83         case GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCBCR_420_SP: {
84             return VideoPixelFormat::NV12;
85         }
86         case GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCRCB_P010:
87         case GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCRCB_420_SP: {
88             return VideoPixelFormat::NV21;
89         }
90         default:
91             AVCODEC_LOGE("Invalid graphic pixel format:%{public}d", static_cast<int32_t>(surfaceFormat));
92     }
93     return VideoPixelFormat::UNKNOWN;
94 }
95 
TranslateMatrix(MatrixCoefficient matrixFormat)96 COLOR_MATRIX TranslateMatrix(MatrixCoefficient matrixFormat)
97 {
98     switch (matrixFormat) {
99         case MatrixCoefficient::MATRIX_COEFFICIENT_UNSPECIFIED: {
100             return COLOR_MATRIX::MATRIX_UNSPECIFIED;
101         }
102         case MatrixCoefficient::MATRIX_COEFFICIENT_BT709: {
103             return COLOR_MATRIX::MATRIX_BT709;
104         }
105         case MatrixCoefficient::MATRIX_COEFFICIENT_FCC: {
106             return COLOR_MATRIX::MATRIX_FCC47_73_682;
107         }
108         case MatrixCoefficient::MATRIX_COEFFICIENT_BT601_525:
109         case MatrixCoefficient::MATRIX_COEFFICIENT_BT601_625: {
110             return COLOR_MATRIX::MATRIX_BT601;
111         }
112         case MatrixCoefficient::MATRIX_COEFFICIENT_SMPTE_ST240: {
113             return COLOR_MATRIX::MATRIX_240M;
114         }
115         case MatrixCoefficient::MATRIX_COEFFICIENT_BT2020_NCL: {
116             return COLOR_MATRIX::MATRIX_BT2020;
117         }
118         case MatrixCoefficient::MATRIX_COEFFICIENT_BT2020_CL: {
119             return COLOR_MATRIX::MATRIX_BT2020_CONSTANT;
120         }
121         default:
122             AVCODEC_LOGE("Invalid matrix format:%{public}d", static_cast<int32_t>(matrixFormat));
123     }
124     return COLOR_MATRIX::MATRIX_UNSPECIFIED;
125 }
126 
TranslateRange(uint8_t range)127 COLOR_RANGE TranslateRange(uint8_t range)
128 {
129     switch (range) {
130         case 0: {
131             return COLOR_RANGE::RANGE_FULL;
132         }
133         case 1: {
134             return COLOR_RANGE::RANGE_LIMITED;
135         }
136         default:
137             AVCODEC_LOGE("Invalid range format:%{public}d", range);
138     }
139     return COLOR_RANGE::RANGE_UNSPECIFIED;
140 }
141 
TranslateEncMode(VideoEncodeBitrateMode mode)142 ENC_MODE TranslateEncMode(VideoEncodeBitrateMode mode)
143 {
144     switch (mode) {
145         case VideoEncodeBitrateMode::CBR :
146         case VideoEncodeBitrateMode::CBR_VIDEOCALL : {
147             return ENC_MODE::MODE_CBR;
148         }
149         case VideoEncodeBitrateMode::VBR: {
150             return ENC_MODE::MODE_VBR;
151         }
152         case VideoEncodeBitrateMode::CQ: {
153             return ENC_MODE::MODE_CQP;
154         }
155         default:
156             AVCODEC_LOGE("Invalid bitrate mode format:%{public}d", static_cast<int32_t>(mode));
157     }
158     return ENC_MODE::MODE_CBR;
159 }
160 
161 
TranslateVideoFormatToAvc(const VideoPixelFormat & pixelFormat)162 COLOR_FORMAT TranslateVideoFormatToAvc(const VideoPixelFormat &pixelFormat)
163 {
164     switch (pixelFormat) {
165         case VideoPixelFormat::YUVI420: {
166             return COLOR_FORMAT::YUV_420P;
167         }
168         case VideoPixelFormat::RGBA: {
169             return COLOR_FORMAT::YUV_420SP_VU;
170         }
171         case VideoPixelFormat::NV12: {
172             return COLOR_FORMAT::YUV_420SP_UV;
173         }
174         case VideoPixelFormat::NV21: {
175             return COLOR_FORMAT::YUV_420SP_VU;
176         }
177         default:
178             AVCODEC_LOGE("Invalid video pixel format:%{public}d", static_cast<int32_t>(pixelFormat));
179     }
180     return COLOR_FORMAT::YUV_420P;
181 }
182 
TranslateEncProfile(AVCProfile profile)183 ENC_PROFILE TranslateEncProfile(AVCProfile profile)
184 {
185     switch (profile) {
186         case AVCProfile::AVC_PROFILE_BASELINE :
187         case AVCProfile::AVC_PROFILE_CONSTRAINED_BASELINE: {
188             return ENC_PROFILE::PROFILE_BASE;
189         }
190         case AVCProfile::AVC_PROFILE_CONSTRAINED_HIGH :
191         case AVCProfile::AVC_PROFILE_EXTENDED :
192         case AVCProfile::AVC_PROFILE_HIGH :
193         case AVCProfile::AVC_PROFILE_HIGH_10 :
194         case AVCProfile::AVC_PROFILE_HIGH_422 :
195         case AVCProfile::AVC_PROFILE_HIGH_444 : {
196             return ENC_PROFILE::PROFILE_HIGH;
197         }
198         case AVCProfile::AVC_PROFILE_MAIN : {
199             return ENC_PROFILE::PROFILE_MAIN;
200         }
201         default:
202             AVCODEC_LOGE("Invalid profile format:%{public}d", static_cast<int32_t>(profile));
203     }
204     return ENC_PROFILE::PROFILE_BASE;
205 }
206 
TranslateEncLevel(AVCLevel level)207 H264Level TranslateEncLevel(AVCLevel level)
208 {
209     auto iter = std::find_if(
210         g_encodeLevelMap.begin(), g_encodeLevelMap.end(),
211         [&](const std::pair<AVCLevel, H264Level> &tmp) -> bool { return tmp.first == level; });
212     return iter == g_encodeLevelMap.end() ? H264Level::H264_LEVEL_41 : iter->second;
213 }
214 } // namespace Codec
215 } // namespace MediaAVCodec
216 } // namespace OHOS