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 "heif_image.h"
17
18 const int ROTATE_90_DEGRESS = 90;
19 const int ROTATE_270_DEGRESS = 270;
20 static const std::string HEVC_ALPHA_AUX_TYPE = "urn:mpeg:hevc:2015:auxid:1";
21
22 namespace OHOS {
23 namespace ImagePlugin {
HeifImage(heif_item_id itemId)24 HeifImage::HeifImage(heif_item_id itemId) : itemId_(itemId) {}
25
~HeifImage()26 HeifImage::~HeifImage()
27 {
28 m_thumbnails.clear();
29 allMetadata_.clear();
30 auxImages_.clear();
31 nclxColorProfile_.reset();
32 rawColorProfile_.reset();
33 }
34
GetItemId() const35 heif_item_id HeifImage::GetItemId() const
36 {
37 return itemId_;
38 }
39
IsPrimaryImage() const40 bool HeifImage::IsPrimaryImage() const
41 {
42 return isPrimaryImage_;
43 }
44
SetPrimaryImage(bool flag)45 void HeifImage::SetPrimaryImage(bool flag)
46 {
47 isPrimaryImage_ = flag;
48 }
49
GetOriginalWidth() const50 uint32_t HeifImage::GetOriginalWidth() const
51 {
52 return originalWidth_;
53 }
54
GetOriginalHeight() const55 uint32_t HeifImage::GetOriginalHeight() const
56 {
57 return originalHeight_;
58 }
59
SetOriginalSize(uint32_t width,uint32_t height)60 void HeifImage::SetOriginalSize(uint32_t width, uint32_t height)
61 {
62 originalWidth_ = width;
63 originalHeight_ = height;
64 }
65
GetRotateDegrees() const66 int HeifImage::GetRotateDegrees() const
67 {
68 return rotateDegrees_;
69 }
70
SetRotateDegrees(int degrees)71 void HeifImage::SetRotateDegrees(int degrees)
72 {
73 rotateDegrees_ = degrees;
74 }
75
GetMirrorDirection() const76 HeifTransformMirrorDirection HeifImage::GetMirrorDirection() const
77 {
78 return mirrorDirection_;
79 }
80
SetMirrorDirection(HeifTransformMirrorDirection direction)81 void HeifImage::SetMirrorDirection(HeifTransformMirrorDirection direction)
82 {
83 mirrorDirection_ = direction;
84 }
85
IsResolutionReverse() const86 bool HeifImage::IsResolutionReverse() const
87 {
88 return rotateDegrees_ == ROTATE_90_DEGRESS || rotateDegrees_ == ROTATE_270_DEGRESS;
89 }
90
GetWidth() const91 uint32_t HeifImage::GetWidth() const
92 {
93 return IsResolutionReverse() ? originalHeight_ : originalWidth_;
94 }
95
GetHeight() const96 uint32_t HeifImage::GetHeight() const
97 {
98 return IsResolutionReverse() ? originalWidth_ : originalHeight_;
99 }
100
GetLumaBitNum() const101 int HeifImage::GetLumaBitNum() const
102 {
103 return lumaBitNum_;
104 }
105
SetLumaBitNum(int bitNum)106 void HeifImage::SetLumaBitNum(int bitNum)
107 {
108 lumaBitNum_ = bitNum;
109 }
110
GetChromaBitNum() const111 int HeifImage::GetChromaBitNum() const
112 {
113 return chromaBitNum_;
114 }
115
SetChromaBitNum(int bitNum)116 void HeifImage::SetChromaBitNum(int bitNum)
117 {
118 chromaBitNum_ = bitNum;
119 }
120
GetColorRangeFlag() const121 int HeifImage::GetColorRangeFlag() const
122 {
123 return colorRangeFlag_;
124 }
125
126
SetColorRangeFlag(int flag)127 void HeifImage::SetColorRangeFlag(int flag)
128 {
129 colorRangeFlag_ = flag;
130 }
131
GetDefaultColorFormat() const132 HeifColorFormat HeifImage::GetDefaultColorFormat() const
133 {
134 return defaultColorFormat_;
135 }
136
SetDefaultColorFormat(HeifColorFormat format)137 void HeifImage::SetDefaultColorFormat(HeifColorFormat format)
138 {
139 defaultColorFormat_ = format;
140 }
141
GetDefaultPixelFormat() const142 HeifPixelFormat HeifImage::GetDefaultPixelFormat() const
143 {
144 return defaultPixelFormat_;
145 }
146
SetDefaultPixelFormat(HeifPixelFormat format)147 void HeifImage::SetDefaultPixelFormat(HeifPixelFormat format)
148 {
149 defaultPixelFormat_ = format;
150 }
151
SetThumbnailImage(heif_item_id id)152 void HeifImage::SetThumbnailImage(heif_item_id id)
153 {
154 thumbnailMasterItemId_ = id;
155 }
156
AddThumbnailImage(const std::shared_ptr<HeifImage> & img)157 void HeifImage::AddThumbnailImage(const std::shared_ptr<HeifImage> &img)
158 {
159 m_thumbnails.push_back(img);
160 }
161
IsThumbnailImage() const162 bool HeifImage::IsThumbnailImage() const
163 {
164 return thumbnailMasterItemId_ != 0;
165 }
166
GetThumbnailImages() const167 const std::vector<std::shared_ptr<HeifImage>> &HeifImage::GetThumbnailImages() const
168 {
169 return m_thumbnails;
170 }
171
IsAuxImage() const172 bool HeifImage::IsAuxImage() const
173 {
174 return auxMasterItemId_ != 0;
175 }
176
GetAuxImageType() const177 const std::string &HeifImage::GetAuxImageType() const
178 {
179 return auxType_;
180 }
181
GetAuxImages() const182 std::vector<std::shared_ptr<HeifImage>> HeifImage::GetAuxImages() const
183 {
184 return auxImages_;
185 }
186
GetAlphaImage() const187 std::shared_ptr<HeifImage> HeifImage::GetAlphaImage() const
188 {
189 for (std::shared_ptr<HeifImage> auxImage: auxImages_) {
190 if (auxImage != nullptr && auxImage->IsAuxImage() && auxImage->GetAuxImageType() == HEVC_ALPHA_AUX_TYPE) {
191 return auxImage;
192 }
193 }
194 return nullptr;
195 }
196
SetAuxImage(heif_item_id id,const std::string & aux_type)197 void HeifImage::SetAuxImage(heif_item_id id, const std::string &aux_type)
198 {
199 auxMasterItemId_ = id;
200 auxType_ = aux_type;
201 }
202
AddAuxImage(std::shared_ptr<HeifImage> img)203 void HeifImage::AddAuxImage(std::shared_ptr<HeifImage> img)
204 {
205 auxImages_.push_back(std::move(img));
206 }
207
GetAllMetadata() const208 const std::vector<std::shared_ptr<HeifMetadata>> &HeifImage::GetAllMetadata() const
209 {
210 return allMetadata_;
211 }
212
AddMetadata(std::shared_ptr<HeifMetadata> metadata)213 void HeifImage::AddMetadata(std::shared_ptr<HeifMetadata> metadata)
214 {
215 allMetadata_.push_back(std::move(metadata));
216 }
217
GetNclxColorProfile() const218 const std::shared_ptr<const HeifNclxColorProfile> &HeifImage::GetNclxColorProfile() const
219 {
220 return nclxColorProfile_;
221 }
222
GetRawColorProfile() const223 const std::shared_ptr<const HeifRawColorProfile> &HeifImage::GetRawColorProfile() const
224 {
225 return rawColorProfile_;
226 }
227
SetColorProfile(const std::shared_ptr<const HeifColorProfile> & profile)228 void HeifImage::SetColorProfile(const std::shared_ptr<const HeifColorProfile> &profile)
229 {
230 auto icc = std::dynamic_pointer_cast<const HeifRawColorProfile>(profile);
231 if (icc) {
232 rawColorProfile_ = std::move(icc);
233 }
234
235 auto nclx = std::dynamic_pointer_cast<const HeifNclxColorProfile>(profile);
236 if (nclx) {
237 nclxColorProfile_ = std::move(nclx);
238 }
239 }
240
SetGainmapMasterImage(heif_item_id id)241 void HeifImage::SetGainmapMasterImage(heif_item_id id)
242 {
243 gainmapMasterItemid_ = id;
244 }
245
AddGainmapImage(std::shared_ptr<HeifImage> & img)246 void HeifImage::AddGainmapImage(std::shared_ptr<HeifImage>& img)
247 {
248 gainmapImage_ = img;
249 }
250
GetGainmapImage() const251 std::shared_ptr<HeifImage> HeifImage::GetGainmapImage() const
252 {
253 return gainmapImage_;
254 }
255
SetTmapBoxId(heif_item_id id)256 void HeifImage::SetTmapBoxId(heif_item_id id)
257 {
258 tmapId_ = id;
259 }
260
SetStaticMetadata(std::vector<uint8_t> & displayInfo,std::vector<uint8_t> & lightInfo)261 void HeifImage::SetStaticMetadata(std::vector<uint8_t>& displayInfo, std::vector<uint8_t>& lightInfo)
262 {
263 displayInfo_ = displayInfo;
264 lightInfo_ = lightInfo;
265 }
266
SetUWAInfo(std::vector<uint8_t> & uwaInfo)267 void HeifImage::SetUWAInfo(std::vector<uint8_t>& uwaInfo)
268 {
269 uwaInfo_ = uwaInfo;
270 }
271
SetISOMetadata(std::vector<uint8_t> & isoMetadata)272 void HeifImage::SetISOMetadata(std::vector<uint8_t>& isoMetadata)
273 {
274 isoMetadata_ = isoMetadata;
275 }
276
SetFragmentMetadata(HeifFragmentMetadata fragmentMetadata)277 void HeifImage::SetFragmentMetadata(HeifFragmentMetadata fragmentMetadata)
278 {
279 fragmentMetadata_ = fragmentMetadata;
280 }
281
GetDisplayInfo()282 std::vector<uint8_t> HeifImage::GetDisplayInfo()
283 {
284 return displayInfo_;
285 }
286
GetLightInfo()287 std::vector<uint8_t> HeifImage::GetLightInfo()
288 {
289 return lightInfo_;
290 }
291
GetUWAInfo()292 std::vector<uint8_t> HeifImage::GetUWAInfo()
293 {
294 return uwaInfo_;
295 }
296
GetISOMetadata()297 std::vector<uint8_t> HeifImage::GetISOMetadata()
298 {
299 return isoMetadata_;
300 }
301
GetFragmentMetadata()302 HeifFragmentMetadata HeifImage::GetFragmentMetadata()
303 {
304 return fragmentMetadata_;
305 }
306
307 } // namespace ImagePlugin
308 } // namespace OHOS
309