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