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 #include <iostream>
17 #include <cstdio>
18 #include <atomic>
19 #include <fstream>
20 #include <thread>
21 #include <mutex>
22 #include <queue>
23 #include <string>
24 #include "gtest/gtest.h"
25 #include "native_avcodec_videodecoder.h"
26 #include "native_avcodec_base.h"
27 #include "videodec_sample.h"
28 #include "videodec_api11_sample.h"
29 #include "native_avcapability.h"
30
31 using namespace std;
32 using namespace OHOS;
33 using namespace OHOS::Media;
34 using namespace testing::ext;
35
36 namespace OHOS {
37 namespace Media {
38 class HwdecReliNdkTest : public testing::Test {
39 public:
40 static void SetUpTestCase(); // 第一个测试用例执行前
41 static void TearDownTestCase(); // 最后一个测试用例执行后
42 void SetUp() override; // 每个测试用例执行前
43 void TearDown() override; // 每个测试用例执行后
44 void InputFunc();
45 void OutputFunc();
46 void Release();
47 int32_t Stop();
48
49 protected:
50 bool createCodecSuccess_ = false;
51 OH_AVCodec *vdec_;
52 const char *inpDir720 = "/data/test/media/1280x720_30_10M.h264";
53 const char *inpDir720Array[16] = {
54 "/data/test/media//1280_720_30_10M.h264", "/data/test/media//1280_720_30_10M_1.h264",
55 "/data/test/media//1280_720_30_10M_2.h264", "/data/test/media//1280_720_30_10M_3.h264",
56 "/data/test/media//1280_720_30_10M_4.h264", "/data/test/media//1280_720_30_10M_5.h264",
57 "/data/test/media//1280_720_30_10M_6.h264", "/data/test/media//1280_720_30_10M_7.h264",
58 "/data/test/media//1280_720_30_10M_8.h264", "/data/test/media//1280_720_30_10M_9.h264",
59 "/data/test/media//1280_720_30_10M_10.h264", "/data/test/media//1280_720_30_10M_11.h264",
60 "/data/test/media//1280_720_30_10M_12.h264", "/data/test/media//1280_720_30_10M_13.h264",
61 "/data/test/media//1280_720_30_10M_14.h264", "/data/test/media//1280_720_30_10M_15.h264"};
62 const char *h264Array[16] = {
63 "/data/test/media/360p.h264", "/data/test/media/360p_1.h264",
64 "/data/test/media/360p_2.h264", "/data/test/media/360p_3.h264",
65 "/data/test/media/360p_4.h264", "/data/test/media/360p_5.h264",
66 "/data/test/media/360p_6.h264", "/data/test/media/360p_7.h264",
67 "/data/test/media/360p_8.h264", "/data/test/media/360p_9.h264",
68 "/data/test/media/360p_10.h264", "/data/test/media/360p_11.h264",
69 "/data/test/media/360p_12.h264", "/data/test/media/360p_13.h264",
70 "/data/test/media/360p_14.h264", "/data/test/media/360p_15.h264"};
71 const char *h265Array[16] = {
72 "/data/test/media/360p.h264", "/data/test/media/360p_1.h264",
73 "/data/test/media/360p_2.h264", "/data/test/media/360p_3.h264",
74 "/data/test/media/360p_4.h264", "/data/test/media/360p_5.h264",
75 "/data/test/media/360p_6.h264", "/data/test/media/360p_7.h264",
76 "/data/test/media/360p_8.h264", "/data/test/media/360p_9.h264",
77 "/data/test/media/360p_10.h264", "/data/test/media/360p_11.h264",
78 "/data/test/media/360p_12.h264", "/data/test/media/360p_13.h264",
79 "/data/test/media/360p_14.h264", "/data/test/media/360p_15.h264"};
80 const char *resChangeArray[16] = {
81 "/data/test/media/resChange.h264", "/data/test/media/resChange_1.h264",
82 "/data/test/media/resChange_2.h264", "/data/test/media/resChange_3.h264",
83 "/data/test/media/resChange_4.h264", "/data/test/media/resChange_5.h264",
84 "/data/test/media/resChange_6.h264", "/data/test/media/resChange_7.h264",
85 "/data/test/media/resChange_8.h264", "/data/test/media/resChange_9.h264",
86 "/data/test/media/resChange_10.h264", "/data/test/media/resChange_11.h264",
87 "/data/test/media/resChange_12.h264", "/data/test/media/resChange_13.h264",
88 "/data/test/media/resChange_14.h264", "/data/test/media/resChange_15.h264"};
89 const char *hdr2sdrArray[30] = {
90 "/data/test/media/hdr2sdrArray.h265", "/data/test/media/hdr2sdrArray_1.h265",
91 "/data/test/media/hdr2sdrArray_2.h265", "/data/test/media/hdr2sdrArray_3.h265",
92 "/data/test/media/hdr2sdrArray_4.h265", "/data/test/media/hdr2sdrArray_5.h265",
93 "/data/test/media/hdr2sdrArray_6.h265", "/data/test/media/hdr2sdrArray_7.h265",
94 "/data/test/media/hdr2sdrArray_8.h265", "/data/test/media/hdr2sdrArray_9.h265",
95 "/data/test/media/hdr2sdrArray_10.h265", "/data/test/media/hdr2sdrArray_11.h265",
96 "/data/test/media/hdr2sdrArray_12.h265", "/data/test/media/hdr2sdrArray_13.h265",
97 "/data/test/media/hdr2sdrArray_14.h265", "/data/test/media/hdr2sdrArray_15.h265",
98 "/data/test/media/hdr2sdrArray_16.h265", "/data/test/media/hdr2sdrArray_17.h265",
99 "/data/test/media/hdr2sdrArray_18.h265", "/data/test/media/hdr2sdrArray_19.h265",
100 "/data/test/media/hdr2sdrArray_20.h265", "/data/test/media/hdr2sdrArray_21.h265",
101 "/data/test/media/hdr2sdrArray_22.h265", "/data/test/media/hdr2sdrArray_23.h265",
102 "/data/test/media/hdr2sdrArray_24.h265", "/data/test/media/hdr2sdrArray_25.h265",
103 "/data/test/media/hdr2sdrArray_26.h265", "/data/test/media/hdr2sdrArray_27.h265",
104 "/data/test/media/hdr2sdrArray_28.h265", "/data/test/media/hdr2sdrArray_29.h265"};
105 };
106 } // namespace Media
107 } // namespace OHOS
108
109 static string g_codecName;
110 static string g_hevcName;
111 static OH_AVCapability *cap = nullptr;
SetUpTestCase()112 void HwdecReliNdkTest::SetUpTestCase()
113 {
114 cap = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE);
115 g_codecName = OH_AVCapability_GetName(cap);
116 OH_AVCapability *cap2 = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, false, HARDWARE);
117 g_hevcName = OH_AVCapability_GetName(cap2);
118 cout << "codecname: " << g_codecName << endl;
119 }
120
TearDownTestCase()121 void HwdecReliNdkTest::TearDownTestCase() {}
122
SetUp()123 void HwdecReliNdkTest::SetUp() {}
124
TearDown()125 void HwdecReliNdkTest::TearDown() {}
126
127 namespace {
128 /**
129 * @tc.number : VIDEO_HWDEC_STABILITY_0200
130 * @tc.name : confige-start-flush-start-reset 1000 times
131 * @tc.desc : reli test
132 */
133 HWTEST_F(HwdecReliNdkTest, VIDEO_HWDEC_STABILITY_0200, TestSize.Level4)
134 {
135 vdec_ = OH_VideoDecoder_CreateByName(g_codecName.c_str());
136 for (int i = 0; i < 1000; i++) {
137 ASSERT_NE(nullptr, vdec_);
138 OH_AVFormat *format = OH_AVFormat_Create();
139 ASSERT_NE(nullptr, format);
140 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1920);
141 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1080);
142 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12);
143 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_FRAME_RATE, 30);
144 ASSERT_EQ(AV_ERR_OK, OH_VideoDecoder_Configure(vdec_, format));
145 OH_AVFormat_Destroy(format);
146 ASSERT_EQ(AV_ERR_OK, OH_VideoDecoder_Start(vdec_));
147 ASSERT_EQ(AV_ERR_OK, OH_VideoDecoder_Flush(vdec_));
148 ASSERT_EQ(AV_ERR_OK, OH_VideoDecoder_Start(vdec_));
149 ASSERT_EQ(AV_ERR_OK, OH_VideoDecoder_Reset(vdec_));
150 }
151 OH_VideoDecoder_Stop(vdec_);
152 OH_VideoDecoder_Destroy(vdec_);
153 }
154
155 /**
156 * @tc.number : VIDEO_HWDEC_STABILITY_0400
157 * @tc.name : SetParameter 1000 times
158 * @tc.desc : reli test
159 */
160 HWTEST_F(HwdecReliNdkTest, VIDEO_HWDEC_STABILITY_0400, TestSize.Level4)
161 {
162 vdec_ = OH_VideoDecoder_CreateByName(g_codecName.c_str());
163 ASSERT_NE(nullptr, vdec_);
164 OH_AVFormat *format = OH_AVFormat_Create();
165 ASSERT_NE(nullptr, format);
166 int64_t widht = 1920;
167 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, widht);
168 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1080);
169 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12);
170 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_FRAME_RATE, 30);
171 ASSERT_EQ(AV_ERR_OK, OH_VideoDecoder_Configure(vdec_, format));
172 ASSERT_EQ(AV_ERR_OK, OH_VideoDecoder_Start(vdec_));
173 for (int i = 0; i < 1000; i++) {
174 widht++;
175 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, widht);
176 ASSERT_EQ(AV_ERR_OK, OH_VideoDecoder_SetParameter(vdec_, format));
177 }
178 OH_AVFormat_Destroy(format);
179 OH_VideoDecoder_Stop(vdec_);
180 OH_VideoDecoder_Destroy(vdec_);
181 }
182
183 /**
184 * @tc.number : VIDEO_HWDEC_PERFORMANCE_WHILE_0100
185 * @tc.name :
186 * @tc.desc : perf test
187 */
188 HWTEST_F(HwdecReliNdkTest, VIDEO_HWDEC_PERFORMANCE_WHILE_0100, TestSize.Level3)
189 {
190 while (true) {
191 shared_ptr<VDecNdkSample> vDecSample = make_shared<VDecNdkSample>();
192 vDecSample->SF_OUTPUT = false;
193 vDecSample->INP_DIR = inpDir720;
194 vDecSample->DEFAULT_WIDTH = 1280;
195 vDecSample->DEFAULT_HEIGHT = 720;
196 vDecSample->DEFAULT_FRAME_RATE = 30;
197 vDecSample->sleepOnFPS = true;
198 ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder(g_codecName.c_str()));
199 ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
200 ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
201 ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
202 vDecSample->WaitForEOS();
203 ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
204 }
205 }
206
207 /**
208 * @tc.number : VIDEO_HWDEC_PERFORMANCE_WHILE_0200
209 * @tc.name :
210 * @tc.desc : perf test
211 */
212 HWTEST_F(HwdecReliNdkTest, VIDEO_HWDEC_PERFORMANCE_WHILE_0200, TestSize.Level3)
213 {
214 for (int i = 0; i < 16; i++) {
215 VDecNdkSample *vDecSample = new VDecNdkSample();
216 vDecSample->SF_OUTPUT = false;
217 vDecSample->INP_DIR = inpDir720Array[i];
218 vDecSample->DEFAULT_WIDTH = 1280;
219 vDecSample->DEFAULT_HEIGHT = 720;
220 vDecSample->DEFAULT_FRAME_RATE = 30;
221 vDecSample->sleepOnFPS = true;
222 vDecSample->repeatRun = true;
223 ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder(g_codecName.c_str()));
224 ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
225 ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
226 ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
227 if (i == 15) {
228 vDecSample->WaitForEOS();
229 ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
230 }
231 }
232 }
233
234 /**
235 * @tc.number : VIDEO_HWDEC_PERFORMANCE_WHILE_0300
236 * @tc.name :
237 * @tc.desc : perf test
238 */
239 HWTEST_F(HwdecReliNdkTest, VIDEO_HWDEC_PERFORMANCE_WHILE_0300, TestSize.Level3)
240 {
241 shared_ptr<VDecNdkSample> vDecSample = make_shared<VDecNdkSample>();
242 vDecSample->SF_OUTPUT = false;
243 vDecSample->INP_DIR = inpDir720;
244 vDecSample->DEFAULT_WIDTH = 1280;
245 vDecSample->DEFAULT_HEIGHT = 720;
246 vDecSample->DEFAULT_FRAME_RATE = 30;
247 vDecSample->sleepOnFPS = true;
248 vDecSample->repeatRun = true;
249 ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder(g_codecName.c_str()));
250 ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
251 ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
252 ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
253 vDecSample->WaitForEOS();
254 ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
255 }
256
257 /**
258 * @tc.number : VIDEO_HWDEC_PERFORMANCE_WHILE_0400
259 * @tc.name :
260 * @tc.desc : perf test
261 */
262 HWTEST_F(HwdecReliNdkTest, VIDEO_HWDEC_PERFORMANCE_WHILE_0400, TestSize.Level3)
263 {
264 while (true) {
265 vector<shared_ptr<VDecNdkSample>> decVec;
266 for (int i = 0; i < 16; i++) {
267 auto vDecSample = make_shared<VDecNdkSample>();
268 decVec.push_back(vDecSample);
269 vDecSample->SF_OUTPUT = false;
270 vDecSample->INP_DIR = inpDir720Array[i];
271 vDecSample->DEFAULT_WIDTH = 1280;
272 vDecSample->DEFAULT_HEIGHT = 720;
273 vDecSample->DEFAULT_FRAME_RATE = 30;
274 vDecSample->sleepOnFPS = true;
275 vDecSample->repeatRun = true;
276 ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder(g_codecName.c_str()));
277 ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
278 ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
279 ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
280 if (i == 15) {
281 vDecSample->WaitForEOS();
282 ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
283 }
284 }
285 }
286 }
287
288 /**
289 * @tc.number : SURF_CHANGE_RELI_001
290 * @tc.name :
291 * @tc.desc : perf test
292 */
293 HWTEST_F(HwdecReliNdkTest, SURF_CHANGE_RELI_001, TestSize.Level3)
294 {
295 while (true) {
296 vector<shared_ptr<VDecNdkSample>> decVec;
297 for (int i = 0; i < 16; i++) {
298 auto vDecSample = make_shared<VDecNdkSample>();
299 decVec.push_back(vDecSample);
300 vDecSample->INP_DIR = h264Array[i];
301 vDecSample->DEFAULT_WIDTH = 480;
302 vDecSample->DEFAULT_HEIGHT = 360;
303 vDecSample->DEFAULT_FRAME_RATE = 30;
304 vDecSample->SF_OUTPUT = true;
305 vDecSample->autoSwitchSurface = true;
306 vDecSample->sleepOnFPS = true;
307 vDecSample->RunVideoDec_Surface(g_codecName);
308 }
309 uint32_t errorCount = 0;
__anon3509cf420202(auto sample) 310 for_each(decVec.begin(), decVec.end(), [&errorCount](auto sample) {
311 sample->WaitForEOS();
312 errorCount += sample->errCount;
313 });
314 ASSERT_EQ(AV_ERR_OK, errorCount);
315 decVec.clear();
316 }
317 }
318
319 /**
320 * @tc.number : SURF_CHANGE_RELI_002
321 * @tc.name :
322 * @tc.desc : perf test
323 */
324 HWTEST_F(HwdecReliNdkTest, SURF_CHANGE_RELI_002, TestSize.Level3)
325 {
326 while (true) {
327 vector<shared_ptr<VDecNdkSample>> decVec;
328 for (int i = 0; i < 16; i++) {
329 auto vDecSample = make_shared<VDecNdkSample>();
330 decVec.push_back(vDecSample);
331 vDecSample->INP_DIR = h265Array[i];
332 vDecSample->DEFAULT_WIDTH = 480;
333 vDecSample->DEFAULT_HEIGHT = 360;
334 vDecSample->DEFAULT_FRAME_RATE = 30;
335 vDecSample->SF_OUTPUT = true;
336 vDecSample->autoSwitchSurface = true;
337 vDecSample->sleepOnFPS = true;
338 vDecSample->RunVideoDec_Surface(g_hevcName);
339 }
340 uint32_t errorCount = 0;
__anon3509cf420302(auto sample) 341 for_each(decVec.begin(), decVec.end(), [&errorCount](auto sample) {
342 sample->WaitForEOS();
343 errorCount += sample->errCount;
344 });
345 ASSERT_EQ(AV_ERR_OK, errorCount);
346 decVec.clear();
347 }
348 }
349
350 /**
351 * @tc.number : SURF_CHANGE_RELI_003
352 * @tc.name :
353 * @tc.desc : perf test
354 */
355 HWTEST_F(HwdecReliNdkTest, SURF_CHANGE_RELI_003, TestSize.Level3)
356 {
357 while (true) {
358 vector<shared_ptr<VDecNdkSample>> decVec;
359 for (int i = 0; i < 16; i++) {
360 auto vDecSample = make_shared<VDecNdkSample>();
361 decVec.push_back(vDecSample);
362 vDecSample->INP_DIR = resChangeArray[i];
363 vDecSample->DEFAULT_WIDTH = 480;
364 vDecSample->DEFAULT_HEIGHT = 360;
365 vDecSample->DEFAULT_FRAME_RATE = 30;
366 vDecSample->SF_OUTPUT = true;
367 vDecSample->autoSwitchSurface = true;
368 vDecSample->sleepOnFPS = true;
369 vDecSample->RunVideoDec_Surface(g_hevcName);
370 }
371 uint32_t errorCount = 0;
__anon3509cf420402(auto sample) 372 for_each(decVec.begin(), decVec.end(), [&errorCount](auto sample) {
373 sample->WaitForEOS();
374 errorCount += sample->errCount;
375 });
376 ASSERT_EQ(AV_ERR_OK, errorCount);
377 decVec.clear();
378 }
379 }
380
381 /**
382 * @tc.number : SURF_CHANGE_RELI_004
383 * @tc.name :
384 * @tc.desc : perf test
385 */
386 HWTEST_F(HwdecReliNdkTest, SURF_CHANGE_RELI_004, TestSize.Level3)
387 {
388 while (true) {
389 vector<shared_ptr<VDecAPI11Sample>> decVec;
390 for (int i = 0; i < 30; i++) {
391 cout << i << endl;
392 auto vDecSample = make_shared<VDecAPI11Sample>();
393 decVec.push_back(vDecSample);
394 vDecSample->INP_DIR = hdr2sdrArray[i];
395 vDecSample->DEFAULT_WIDTH = 1920;
396 vDecSample->DEFAULT_HEIGHT = 1080;
397 vDecSample->DEFAULT_FRAME_RATE = 30;
398 vDecSample->SF_OUTPUT = true;
399 vDecSample->TRANSFER_FLAG = true;
400 vDecSample->RunVideoDec_Surface(g_hevcName);
401 }
402 uint32_t errorCount = 0;
__anon3509cf420502(auto sample) 403 for_each(decVec.begin(), decVec.end(), [&errorCount](auto sample) {
404 sample->WaitForEOS();
405 errorCount += sample->errCount;
406 });
407 ASSERT_EQ(AV_ERR_OK, errorCount);
408 decVec.clear();
409 }
410 }
411
412 /**
413 * @tc.number : VIDEO_HWDEC_RELI_ATTIME_0010
414 * @tc.name : test h264 asyn decode surface,use at time
415 * @tc.desc : perf test
416 */
417 HWTEST_F(HwdecReliNdkTest, VIDEO_HWDEC_RELI_ATTIME_0010, TestSize.Level3)
418 {
419 while (true) {
420 shared_ptr<VDecAPI11Sample> vDecSample = make_shared<VDecAPI11Sample>();
421 const char *INP_DIR_720_30 = "/data/test/media/1280_720_30_10Mb.h264";
422 vDecSample->INP_DIR = INP_DIR_720_30;
423 vDecSample->SF_OUTPUT = true;
424 vDecSample->DEFAULT_WIDTH = 1280;
425 vDecSample->DEFAULT_HEIGHT = 720;
426 vDecSample->DEFAULT_FRAME_RATE = 30;
427 vDecSample->rsAtTime = true;
428 ASSERT_EQ(AV_ERR_OK, vDecSample->RunVideoDec_Surface(g_codecName));
429 vDecSample->WaitForEOS();
430 ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
431 }
432 }
433 } // namespace