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