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