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