• 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 #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 }