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 #include <string>
16 #include "gtest/gtest.h"
17 #include "native_avcodec_videodecoder.h"
18 #include "native_averrors.h"
19 #include "videodec_ndk_sample.h"
20 #include "native_avcodec_base.h"
21 #include "avcodec_codec_name.h"
22 
23 #ifdef SUPPORT_DRM
24 #include "native_mediakeysession.h"
25 #include "native_mediakeysystem.h"
26 #endif
27 
28 #define MAX_THREAD 16
29 
30 using namespace std;
31 using namespace OHOS;
32 using namespace OHOS::Media;
33 using namespace testing::ext;
34 
35 namespace OHOS {
36 namespace Media {
37 class SwdecFuncNdkTest : public testing::Test {
38 public:
39     static void SetUpTestCase();
40     static void TearDownTestCase();
41     void SetUp() override;
42     void TearDown() override;
43     void InputFunc();
44     void OutputFunc();
45     void Release();
46     int32_t Stop();
47 
48 protected:
49     const string CODEC_NAME = "video_decoder.avc";
50     const char *INP_DIR_720_30 = "/data/test/media/1280_720_30_10Mb.h264";
51     const char *INP_DIR_1080_30 = "/data/test/media/1920_1080_10_30Mb.h264";
52 };
53 } // namespace Media
54 } // namespace OHOS
55 
SetUpTestCase()56 void SwdecFuncNdkTest::SetUpTestCase() {}
TearDownTestCase()57 void SwdecFuncNdkTest::TearDownTestCase() {}
SetUp()58 void SwdecFuncNdkTest::SetUp() {}
TearDown()59 void SwdecFuncNdkTest::TearDown() {}
60 
61 namespace {
62 /**
63  * @tc.number    : VIDEO_SWDEC_FUNCTION_0200
64  * @tc.name      : create nonexist decoder
65  * @tc.desc      : function test
66  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0200, TestSize.Level1)67 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0200, TestSize.Level1)
68 {
69     OH_AVCodec *vdec_ = OH_VideoDecoder_CreateByName("OMX.h264.decode.111.222.333");
70     ASSERT_EQ(nullptr, vdec_);
71 }
72 
73 /**
74  * @tc.number    : VIDEO_SWDEC_FUNCTION_0300
75  * @tc.name      : test h264  decode buffer
76  * @tc.desc      : function test
77  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0300, TestSize.Level0)78 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0300, TestSize.Level0)
79 {
80     auto vDecSample = make_shared<VDecNdkSample>();
81     vDecSample->INP_DIR = INP_DIR_1080_30;
82     vDecSample->DEFAULT_WIDTH = 1920;
83     vDecSample->DEFAULT_HEIGHT = 1080;
84     vDecSample->DEFAULT_FRAME_RATE = 30;
85     vDecSample->SURFACE_OUTPUT = false;
86     ASSERT_EQ(AV_ERR_OK, vDecSample->RunVideoDec("OH.Media.Codec.Decoder.Video.AVC"));
87     vDecSample->WaitForEOS();
88     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
89 }
90 
91 /**
92  * @tc.number    : VIDEO_SWDEC_FUNCTION_0400
93  * @tc.name      : test h264  decode surface
94  * @tc.desc      : function test
95  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0400, TestSize.Level0)96 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0400, TestSize.Level0)
97 {
98     auto vDecSample = make_shared<VDecNdkSample>();
99     vDecSample->INP_DIR = INP_DIR_1080_30;
100     vDecSample->SURFACE_OUTPUT = true;
101     vDecSample->DEFAULT_WIDTH = 1920;
102     vDecSample->DEFAULT_HEIGHT = 1080;
103     vDecSample->DEFAULT_FRAME_RATE = 30;
104     ASSERT_EQ(AV_ERR_OK, vDecSample->RunVideoDec_Surface("OH.Media.Codec.Decoder.Video.AVC"));
105     vDecSample->WaitForEOS();
106     bool isVaild = false;
107     OH_VideoDecoder_IsValid(vDecSample->vdec_, &isVaild);
108     ASSERT_EQ(false, isVaild);
109     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
110 }
111 
112 /**
113  * @tc.number    : VIDEO_SWDEC_FUNCTION_0700
114  * @tc.name      : test set EOS when last frame
115  * @tc.desc      : function test
116  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0700, TestSize.Level1)117 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0700, TestSize.Level1)
118 {
119     auto vDecSample = make_shared<VDecNdkSample>();
120     vDecSample->INP_DIR = INP_DIR_1080_30;
121     vDecSample->DEFAULT_WIDTH = 1920;
122     vDecSample->DEFAULT_HEIGHT = 1080;
123     vDecSample->DEFAULT_FRAME_RATE = 30;
124     vDecSample->SURFACE_OUTPUT = false;
125     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
126     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
127     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
128     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
129     vDecSample->WaitForEOS();
130     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
131 }
132 
133 /**
134  * @tc.number    : VIDEO_SWDEC_FUNCTION_0800
135  * @tc.name      : test set EOS before last frame then stop
136  * @tc.desc      : function test
137  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0800, TestSize.Level1)138 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_0800, TestSize.Level1)
139 {
140     auto vDecSample = make_shared<VDecNdkSample>();
141     vDecSample->INP_DIR = INP_DIR_1080_30;
142     vDecSample->DEFAULT_WIDTH = 1920;
143     vDecSample->DEFAULT_HEIGHT = 1080;
144     vDecSample->DEFAULT_FRAME_RATE = 30;
145     vDecSample->SURFACE_OUTPUT = false;
146     vDecSample->BEFORE_EOS_INPUT = true;
147     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
148     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
149     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
150     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
151     vDecSample->WaitForEOS();
152     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
153 }
154 /**
155  * @tc.number    : VIDEO_SWDEC_FUNCTION_4000
156  * @tc.name      : test set EOS before last frame then stop surface
157  * @tc.desc      : function test
158  */
159 
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_4000, TestSize.Level1)160 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_4000, TestSize.Level1)
161 {
162     auto vDecSample = make_shared<VDecNdkSample>();
163     vDecSample->INP_DIR = INP_DIR_1080_30;
164     vDecSample->DEFAULT_WIDTH = 1920;
165     vDecSample->DEFAULT_HEIGHT = 1080;
166     vDecSample->DEFAULT_FRAME_RATE = 30;
167     vDecSample->SURFACE_OUTPUT = true;
168     vDecSample->BEFORE_EOS_INPUT = true;
169     ASSERT_EQ(AV_ERR_OK, vDecSample->RunVideoDec_Surface("OH.Media.Codec.Decoder.Video.AVC"));
170     vDecSample->WaitForEOS();
171     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
172 }
173 
174 /**
175  * @tc.number    : VIDEO_SWDEC_FUNCTION_1000
176  * @tc.name      : test reconfigure for new file with one decoder
177  * @tc.desc      : function test
178  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1000, TestSize.Level1)179 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1000, TestSize.Level1)
180 {
181     auto vDecSample = make_shared<VDecNdkSample>();
182     vDecSample->INP_DIR = INP_DIR_1080_30;
183     vDecSample->DEFAULT_WIDTH = 1920;
184     vDecSample->DEFAULT_HEIGHT = 1080;
185     vDecSample->DEFAULT_FRAME_RATE = 30;
186     vDecSample->SURFACE_OUTPUT = false;
187     vDecSample->AFTER_EOS_DESTORY_CODEC = false;
188     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
189     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
190     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
191     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
192     vDecSample->WaitForEOS();
193     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
194     ASSERT_EQ(AV_ERR_OK, vDecSample->Reset());
195     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
196     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
197     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
198     vDecSample->WaitForEOS();
199     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
200 }
201 
202 /**
203  * @tc.number    : VIDEO_SWDEC_FUNCTION_1100
204  * @tc.name      : test reconfigure for new file with the recreated decoder
205  * @tc.desc      : function test
206  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1100, TestSize.Level1)207 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1100, TestSize.Level1)
208 {
209     auto vDecSample = make_shared<VDecNdkSample>();
210     vDecSample->INP_DIR = INP_DIR_1080_30;
211     vDecSample->DEFAULT_WIDTH = 1920;
212     vDecSample->DEFAULT_HEIGHT = 1080;
213     vDecSample->DEFAULT_FRAME_RATE = 30;
214     vDecSample->SURFACE_OUTPUT = false;
215     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
216     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
217     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
218     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
219     vDecSample->WaitForEOS();
220     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
221     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
222     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
223     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
224     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
225     vDecSample->WaitForEOS();
226     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
227 }
228 
229 /**
230  * @tc.number    : VIDEO_SWDEC_FUNCTION_1200
231  * @tc.name      : repeat start and stop 5 times before EOS
232  * @tc.desc      : function test
233  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1200, TestSize.Level2)234 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1200, TestSize.Level2)
235 {
236     auto vDecSample = make_shared<VDecNdkSample>();
237     vDecSample->INP_DIR = INP_DIR_1080_30;
238     vDecSample->DEFAULT_WIDTH = 1920;
239     vDecSample->DEFAULT_HEIGHT = 1080;
240     vDecSample->DEFAULT_FRAME_RATE = 30;
241     vDecSample->SURFACE_OUTPUT = false;
242     vDecSample->REPEAT_START_STOP_BEFORE_EOS = 5;
243     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
244     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
245     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
246     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
247     vDecSample->WaitForEOS();
248     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
249 }
250 
251 /**
252  * @tc.number    : VIDEO_SWDEC_FUNCTION_1300
253  * @tc.name      : repeat start and flush 5 times before EOS
254  * @tc.desc      : function test
255  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1300, TestSize.Level2)256 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1300, TestSize.Level2)
257 {
258     auto vDecSample = make_shared<VDecNdkSample>();
259     vDecSample->INP_DIR = INP_DIR_1080_30;
260     vDecSample->DEFAULT_WIDTH = 1920;
261     vDecSample->DEFAULT_HEIGHT = 1080;
262     vDecSample->DEFAULT_FRAME_RATE = 30;
263     vDecSample->SURFACE_OUTPUT = false;
264     vDecSample->REPEAT_START_FLUSH_BEFORE_EOS = 5;
265     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
266     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
267     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
268     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
269     vDecSample->WaitForEOS();
270     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
271 }
272 
273 /**
274  * @tc.number    : VIDEO_SWDEC_FUNCTION_1400
275  * @tc.name      : set larger width and height
276  * @tc.desc      : function test
277  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1400, TestSize.Level2)278 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1400, TestSize.Level2)
279 {
280     auto vDecSample = make_shared<VDecNdkSample>();
281     vDecSample->INP_DIR = INP_DIR_720_30;
282     vDecSample->DEFAULT_WIDTH = 1920;
283     vDecSample->DEFAULT_HEIGHT = 1080;
284     vDecSample->DEFAULT_FRAME_RATE = 30;
285     vDecSample->SURFACE_OUTPUT = false;
286     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
287     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
288     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
289     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
290     vDecSample->WaitForEOS();
291     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
292 }
293 
294 /**
295  * @tc.number    : VIDEO_SWDEC_FUNCTION_1500
296  * @tc.name      : set the width and height to a samller value
297  * @tc.desc      : function test
298  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1500, TestSize.Level2)299 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1500, TestSize.Level2)
300 {
301     auto vDecSample = make_shared<VDecNdkSample>();
302     vDecSample->INP_DIR = INP_DIR_1080_30;
303     vDecSample->DEFAULT_WIDTH = 1280;
304     vDecSample->DEFAULT_HEIGHT = 720;
305     vDecSample->DEFAULT_FRAME_RATE = 30;
306     vDecSample->SURFACE_OUTPUT = false;
307     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
308     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
309     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
310     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
311     vDecSample->WaitForEOS();
312     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
313 }
314 
315 /**
316  * @tc.number    : VIDEO_SWDEC_FUNCTION_1600
317  * @tc.name      : resolution change
318  * @tc.desc      : function test
319  */
HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1600, TestSize.Level2)320 HWTEST_F(SwdecFuncNdkTest, VIDEO_SWDEC_FUNCTION_1600, TestSize.Level2)
321 {
322     auto vDecSample = make_shared<VDecNdkSample>();
323     vDecSample->INP_DIR = "/data/test/media/resolutionChange.h264";
324     vDecSample->DEFAULT_WIDTH = 1104;
325     vDecSample->DEFAULT_HEIGHT = 622;
326     vDecSample->DEFAULT_FRAME_RATE = 30;
327     vDecSample->SURFACE_OUTPUT = false;
328     ASSERT_EQ(AV_ERR_OK, vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.AVC"));
329     ASSERT_EQ(AV_ERR_OK, vDecSample->ConfigureVideoDecoder());
330     ASSERT_EQ(AV_ERR_OK, vDecSample->SetVideoDecoderCallback());
331     ASSERT_EQ(AV_ERR_OK, vDecSample->StartVideoDecoder());
332     vDecSample->WaitForEOS();
333     ASSERT_EQ(AV_ERR_OK, vDecSample->errCount);
334 }
335 } // namespace