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