1 /*
2 * Copyright (C) 2025 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
19 #include <atomic>
20 #include <fstream>
21 #include <thread>
22 #include <mutex>
23 #include <queue>
24 #include <string>
25 #include "native_avcapability.h"
26 #include "gtest/gtest.h"
27 #include "videodec_sample.h"
28 using namespace std;
29 using namespace OHOS;
30 using namespace OHOS::Media;
31 using namespace testing::ext;
32 namespace OHOS {
33 namespace Media {
34 class Mpeg2SwdecCompNdkTest : public testing::Test {
35 public:
36 // SetUpTestCase: Called before all test cases
37 static void SetUpTestCase(void);
38 // TearDownTestCase: Called after all test case
39 static void TearDownTestCase(void);
40 // SetUp: Called before each test cases
41 void SetUp(void);
42 // TearDown: Called after each test cases
43 void TearDown(void);
44
45 protected:
46 const ::testing::TestInfo *testInfo_ = nullptr;
47 bool createCodecSuccess_ = false;
48 };
49
50 namespace {
51 static OH_AVCapability *cap_mpeg2 = nullptr;
52 static string g_codecNameMpeg2 = "";
53 } // namespace
54
SetUpTestCase(void)55 void Mpeg2SwdecCompNdkTest::SetUpTestCase(void)
56 {
57 cap_mpeg2 = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_MPEG2, false, SOFTWARE);
58 g_codecNameMpeg2 = OH_AVCapability_GetName(cap_mpeg2);
59 cout << "g_codecNameMpeg2: " << g_codecNameMpeg2 << endl;
60 }
TearDownTestCase(void)61 void Mpeg2SwdecCompNdkTest::TearDownTestCase(void) {}
SetUp(void)62 void Mpeg2SwdecCompNdkTest::SetUp(void) {}
TearDown(void)63 void Mpeg2SwdecCompNdkTest::TearDown(void) {}
64 } // namespace Media
65 } // namespace OHOS
66
67 namespace {
68 /**
69 * @tc.number : VIDEO_SWDEC_MPEG2_IPB_0100
70 * @tc.name : software decode all i frame mpeg2 stream
71 * @tc.desc : function test
72 */
73 HWTEST_F(Mpeg2SwdecCompNdkTest, VIDEO_SWDEC_MPEG2_IPB_0100, TestSize.Level2)
74 {
75 if (cap_mpeg2 != nullptr) {
76 VDecNdkSample *vDecSample = new VDecNdkSample();
77 int32_t ret = vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.MPEG2");
78 ASSERT_EQ(AV_ERR_OK, ret);
79 vDecSample->INP_DIR = "/data/test/media/all_i_main@high14_level_1280_720_30.m2v";
80 vDecSample->DEFAULT_WIDTH = 1280;
81 vDecSample->DEFAULT_HEIGHT = 720;
82 ret = vDecSample->SetVideoDecoderCallback();
83 ASSERT_EQ(AV_ERR_OK, ret);
84 ret = vDecSample->ConfigureVideoDecoder();
85 ASSERT_EQ(AV_ERR_OK, ret);
86 ret = vDecSample->StartVideoDecoder();
87 ASSERT_EQ(AV_ERR_OK, ret);
88 vDecSample->WaitForEOS();
89 ASSERT_EQ(0, vDecSample->errCount);
90 }
91 }
92
93 /**
94 * @tc.number : VIDEO_SWDEC_MPEG2_IPB_0200
95 * @tc.name : software decode i/p frame mpeg2 stream
96 * @tc.desc : function test
97 */
98 HWTEST_F(Mpeg2SwdecCompNdkTest, VIDEO_SWDEC_MPEG2_IPB_0200, TestSize.Level2)
99 {
100 if (cap_mpeg2 != nullptr) {
101 VDecNdkSample *vDecSample = new VDecNdkSample();
102 int32_t ret = vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.MPEG2");
103 ASSERT_EQ(AV_ERR_OK, ret);
104 vDecSample->INP_DIR = "/data/test/media/ip_main@high14_level_1280_720_30.m2v";
105 vDecSample->DEFAULT_WIDTH = 1280;
106 vDecSample->DEFAULT_HEIGHT = 720;
107 ret = vDecSample->SetVideoDecoderCallback();
108 ASSERT_EQ(AV_ERR_OK, ret);
109 ret = vDecSample->ConfigureVideoDecoder();
110 ASSERT_EQ(AV_ERR_OK, ret);
111 ret = vDecSample->StartVideoDecoder();
112 ASSERT_EQ(AV_ERR_OK, ret);
113 vDecSample->WaitForEOS();
114 ASSERT_EQ(0, vDecSample->errCount);
115 }
116 }
117
118 /**
119 * @tc.number : VIDEO_SWDEC_MPEG2_IPB_0300
120 * @tc.name : software decode i/p/b frame mpeg2 stream
121 * @tc.desc : function test
122 */
123 HWTEST_F(Mpeg2SwdecCompNdkTest, VIDEO_SWDEC_MPEG2_IPB_0300, TestSize.Level2)
124 {
125 if (cap_mpeg2 != nullptr) {
126 VDecNdkSample *vDecSample = new VDecNdkSample();
127 int32_t ret = vDecSample->CreateVideoDecoder("OH.Media.Codec.Decoder.Video.MPEG2");
128 ASSERT_EQ(AV_ERR_OK, ret);
129 vDecSample->INP_DIR = "/data/test/media/ipb_main@high14_level_1280_720_30.m2v";
130 vDecSample->DEFAULT_WIDTH = 1280;
131 vDecSample->DEFAULT_HEIGHT = 720;
132 ret = vDecSample->SetVideoDecoderCallback();
133 ASSERT_EQ(AV_ERR_OK, ret);
134 ret = vDecSample->ConfigureVideoDecoder();
135 ASSERT_EQ(AV_ERR_OK, ret);
136 ret = vDecSample->StartVideoDecoder();
137 ASSERT_EQ(AV_ERR_OK, ret);
138 vDecSample->WaitForEOS();
139 ASSERT_EQ(0, vDecSample->errCount);
140 }
141 }
142 } // namespace