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