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 "image_effect_inner_unittest.h"
17
18 #include "efilter_factory.h"
19 #include "brightness_efilter.h"
20 #include "contrast_efilter.h"
21 #include "test_common.h"
22 #include "external_loader.h"
23 #include "crop_efilter.h"
24
25 using namespace testing::ext;
26 using ::testing::_;
27 using ::testing::A;
28 using ::testing::InSequence;
29 using ::testing::Mock;
30 using ::testing::Return;
31 using namespace OHOS::Media::Effect::Test;
32
33 namespace {
34 constexpr uint32_t CROP_FACTOR = 2;
35 }
36
37 namespace OHOS {
38 namespace Media {
39 namespace Effect {
40 class FakeEFilter : public EFilter {
41 public:
FakeEFilter(const std::string &name)42 explicit FakeEFilter(const std::string &name) : EFilter(name) {}
~FakeEFilter()43 ~FakeEFilter() {}
44
45 ErrorCode Render(EffectBuffer *buffer, std::shared_ptr<EffectContext> &context) override
46 {
47 return PushData(buffer, context);
48 }
49
50 ErrorCode Render(EffectBuffer *src, EffectBuffer *dst, std::shared_ptr<EffectContext> &context) override
51 {
52 return ErrorCode::SUCCESS;
53 }
54
55 ErrorCode Restore(const EffectJsonPtr &values) override
56 {
57 return ErrorCode::SUCCESS;
58 }
59 };
60
61 class FakeImageEffect : public ImageEffect {
62 public:
FakeImageEffect()63 explicit FakeImageEffect() : ImageEffect("ImageEffect") {}
~FakeImageEffect()64 ~FakeImageEffect() {}
65 };
66
SetUpTestCase()67 void ImageEffectInnerUnittest::SetUpTestCase() {}
68
TearDownTestCase()69 void ImageEffectInnerUnittest::TearDownTestCase() {}
70
SetUp()71 void ImageEffectInnerUnittest::SetUp()
72 {
73 ExternLoader::Instance()->InitExt();
74 EFilterFactory::Instance()->functions_.clear();
75 EFilterFactory::Instance()->RegisterEFilter<BrightnessEFilter>(BRIGHTNESS_EFILTER);
76 EFilterFactory::Instance()->RegisterEFilter<ContrastEFilter>(CONTRAST_EFILTER);
77 EFilterFactory::Instance()->RegisterEFilter<CropEFilter>(CROP_EFILTER);
78 EFilterFactory::Instance()->delegates_.clear();
79 mockPixelMap_ = new MockPixelMap();
80 imageEffect_ = new FakeImageEffect();
81 efilter_ = new FakeEFilter(BRIGHTNESS_EFILTER);
82
83 std::shared_ptr<BufferInfo> info = std::make_unique<BufferInfo>();
84 info->width_ = mockPixelMap_->GetWidth();
85 info->height_ = mockPixelMap_->GetHeight();
86 info->rowStride_ = mockPixelMap_->GetRowStride();
87 info->len_ = mockPixelMap_->GetHeight() * mockPixelMap_->GetRowStride();
88 info->formatType_ = IEffectFormat::RGBA8888;
89 std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
90 extraInfo->dataType = DataType::PIXEL_MAP;
91 extraInfo->bufferType = BufferType::HEAP_MEMORY;
92 extraInfo->pixelMap = mockPixelMap_;
93 extraInfo->surfaceBuffer = nullptr;
94 effectBuffer_ = new EffectBuffer(info, (void *)mockPixelMap_->GetPixels(), extraInfo);
95 }
96
TearDown()97 void ImageEffectInnerUnittest::TearDown()
98 {
99 delete(mockPixelMap_);
100 Mock::AllowLeak(imageEffect_);
101 Mock::AllowLeak(efilter_);
102 delete(effectBuffer_);
103 }
104
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_001, TestSize.Level1)105 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_001, TestSize.Level1)
106 {
107 InSequence s;
108 std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
109 imageEffect_->AddEFilter(efilter);
110 Plugin::Any value = 200.f;
111 efilter->SetValue(KEY_FILTER_INTENSITY, value);
112 ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
113 ASSERT_EQ(result, ErrorCode::SUCCESS);
114 result = imageEffect_->Start();
115 ASSERT_EQ(result, ErrorCode::SUCCESS);
116 }
117
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_002, TestSize.Level1)118 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_002, TestSize.Level1)
119 {
120 InSequence s;
121 std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
122 Plugin::Any value = 200.f;
123 efilter->SetValue(KEY_FILTER_INTENSITY, value);
124 std::shared_ptr<EffectBuffer> src = std::make_shared<EffectBuffer>(
125 effectBuffer_->bufferInfo_, effectBuffer_->buffer_, effectBuffer_->extraInfo_);
126
127 ErrorCode result = efilter->Render(src, src);
128 ASSERT_EQ(result, ErrorCode::SUCCESS);
129 }
130
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_003, TestSize.Level1)131 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_003, TestSize.Level1)
132 {
133 std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
134 imageEffect_->AddEFilter(efilter);
135 Plugin::Any value = 100.f;
136 efilter->SetValue(KEY_FILTER_INTENSITY, value);
137 ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
138 ASSERT_EQ(result, ErrorCode::SUCCESS);
139 result = imageEffect_->SetOutputPixelMap(mockPixelMap_);
140 ASSERT_EQ(result, ErrorCode::SUCCESS);
141 result = imageEffect_->Start();
142 ASSERT_EQ(result, ErrorCode::SUCCESS);
143 }
144
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_004, TestSize.Level1)145 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_004, TestSize.Level1)
146 {
147 std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER);
148 imageEffect_->AddEFilter(efilter);
149 uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR);
150 uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR);
151 uint32_t areaInfo[] = { 0, 0, x1, y1};
152 Plugin::Any value = static_cast<void *>(areaInfo);
153 efilter->SetValue(KEY_FILTER_REGION, value);
154 ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
155 ASSERT_EQ(result, ErrorCode::SUCCESS);
156 result = imageEffect_->SetOutputPixelMap(mockPixelMap_);
157 ASSERT_EQ(result, ErrorCode::SUCCESS);
158 result = imageEffect_->Start();
159 ASSERT_EQ(result, ErrorCode::SUCCESS);
160 }
161
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_005, TestSize.Level1)162 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_005, TestSize.Level1)
163 {
164 std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER);
165 imageEffect_->AddEFilter(efilter);
166 uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR);
167 uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR);
168 uint32_t areaInfo[] = { 0, 0, x1, y1};
169 Plugin::Any value = static_cast<void *>(areaInfo);
170 efilter->SetValue(KEY_FILTER_REGION, value);
171 ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
172 ASSERT_EQ(result, ErrorCode::SUCCESS);
173 result = imageEffect_->Start();
174 ASSERT_EQ(result, ErrorCode::SUCCESS);
175 }
176
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_006, TestSize.Level1)177 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_006, TestSize.Level1)
178 {
179 DataInfo dataInfo;
180 std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
181 std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
182 std::shared_ptr<EffectBuffer> effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, nullptr, extraInfo);
183 std::shared_ptr<ImageEffect> imageEffect = std::make_unique<ImageEffect>();
184
185 dataInfo.dataType_ = DataType::PATH;
186 dataInfo.path_ = "path";
187 EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, true), ErrorCode::SUCCESS);
188
189 dataInfo.dataType_ = DataType::NATIVE_WINDOW;
190 EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::SUCCESS);
191
192 dataInfo.dataType_ = DataType::UNKNOWN;
193 EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::ERR_NO_DATA);
194
195 dataInfo.dataType_ = static_cast<DataType>(100);
196 EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::ERR_UNSUPPORTED_DATA_TYPE);
197 }
198 } // namespace Effect
199 } // namespace Media
200 } // namespace OHOS