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
16 #include <iostream>
17 #include <cstdio>
18 #include <atomic>
19 #include <fstream>
20 #include <thread>
21 #include <mutex>
22 #include <queue>
23 #include <string>
24
25 #include "gtest/gtest.h"
26 #include "hdrcodec_ndk_sample.h"
27 #include "native_averrors.h"
28 #include "native_avcodec_base.h"
29 #include "native_avcapability.h"
30 namespace {
31 OH_AVCapability *cap_hevc = nullptr;
32 } // namespace
33
34 using namespace std;
35 using namespace OHOS;
36 using namespace OHOS::Media;
37 using namespace testing::ext;
38 namespace OHOS {
39 namespace Media {
40 class HDRFuncNdkTest : public testing::Test {
41 public:
42 // SetUpTestCase: Called before all test cases
43 static void SetUpTestCase(void);
44 // TearDownTestCase: Called after all test case
45 static void TearDownTestCase(void);
46 // SetUp: Called before each test cases
47 void SetUp(void);
48 // TearDown: Called after each test cases
49 void TearDown(void);
50 };
51
SetUpTestCase()52 void HDRFuncNdkTest::SetUpTestCase()
53 {
54 cap_hevc = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, true);
55 }
TearDownTestCase()56 void HDRFuncNdkTest::TearDownTestCase() {}
SetUp()57 void HDRFuncNdkTest::SetUp()
58 {
59 }
TearDown()60 void HDRFuncNdkTest::TearDown()
61 {
62 }
63 } // namespace Media
64 } // namespace OHOS
65
66 namespace {
67 /**
68 * @tc.number : HDR_FUNC_0030
69 * @tc.name : decode PQ HDRVivid by display mode, and then set HEVC_PROFILE_MAIN10 to encode
70 * @tc.desc : function test
71 */
72 HWTEST_F(HDRFuncNdkTest, HDR_FUNC_0010, TestSize.Level1)
73 {
74 if (!access("/system/lib64/media/", 0) && (cap_hevc)) {
75 shared_ptr<HDRCodecNdkSample> sample = make_shared<HDRCodecNdkSample>();
76 sample->DEFAULT_PROFILE = HEVC_PROFILE_MAIN_10;
77 sample->INP_DIR = "/data/test/media/pq_vivid.h265";
78 ASSERT_EQ(AV_ERR_OK, sample->CreateCodec());
79 ASSERT_EQ(AV_ERR_OK, sample->Configure());
80 ASSERT_EQ(AV_ERR_OK, sample->Start());
81 sample->WaitForEos();
82 ASSERT_EQ(0, sample->errorCount);
83 }
84 }
85 /**
86 * @tc.number : HDR_FUNC_0020
87 * @tc.name : decode HLG HDRVivid by display mode, and then set HEVC_PROFILE_MAIN10 to encode
88 * @tc.desc : function test
89 */
90 HWTEST_F(HDRFuncNdkTest, HDR_FUNC_0020, TestSize.Level1)
91 {
92 if (!access("/system/lib64/media/", 0) && (cap_hevc)) {
93 shared_ptr<HDRCodecNdkSample> sample = make_shared<HDRCodecNdkSample>();
94 sample->DEFAULT_PROFILE = HEVC_PROFILE_MAIN_10;
95 sample->INP_DIR = "/data/test/media/hlg_vivid_4k.h265";
96 ASSERT_EQ(AV_ERR_OK, sample->CreateCodec());
97 ASSERT_EQ(AV_ERR_OK, sample->Configure());
98 ASSERT_EQ(AV_ERR_OK, sample->Start());
99 sample->WaitForEos();
100 ASSERT_EQ(0, sample->errorCount);
101 }
102 }
103
104 /**
105 * @tc.number : HDR_FUNC_0030
106 * @tc.name : decode PQ HDRVivid by display mode, and then set HEVC_PROFILE_MAIN to encode
107 * @tc.desc : function test
108 */
109 HWTEST_F(HDRFuncNdkTest, HDR_FUNC_0030, TestSize.Level2)
110 {
111 if (!access("/system/lib64/media/", 0) && (cap_hevc)) {
112 shared_ptr<HDRCodecNdkSample> sample = make_shared<HDRCodecNdkSample>();
113 sample->DEFAULT_PROFILE = HEVC_PROFILE_MAIN;
114 sample->INP_DIR = "/data/test/media/pq_vivid.h265";
115 ASSERT_EQ(AV_ERR_OK, sample->CreateCodec());
116 ASSERT_EQ(AV_ERR_OK, sample->Configure());
117 ASSERT_EQ(AV_ERR_OK, sample->Start());
118 sample->WaitForEos();
119 EXPECT_LE(0, sample->errorCount);
120 }
121 }
122
123 /**
124 * @tc.number : HDR_FUNC_0040
125 * @tc.name : decode HLG HDRVivid by display mode, and then set HEVC_PROFILE_MAIN to encode
126 * @tc.desc : function test
127 */
128 HWTEST_F(HDRFuncNdkTest, HDR_FUNC_0040, TestSize.Level2)
129 {
130 if (!access("/system/lib64/media/", 0) && (cap_hevc)) {
131 shared_ptr<HDRCodecNdkSample> sample = make_shared<HDRCodecNdkSample>();
132 sample->DEFAULT_PROFILE = HEVC_PROFILE_MAIN;
133 sample->INP_DIR = "/data/test/media/hlg_vivid_4k.h265";
134 ASSERT_EQ(AV_ERR_OK, sample->CreateCodec());
135 ASSERT_EQ(AV_ERR_OK, sample->Configure());
136 ASSERT_EQ(AV_ERR_OK, sample->Start());
137 sample->WaitForEos();
138 EXPECT_LE(0, sample->errorCount);
139 }
140 }
141
142 /**
143 * @tc.number : HDR_FUNC_0050
144 * @tc.name : decode and encode HDRVivid repeat start-stop 5 times before EOS
145 * @tc.desc : function test
146 */
147 HWTEST_F(HDRFuncNdkTest, HDR_FUNC_0050, TestSize.Level2)
148 {
149 if (!access("/system/lib64/media/", 0) && (cap_hevc)) {
150 shared_ptr<HDRCodecNdkSample> sample = make_shared<HDRCodecNdkSample>();
151 sample->DEFAULT_PROFILE = HEVC_PROFILE_MAIN_10;
152 sample->INP_DIR = "/data/test/media/hlg_vivid_4k.h265";
153 sample->REPEAT_START_STOP_BEFORE_EOS = 5;
154 ASSERT_EQ(AV_ERR_OK, sample->CreateCodec());
155 ASSERT_EQ(AV_ERR_OK, sample->Configure());
156 ASSERT_EQ(AV_ERR_OK, sample->Start());
157 sample->WaitForEos();
158 ASSERT_EQ(0, sample->errorCount);
159 }
160 }
161
162 /**
163 * @tc.number : HDR_FUNC_0060
164 * @tc.name : decode and encode HDRVivid repeat start-flush-stop 5 times before EOS
165 * @tc.desc : function test
166 */
167 HWTEST_F(HDRFuncNdkTest, HDR_FUNC_0060, TestSize.Level2)
168 {
169 if (!access("/system/lib64/media/", 0) && (cap_hevc)) {
170 shared_ptr<HDRCodecNdkSample> sample = make_shared<HDRCodecNdkSample>();
171 sample->DEFAULT_PROFILE = HEVC_PROFILE_MAIN_10;
172 sample->INP_DIR = "/data/test/media/hlg_vivid_4k.h265";
173 sample->REPEAT_START_FLUSH_STOP_BEFORE_EOS = 5;
174 ASSERT_EQ(AV_ERR_OK, sample->CreateCodec());
175 ASSERT_EQ(AV_ERR_OK, sample->Configure());
176 ASSERT_EQ(AV_ERR_OK, sample->Start());
177 sample->WaitForEos();
178 ASSERT_EQ(0, sample->errorCount);
179 }
180 }
181
182 /**
183 * @tc.number : HDR_FUNC_0070
184 * @tc.name : decode and encode HDRVivid repeat start-flush-start 5 times before EOS
185 * @tc.desc : function test
186 */
187 HWTEST_F(HDRFuncNdkTest, HDR_FUNC_0070, TestSize.Level2)
188 {
189 if (!access("/system/lib64/media/", 0) && (cap_hevc)) {
190 shared_ptr<HDRCodecNdkSample> sample = make_shared<HDRCodecNdkSample>();
191 sample->DEFAULT_PROFILE = HEVC_PROFILE_MAIN_10;
192 sample->INP_DIR = "/data/test/media/hlg_vivid_4k.h265";
193 sample->REPEAT_START_FLUSH_BEFORE_EOS = 5;
194 ASSERT_EQ(AV_ERR_OK, sample->CreateCodec());
195 ASSERT_EQ(AV_ERR_OK, sample->Configure());
196 ASSERT_EQ(AV_ERR_OK, sample->Start());
197 sample->WaitForEos();
198 ASSERT_EQ(0, sample->errorCount);
199 }
200 }
201
202 /**
203 * @tc.number : HDR_FUNC_0080
204 * @tc.name : decode and encode different resolution with same codec
205 * @tc.desc : function test
206 */
207 HWTEST_F(HDRFuncNdkTest, HDR_FUNC_0080, TestSize.Level1)
208 {
209 if (!access("/system/lib64/media/", 0) && (cap_hevc)) {
210 shared_ptr<HDRCodecNdkSample> sample = make_shared<HDRCodecNdkSample>();
211 sample->DEFAULT_PROFILE = HEVC_PROFILE_MAIN_10;
212 sample->INP_DIR = "/data/test/media/hlg_vivid_4k.h265";
213 ASSERT_EQ(AV_ERR_OK, sample->CreateCodec());
214 ASSERT_EQ(AV_ERR_OK, sample->Configure());
215 ASSERT_EQ(AV_ERR_OK, sample->Start());
216 sample->WaitForEos();
217 sample->DEFAULT_WIDTH = 1920;
218 sample->DEFAULT_HEIGHT = 1080;
219 sample->INP_DIR = "/data/test/media/hlg_vivid_1080p.h265";
220 ASSERT_EQ(AV_ERR_OK, sample->ReConfigure());
221 ASSERT_EQ(AV_ERR_OK, sample->Start());
222 sample->WaitForEos();
223 ASSERT_EQ(0, sample->errorCount);
224 }
225 }
226 } // namespace