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 #include <string>
16 #include <limits>
17 #include "gtest/gtest.h"
18 #include "native_avcodec_videoencoder.h"
19 #include "native_averrors.h"
20 #include "videoenc_api11_sample.h"
21 #include "native_avcodec_base.h"
22 #include "avcodec_codec_name.h"
23 #include "native_avcapability.h"
24 namespace {
25 OH_AVCodec *venc_ = NULL;
26 OH_AVCapability *cap = nullptr;
27 constexpr uint32_t CODEC_NAME_SIZE = 128;
28 char g_codecName[CODEC_NAME_SIZE] = {};
29 const char *INP_DIR_720 = "/data/test/media/1280_720_nv.yuv";
30 constexpr uint32_t DEFAULT_WIDTH = 1280;
31 constexpr uint32_t DEFAULT_HEIGHT = 720;
32 } // namespace
33 namespace OHOS {
34 namespace Media {
35 class AvcSwEncSetParamNdkTest : public testing::Test {
36 public:
37 static void SetUpTestCase();
38 static void TearDownTestCase();
39 void SetUp() override;
40 void TearDown() override;
41 void InputFunc();
42 void OutputFunc();
43 void Release();
44 int32_t Stop();
45 };
46 } // namespace Media
47 } // namespace OHOS
48
49 using namespace std;
50 using namespace OHOS;
51 using namespace OHOS::Media;
52 using namespace testing::ext;
53
SetUpTestCase()54 void AvcSwEncSetParamNdkTest::SetUpTestCase()
55 {
56 cap = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, SOFTWARE);
57 const char *tmpCodecName = OH_AVCapability_GetName(cap);
58 if (memcpy_s(g_codecName, sizeof(g_codecName), tmpCodecName, strlen(tmpCodecName)) != 0)
59 cout << "memcpy failed" << endl;
60 cout << "codecname: " << g_codecName << endl;
61 }
TearDownTestCase()62 void AvcSwEncSetParamNdkTest::TearDownTestCase() {}
SetUp()63 void AvcSwEncSetParamNdkTest::SetUp() {}
TearDown()64 void AvcSwEncSetParamNdkTest::TearDown()
65 {
66 if (venc_ != NULL) {
67 OH_VideoEncoder_Destroy(venc_);
68 venc_ = nullptr;
69 }
70 }
71 namespace {
72 /**
73 * @tc.number : RESET_BITRATE_001
74 * @tc.name : reset bitrate use illegal value
75 * @tc.desc : function test
76 */
77 HWTEST_F(AvcSwEncSetParamNdkTest, RESET_BITRATE_001, TestSize.Level1)
78 {
79 if (strlen(g_codecName) == 0) {
80 return;
81 }
82 auto vEncSample = make_unique<VEncAPI11Sample>();
83 vEncSample->INP_DIR = INP_DIR_720;
84 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
85 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
86 vEncSample->DEFAULT_FRAME_RATE = 30;
87 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
88 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
89 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
90 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
91 OH_AVFormat *format = OH_AVFormat_Create();
92 (void)OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, -1);
93 EXPECT_EQ(AV_ERR_INVALID_VAL, vEncSample->SetParameter(format));
94 (void)OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, LONG_MAX);
95 EXPECT_EQ(AV_ERR_INVALID_VAL, vEncSample->SetParameter(format));
96 OH_AVFormat_Destroy(format);
97 vEncSample->WaitForEOS();
98 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
99 }
100
101
102 /**
103 * @tc.number : RESET_BITRATE_002
104 * @tc.name : reset bitrate in CBR mode ,gop size -1
105 * @tc.desc : function test
106 */
107 HWTEST_F(AvcSwEncSetParamNdkTest, RESET_BITRATE_002, TestSize.Level0)
108 {
109 if (strlen(g_codecName) == 0) {
110 return;
111 }
112 auto vEncSample = make_unique<VEncAPI11Sample>();
113 vEncSample->INP_DIR = INP_DIR_720;
114 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
115 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
116 vEncSample->DEFAULT_FRAME_RATE = 30;
117 vEncSample->DEFAULT_BITRATE_MODE = CBR;
118 vEncSample->DEFAULT_KEY_FRAME_INTERVAL = -1;
119 vEncSample->enableAutoSwitchParam = true;
120 vEncSample->needResetBitrate = true;
121 vEncSample->OUT_DIR = "/data/test/media/cbr_-1_.h264";
122 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
123 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
124 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
125 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
126 vEncSample->WaitForEOS();
127 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
128 }
129
130 /**
131 * @tc.number : RESET_BITRATE_003
132 * @tc.name : reset bitrate in CBR mode ,gop size 0
133 * @tc.desc : function test
134 */
135 HWTEST_F(AvcSwEncSetParamNdkTest, RESET_BITRATE_003, TestSize.Level0)
136 {
137 if (strlen(g_codecName) == 0) {
138 return;
139 }
140 auto vEncSample = make_unique<VEncAPI11Sample>();
141 vEncSample->INP_DIR = INP_DIR_720;
142 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
143 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
144 vEncSample->DEFAULT_FRAME_RATE = 30;
145 vEncSample->DEFAULT_BITRATE_MODE = CBR;
146 vEncSample->DEFAULT_KEY_FRAME_INTERVAL = 0;
147 vEncSample->enableAutoSwitchParam = true;
148 vEncSample->needResetBitrate = true;
149 vEncSample->OUT_DIR = "/data/test/media/cbr_0_.h264";
150 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
151 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
152 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
153 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
154 vEncSample->WaitForEOS();
155 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
156 }
157
158 /**
159 * @tc.number : RESET_BITRATE_004
160 * @tc.name : reset bitrate in CBR mode ,gop size 1s
161 * @tc.desc : function test
162 */
163 HWTEST_F(AvcSwEncSetParamNdkTest, RESET_BITRATE_004, TestSize.Level0)
164 {
165 if (strlen(g_codecName) == 0) {
166 return;
167 }
168 auto vEncSample = make_unique<VEncAPI11Sample>();
169 vEncSample->INP_DIR = INP_DIR_720;
170 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
171 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
172 vEncSample->DEFAULT_FRAME_RATE = 30;
173 vEncSample->DEFAULT_BITRATE_MODE = CBR;
174 vEncSample->enableAutoSwitchParam = true;
175 vEncSample->needResetBitrate = true;
176 vEncSample->OUT_DIR = "/data/test/media/cbr_1s_.h264";
177 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
178 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
179 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
180 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
181 vEncSample->WaitForEOS();
182 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
183 }
184
185
186 /**
187 * @tc.number : RESET_BITRATE_005
188 * @tc.name : reset bitrate in VBR mode
189 * @tc.desc : function test
190 */
191 HWTEST_F(AvcSwEncSetParamNdkTest, RESET_BITRATE_005, TestSize.Level0)
192 {
193 if (strlen(g_codecName) == 0) {
194 return;
195 }
196 auto vEncSample = make_unique<VEncAPI11Sample>();
197 vEncSample->INP_DIR = INP_DIR_720;
198 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
199 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
200 vEncSample->DEFAULT_FRAME_RATE = 30;
201 vEncSample->DEFAULT_BITRATE_MODE = VBR;
202 vEncSample->enableAutoSwitchParam = true;
203 vEncSample->needResetBitrate = true;
204 vEncSample->OUT_DIR = "/data/test/media/vbr_1s_.h264";
205 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
206 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
207 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
208 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
209 vEncSample->WaitForEOS();
210 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
211 }
212
213 /**
214 * @tc.number : SET_PROFILE_001
215 * @tc.name : set profile main
216 * @tc.desc : function test
217 */
218 HWTEST_F(AvcSwEncSetParamNdkTest, SET_PROFILE_001, TestSize.Level1)
219 {
220 if (strlen(g_codecName) == 0) {
221 return;
222 }
223 auto vEncSample = make_unique<VEncAPI11Sample>();
224 vEncSample->INP_DIR = INP_DIR_720;
225 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
226 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
227 vEncSample->DEFAULT_BITRATE_MODE = VBR;
228 vEncSample->DEFAULT_PROFILE = AVC_PROFILE_MAIN;
229 vEncSample->OUT_DIR = "/data/test/media/1280_720_30_10Mb.h264";
230 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
231 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
232 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
233 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
234 vEncSample->WaitForEOS();
235 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
236 }
237 /**
238 * @tc.number : SET_PROFILE_002
239 * @tc.name : set profile base
240 * @tc.desc : function test
241 */
242 HWTEST_F(AvcSwEncSetParamNdkTest, SET_PROFILE_002, TestSize.Level1)
243 {
244 if (strlen(g_codecName) == 0) {
245 return;
246 }
247 auto vEncSample = make_unique<VEncAPI11Sample>();
248 vEncSample->INP_DIR = INP_DIR_720;
249 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
250 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
251 vEncSample->DEFAULT_BITRATE_MODE = VBR;
252 vEncSample->DEFAULT_PROFILE = AVC_PROFILE_BASELINE;
253 vEncSample->OUT_DIR = "/data/test/media/1280_720_30_10Mb.h264";
254 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
255 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
256 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
257 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
258 vEncSample->WaitForEOS();
259 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
260 }
261
262 /**
263 * @tc.number : SET_RANGE_FLAG_001
264 * @tc.name : set range flag true
265 * @tc.desc : function test
266 */
267 HWTEST_F(AvcSwEncSetParamNdkTest, SET_RANGE_FLAG_001, TestSize.Level1)
268 {
269 if (strlen(g_codecName) == 0) {
270 return;
271 }
272 auto vEncSample = make_unique<VEncAPI11Sample>();
273 vEncSample->INP_DIR = INP_DIR_720;
274 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
275 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
276 vEncSample->DEFAULT_BITRATE_MODE = VBR;
277 vEncSample->DEFAULT_RANGE_FLAG = 1;
278 vEncSample->OUT_DIR = "/data/test/media/vbr_fullrange.h264";
279 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
280 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
281 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
282 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
283 vEncSample->WaitForEOS();
284 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
285 }
286
287 /**
288 * @tc.number : SET_COLORSPACE_001
289 * @tc.name : set color space parameter
290 * @tc.desc : function test
291 */
292 HWTEST_F(AvcSwEncSetParamNdkTest, SET_COLORSPACE_001, TestSize.Level1)
293 {
294 if (strlen(g_codecName) == 0) {
295 return;
296 }
297 auto vEncSample = make_unique<VEncAPI11Sample>();
298 vEncSample->INP_DIR = INP_DIR_720;
299 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
300 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
301 vEncSample->DEFAULT_BITRATE_MODE = VBR;
302 vEncSample->DEFAULT_RANGE_FLAG = 1;
303 vEncSample->enableColorSpaceParams = true;
304 vEncSample->OUT_DIR = "/data/test/media/vbr_cs.h264";
305 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
306 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
307 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
308 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
309 vEncSample->WaitForEOS();
310 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
311 }
312
313 /**
314 * @tc.number : SET_FORCE_IDR_001
315 * @tc.name : request i frame
316 * @tc.desc : function test
317 */
318 HWTEST_F(AvcSwEncSetParamNdkTest, SET_FORCE_IDR_001, TestSize.Level1)
319 {
320 if (strlen(g_codecName) == 0) {
321 return;
322 }
323 auto vEncSample = make_unique<VEncAPI11Sample>();
324 vEncSample->INP_DIR = INP_DIR_720;
325 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
326 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
327 vEncSample->DEFAULT_BITRATE_MODE = VBR;
328 vEncSample->DEFAULT_RANGE_FLAG = 1;
329 vEncSample->enableForceIDR = true;
330 vEncSample->OUT_DIR = "/data/test/media/vbr_i.h264";
331 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
332 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
333 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
334 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
335 vEncSample->WaitForEOS();
336 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
337 }
338 /**
339 * @tc.number : COLORSPACE_CONFIG_001
340 * @tc.name : COLORSPACE
341 * @tc.desc : function test
342 */
343 HWTEST_F(AvcSwEncSetParamNdkTest, COLORSPACE_CONFIG_001, TestSize.Level1)
344 {
345 if (strlen(g_codecName) == 0) {
346 return;
347 }
348 auto vEncSample = make_unique<VEncAPI11Sample>();
349 vEncSample->INP_DIR = INP_DIR_720;
350 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
351 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
352 vEncSample->DEFAULT_BITRATE_MODE = VBR;
353 vEncSample->DEFAULT_RANGE_FLAG = 1;
354 vEncSample->enableColorSpaceParams = true;
355 vEncSample->DEFAULT_COLOR_PRIMARIES = 100;
356 vEncSample->DEFAULT_TRANSFER_CHARACTERISTICS = 10000;
357 vEncSample->DEFAULT_MATRIX_COEFFICIENTS = 10000;
358 vEncSample->OUT_DIR = "/data/test/media/vbr_i.h264";
359 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
360 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
361 ASSERT_EQ(AV_ERR_INVALID_VAL, vEncSample->ConfigureVideoEncoder());
362 ASSERT_EQ(AV_ERR_INVALID_STATE, vEncSample->StartVideoEncoder());
363 vEncSample->WaitForEOS();
364 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
365 }
366 /**
367 * @tc.number : COLORSPACE_CONFIG_002
368 * @tc.name : COLORSPACE 264
369 * @tc.desc : function test
370 */
371 HWTEST_F(AvcSwEncSetParamNdkTest, COLORSPACE_CONFIG_002, TestSize.Level1)
372 {
373 if (strlen(g_codecName) == 0) {
374 return;
375 }
376 auto vEncSample = make_unique<VEncAPI11Sample>();
377 vEncSample->INP_DIR = INP_DIR_720;
378 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
379 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
380 vEncSample->DEFAULT_BITRATE_MODE = VBR;
381 vEncSample->DEFAULT_RANGE_FLAG = 1;
382 vEncSample->enableColorSpaceParams = true;
383 vEncSample->DEFAULT_COLOR_PRIMARIES = COLOR_PRIMARY_BT709;
384 vEncSample->DEFAULT_TRANSFER_CHARACTERISTICS = TRANSFER_CHARACTERISTIC_BT709;
385 vEncSample->DEFAULT_MATRIX_COEFFICIENTS = MATRIX_COEFFICIENT_BT709;
386 vEncSample->OUT_DIR = "/data/test/media/bt_709_h264.h264";
387 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
388 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
389 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
390 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
391 vEncSample->WaitForEOS();
392 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
393 }
394 /**
395 * @tc.number : FRAMENUM_JUDGMENT_001
396 * @tc.name : Increase frame rate judgment
397 * @tc.desc : function test
398 */
399 HWTEST_F(AvcSwEncSetParamNdkTest, FRAMENUM_JUDGMENT_001, TestSize.Level0)
400 {
401 if (strlen(g_codecName) == 0) {
402 return;
403 }
404 auto vEncSample = make_unique<VEncAPI11Sample>();
405 vEncSample->INP_DIR = INP_DIR_720;
406 vEncSample->OUT_DIR = "/data/test/media/1280_720_nv.h264";
407 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
408 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
409 vEncSample->DEFAULT_FRAME_RATE = 30;
410 vEncSample->DEFAULT_BITRATE_MODE = VBR;
411 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
412 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
413 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
414 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
415 vEncSample->WaitForEOS();
416 ASSERT_EQ(25, vEncSample->outCount);
417 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
418 }
419 }