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