• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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 "gtest/gtest.h"
17 #include "effect_log.h"
18 #include "image_source.h"
19 #include "pixel_map.h"
20 #include "colorspace_processor.h"
21 #include "colorspace_helper.h"
22 #include "colorspace_manager.h"
23 #include "colorspace_strategy.h"
24 
25 using namespace testing::ext;
26 
27 namespace OHOS {
28 namespace Media {
29 namespace Effect {
30 namespace Test {
31 
32 static const std::string TAG = "ColorSpaceTest";
33 constexpr char TEST_IMAGE_PATH[] = "/data/test/resource/image_effect_1k_test1.jpg";
34 
CreatePictureByPath(std::string imagePath)35 static std::unique_ptr<Picture> CreatePictureByPath(std::string imagePath)
36 {
37     SourceOptions opts;
38     uint32_t errorCode = 0;
39     EFFECT_LOGW("%{public}s create pixelmap by path %{public}s", TAG.c_str(), imagePath.c_str());
40     std::unique_ptr<ImageSource> imageSource = ImageSource::CreateImageSource(imagePath, opts, errorCode);
41     CHECK_AND_RETURN_RET_LOG(imageSource != nullptr, nullptr,
42         "CreateImageSource fail! path=%{public}s, errorCode=%{public}d", imagePath.c_str(), errorCode);
43 
44     DecodingOptionsForPicture decodingOptions;
45     decodingOptions.desireAuxiliaryPictures.insert(AuxiliaryPictureType::GAINMAP);
46     std::unique_ptr<Picture> picture = imageSource->CreatePicture(decodingOptions, errorCode);
47     CHECK_AND_RETURN_RET_LOG(picture != nullptr, nullptr,
48         "CreatePicture fail! path=%{public}s, errorCode=%{public}d", imagePath.c_str(), errorCode);
49 
50     return picture;
51 }
52 
CreateEffectBufferByPicture(Picture * picture)53 static std::shared_ptr<EffectBuffer> CreateEffectBufferByPicture(Picture* picture)
54 {
55     if (picture == nullptr) {
56         return nullptr;
57     }
58 
59     std::shared_ptr<PixelMap> pixelMap = picture->GetMainPixel();
60     if (pixelMap == nullptr) {
61         return nullptr;
62     }
63 
64     std::shared_ptr<BufferInfo> info = std::make_shared<BufferInfo>();
65     info->width_ = pixelMap->GetWidth();
66     info->height_ = pixelMap->GetHeight();
67     info->rowStride_ = pixelMap->GetRowStride();
68     info->len_ = info->rowStride_ * info->height_;
69     info->formatType_ = IEffectFormat::RGBA8888;
70     info->surfaceBuffer_ = nullptr;
71     uint8_t *pixels = const_cast<uint8_t *>(pixelMap->GetPixels());
72     void *addr = static_cast<void *>(pixels);
73     info->pixelMap_ = pixelMap.get();
74 
75     std::shared_ptr<ExtraInfo> extraInfo = std::make_shared<ExtraInfo>();
76     extraInfo->dataType = DataType::PIXEL_MAP;
77     extraInfo->bufferType = BufferType::HEAP_MEMORY;
78     extraInfo->picture = picture;
79 
80     std::shared_ptr<EffectBuffer> effectBuf = std::make_shared<EffectBuffer>(info, addr, extraInfo);
81     return effectBuf != nullptr && effectBuf->buffer_ != nullptr ? effectBuf : nullptr;
82 }
83 
84 static std::unique_ptr<Picture> g_picture = nullptr;
85 
86 class TestEffectColorSpaceManager : public testing::Test {
87 public:
88     TestEffectColorSpaceManager() = default;
89 
90     ~TestEffectColorSpaceManager() override = default;
91 
SetUpTestCase()92     static void SetUpTestCase()
93     {
94         g_picture = CreatePictureByPath(TEST_IMAGE_PATH);
95         EXPECT_NE(g_picture, nullptr);
96     }
97 
TearDownTestCase()98     static void TearDownTestCase()
99     {
100         g_picture = nullptr;
101     }
102 
SetUp()103     void SetUp() override
104     {
105         effectContext_->memoryManager_ = std::make_shared<EffectMemoryManager>();
106         effectContext_->colorSpaceManager_ = std::make_shared<ColorSpaceManager>();
107     }
108 
TearDown()109     void TearDown() override
110     {
111         effectContext_ = nullptr;
112     }
113 
114     std::shared_ptr<EffectContext> effectContext_ = std::make_shared<EffectContext>();
115 };
116 
117 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceConverter_ApplyColorSpace001, TestSize.Level1)
118 {
119     EFFECT_LOGW("%{public}s ColorSpaceConverter_ApplyColorSpace001 enter", TAG.c_str());
120     std::shared_ptr<EffectBuffer> inputEffectBuffer = CreateEffectBufferByPicture(g_picture.get());
121     EXPECT_NE(inputEffectBuffer, nullptr);
122 
123     EffectColorSpace targetColorSpace = EffectColorSpace::SRGB;
124     ErrorCode result = ColorSpaceProcessor::ApplyColorSpace(inputEffectBuffer.get(), targetColorSpace);
125     EXPECT_EQ(result, ErrorCode::SUCCESS);
126 
127     inputEffectBuffer->extraInfo_->dataType = DataType::URI;
128     result = ColorSpaceProcessor::ApplyColorSpace(inputEffectBuffer.get(), targetColorSpace);
129     EXPECT_EQ(result, ErrorCode::SUCCESS);
130 
131     inputEffectBuffer->extraInfo_->dataType = DataType::UNKNOWN;
132     result = ColorSpaceProcessor::ApplyColorSpace(inputEffectBuffer.get(), targetColorSpace);
133     EXPECT_NE(result, ErrorCode::SUCCESS);
134     EFFECT_LOGW("%{public}s ColorSpaceConverter_ApplyColorSpace001 end", TAG.c_str());
135 }
136 
137 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceConverter_GetMemoryData001, TestSize.Level1)
138 {
139     EFFECT_LOGW("%{public}s ColorSpaceConverter_GetMemoryData001 enter", TAG.c_str());
140     SurfaceBuffer *sb = OHOS::SurfaceBuffer::Create();
141     std::shared_ptr<ColorSpaceProcessor> colorSpaceConverter = std::make_shared<ColorSpaceProcessor>();
142     auto result = colorSpaceConverter->GetMemoryData(sb);
143     EXPECT_EQ(result, nullptr);
144 
145     std::shared_ptr<MemoryData> memoryData = std::make_shared<MemoryData>();
146     memoryData->memoryInfo.extra = static_cast<void *>(sb);
147 
148     colorSpaceConverter->memoryDataArray_.emplace_back(memoryData);
149     result = colorSpaceConverter->GetMemoryData(sb);
150     EXPECT_NE(result, nullptr);
151     EFFECT_LOGW("%{public}s ColorSpaceConverter_GetMemoryData001 end", TAG.c_str());
152 }
153 
154 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceHelper_ConvertToColorSpaceName001, TestSize.Level1)
155 {
156     EFFECT_LOGW("%{public}s ColorSpaceHelper_ConvertToColorSpaceName001 enter", TAG.c_str());
157     EffectColorSpace colorSpace = EffectColorSpace::DEFAULT;
158     OHOS::ColorManager::ColorSpaceName result = ColorSpaceHelper::ConvertToColorSpaceName(colorSpace);
159     EXPECT_EQ(result, OHOS::ColorManager::ColorSpaceName::NONE);
160     EFFECT_LOGW("%{public}s ColorSpaceHelper_ConvertToColorSpaceName001 end", TAG.c_str());
161 }
162 
163 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceHelper_ConvertToCMColorSpace001, TestSize.Level1)
164 {
165     EFFECT_LOGW("%{public}s ColorSpaceHelper_ConvertToCMColorSpace001 enter", TAG.c_str());
166     EffectColorSpace colorSpace = EffectColorSpace::DEFAULT;
167     OHOS::HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType type =
168         ColorSpaceHelper::ConvertToCMColorSpace(colorSpace);
169     EXPECT_EQ(type, OHOS::HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType::CM_COLORSPACE_NONE);
170 
171     colorSpace = EffectColorSpace::SRGB;
172     type = ColorSpaceHelper::ConvertToCMColorSpace(colorSpace);
173     EXPECT_NE(type, OHOS::HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType::CM_COLORSPACE_NONE);
174     EFFECT_LOGW("%{public}s ColorSpaceHelper_ConvertToCMColorSpace001 end", TAG.c_str());
175 }
176 
177 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceHelper_ConvertColorSpace001, TestSize.Level1)
178 {
179     EFFECT_LOGW("%{public}s ColorSpaceHelper_ConvertColorSpace001 enter", TAG.c_str());
180     std::shared_ptr<EffectBuffer> inputEffectBuffer = CreateEffectBufferByPicture(g_picture.get());
181     EXPECT_NE(inputEffectBuffer, nullptr);
182 
183     inputEffectBuffer->bufferInfo_->colorSpace_ = EffectColorSpace::ADOBE_RGB;
184     effectContext_->colorSpaceManager_->strategy_ = std::make_shared<ColorSpaceStrategy>();
185     effectContext_->colorSpaceManager_->strategy_->src_ = CreateEffectBufferByPicture(g_picture.get());
186 
187     ErrorCode result = ColorSpaceHelper::ConvertColorSpace(inputEffectBuffer, effectContext_);
188     EXPECT_EQ(result, ErrorCode::SUCCESS);
189     EFFECT_LOGW("%{public}s ColorSpaceHelper_ConvertColorSpace001 end", TAG.c_str());
190 }
191 
192 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceHelper_UpdateMetadata001, TestSize.Level1)
193 {
194     EFFECT_LOGW("%{public}s ColorSpaceHelper_UpdateMetadata001 enter", TAG.c_str());
195     std::shared_ptr<EffectBuffer> inputEffectBuffer = CreateEffectBufferByPicture(g_picture.get());
196     EXPECT_NE(inputEffectBuffer, nullptr);
197 
198     inputEffectBuffer->bufferInfo_->surfaceBuffer_ = nullptr;
199     std::shared_ptr<EffectContext> context = std::make_unique<EffectContext>();
200     ErrorCode result = ColorSpaceHelper::UpdateMetadata(inputEffectBuffer.get(), context);
201     EXPECT_EQ(result, ErrorCode::SUCCESS);
202 
203     inputEffectBuffer->bufferInfo_->surfaceBuffer_ = OHOS::SurfaceBuffer::Create();
204     inputEffectBuffer->bufferInfo_->colorSpace_ = EffectColorSpace::DEFAULT;
205     result = ColorSpaceHelper::UpdateMetadata(inputEffectBuffer.get(), context);
206     EXPECT_EQ(result, ErrorCode::SUCCESS);
207 
208     inputEffectBuffer->bufferInfo_->colorSpace_ = EffectColorSpace::SRGB;
209     result = ColorSpaceHelper::UpdateMetadata(inputEffectBuffer.get(), context);
210     EXPECT_EQ(result, ErrorCode::SUCCESS);
211     EFFECT_LOGW("%{public}s ColorSpaceHelper_UpdateMetadata001 end", TAG.c_str());
212 }
213 
214 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceManager_ApplyColorSpace001, TestSize.Level1)
215 {
216     EFFECT_LOGW("%{public}s ColorSpaceManager_ApplyColorSpace001 enter", TAG.c_str());
217     std::shared_ptr<EffectBuffer> inputEffectBuffer = CreateEffectBufferByPicture(g_picture.get());
218     EXPECT_NE(inputEffectBuffer, nullptr);
219 
220     EffectColorSpace colorSpace = EffectColorSpace::DEFAULT;
221     EffectColorSpace outputColorSpace = EffectColorSpace::DEFAULT;
222     std::shared_ptr<ColorSpaceManager> colorSpaceManager = std::make_shared<ColorSpaceManager>();
223     ErrorCode result = colorSpaceManager->ApplyColorSpace(inputEffectBuffer.get(), colorSpace, outputColorSpace);
224     EXPECT_EQ(result, ErrorCode::SUCCESS);
225 
226     colorSpace = EffectColorSpace::ADOBE_RGB;
227     result = colorSpaceManager->ApplyColorSpace(inputEffectBuffer.get(), colorSpace, outputColorSpace);
228     EXPECT_NE(result, ErrorCode::SUCCESS);
229     EFFECT_LOGW("%{public}s ColorSpaceManager_ApplyColorSpace001 end", TAG.c_str());
230 }
231 
232 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceStrategy_IsSupportedColorSpace001, TestSize.Level1)
233 {
234     EFFECT_LOGW("%{public}s ColorSpaceStrategy_IsSupportedColorSpace001 enter", TAG.c_str());
235     EffectColorSpace colorSpace = EffectColorSpace::SRGB;
236     bool result = ColorSpaceStrategy::IsSupportedColorSpace(colorSpace);
237     EXPECT_EQ(result, true);
238 
239     colorSpace = EffectColorSpace::DEFAULT;
240     result = ColorSpaceStrategy::IsSupportedColorSpace(colorSpace);
241     EXPECT_EQ(result, false);
242     EFFECT_LOGW("%{public}s ColorSpaceStrategy_IsSupportedColorSpace001 end", TAG.c_str());
243 }
244 
245 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceStrategy_ChooseColorSpace001, TestSize.Level1)
246 {
247     EFFECT_LOGW("%{public}s ColorSpaceStrategy_ChooseColorSpace001 enter", TAG.c_str());
248     std::unordered_set<EffectColorSpace> filtersSupportedColorSpace = { EffectColorSpace::SRGB };
249     EffectColorSpace srcRealColorSpace = EffectColorSpace::SRGB;
250     EffectColorSpace outputColorSpace = EffectColorSpace::DEFAULT;
251 
252     std::shared_ptr<ColorSpaceStrategy> colorSpaceStrategy = std::make_shared<ColorSpaceStrategy>();
253     colorSpaceStrategy->src_ = CreateEffectBufferByPicture(g_picture.get());
254     colorSpaceStrategy->dst_ = nullptr;
255     ErrorCode result = colorSpaceStrategy->ChooseColorSpace(filtersSupportedColorSpace,
256         srcRealColorSpace, outputColorSpace);
257     EXPECT_EQ(result, ErrorCode::SUCCESS);
258 
259     colorSpaceStrategy->dst_ = CreateEffectBufferByPicture(g_picture.get());
260     result = colorSpaceStrategy->ChooseColorSpace(filtersSupportedColorSpace, srcRealColorSpace, outputColorSpace);
261     EXPECT_EQ(result, ErrorCode::SUCCESS);
262 
263     colorSpaceStrategy->dst_->buffer_ = nullptr;
264     result = colorSpaceStrategy->ChooseColorSpace(filtersSupportedColorSpace, srcRealColorSpace, outputColorSpace);
265     EXPECT_EQ(result, ErrorCode::SUCCESS);
266 
267     srcRealColorSpace = EffectColorSpace::ADOBE_RGB;
268     result = colorSpaceStrategy->ChooseColorSpace(filtersSupportedColorSpace, srcRealColorSpace, outputColorSpace);
269     EXPECT_NE(result, ErrorCode::SUCCESS);
270     EFFECT_LOGW("%{public}s ColorSpaceStrategy_ChooseColorSpace001 end", TAG.c_str());
271 }
272 
273 HWTEST_F(TestEffectColorSpaceManager, ColorSpaceStrategy_CheckConverterColorSpace001, TestSize.Level1)
274 {
275     EFFECT_LOGW("%{public}s ColorSpaceStrategy_CheckConverterColorSpace001 enter", TAG.c_str());
276     EffectColorSpace targetColorSpace = EffectColorSpace::SRGB;
277     std::shared_ptr<ColorSpaceStrategy> colorSpaceStrategy = std::make_shared<ColorSpaceStrategy>();
278     colorSpaceStrategy->src_ = CreateEffectBufferByPicture(g_picture.get());
279     colorSpaceStrategy->dst_ = nullptr;
280     ErrorCode result = colorSpaceStrategy->CheckConverterColorSpace(targetColorSpace);
281     EXPECT_EQ(result, ErrorCode::SUCCESS);
282 
283     colorSpaceStrategy->dst_ = CreateEffectBufferByPicture(g_picture.get());
284     result = colorSpaceStrategy->CheckConverterColorSpace(targetColorSpace);
285     EXPECT_EQ(result, ErrorCode::SUCCESS);
286 
287     colorSpaceStrategy->dst_->buffer_ = nullptr;
288     result = colorSpaceStrategy->CheckConverterColorSpace(targetColorSpace);
289     EXPECT_NE(result, ErrorCode::SUCCESS);
290     EFFECT_LOGW("%{public}s ColorSpaceStrategy_CheckConverterColorSpace001 end", TAG.c_str());
291 }
292 }
293 }
294 }
295 }
296