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
IsMovieImage() const50 bool HeifImage::IsMovieImage() const
51 {
52 return isMovieImage_;
53 }
54
SetMovieImage(bool flag)55 void HeifImage::SetMovieImage(bool flag)
56 {
57 isMovieImage_ = flag;
58 }
59
GetOriginalWidth() const60 uint32_t HeifImage::GetOriginalWidth() const
61 {
62 return originalWidth_;
63 }
64
GetOriginalHeight() const65 uint32_t HeifImage::GetOriginalHeight() const
66 {
67 return originalHeight_;
68 }
69
SetOriginalSize(uint32_t width,uint32_t height)70 void HeifImage::SetOriginalSize(uint32_t width, uint32_t height)
71 {
72 originalWidth_ = width;
73 originalHeight_ = height;
74 }
75
GetRotateDegrees() const76 int HeifImage::GetRotateDegrees() const
77 {
78 return rotateDegrees_;
79 }
80
SetRotateDegrees(int degrees)81 void HeifImage::SetRotateDegrees(int degrees)
82 {
83 rotateDegrees_ = degrees;
84 }
85
GetMirrorDirection() const86 HeifTransformMirrorDirection HeifImage::GetMirrorDirection() const
87 {
88 return mirrorDirection_;
89 }
90
SetMirrorDirection(HeifTransformMirrorDirection direction)91 void HeifImage::SetMirrorDirection(HeifTransformMirrorDirection direction)
92 {
93 mirrorDirection_ = direction;
94 }
95
IsResolutionReverse() const96 bool HeifImage::IsResolutionReverse() const
97 {
98 return rotateDegrees_ == ROTATE_90_DEGRESS || rotateDegrees_ == ROTATE_270_DEGRESS;
99 }
100
GetWidth() const101 uint32_t HeifImage::GetWidth() const
102 {
103 return IsResolutionReverse() ? originalHeight_ : originalWidth_;
104 }
105
GetHeight() const106 uint32_t HeifImage::GetHeight() const
107 {
108 return IsResolutionReverse() ? originalWidth_ : originalHeight_;
109 }
110
GetLumaBitNum() const111 int HeifImage::GetLumaBitNum() const
112 {
113 return lumaBitNum_;
114 }
115
SetLumaBitNum(int bitNum)116 void HeifImage::SetLumaBitNum(int bitNum)
117 {
118 lumaBitNum_ = bitNum;
119 }
120
GetChromaBitNum() const121 int HeifImage::GetChromaBitNum() const
122 {
123 return chromaBitNum_;
124 }
125
SetChromaBitNum(int bitNum)126 void HeifImage::SetChromaBitNum(int bitNum)
127 {
128 chromaBitNum_ = bitNum;
129 }
130
GetColorRangeFlag() const131 int HeifImage::GetColorRangeFlag() const
132 {
133 return colorRangeFlag_;
134 }
135
136
SetColorRangeFlag(int flag)137 void HeifImage::SetColorRangeFlag(int flag)
138 {
139 colorRangeFlag_ = flag;
140 }
141
GetDefaultColorFormat() const142 HeifColorFormat HeifImage::GetDefaultColorFormat() const
143 {
144 return defaultColorFormat_;
145 }
146
SetDefaultColorFormat(HeifColorFormat format)147 void HeifImage::SetDefaultColorFormat(HeifColorFormat format)
148 {
149 defaultColorFormat_ = format;
150 }
151
GetDefaultPixelFormat() const152 HeifPixelFormat HeifImage::GetDefaultPixelFormat() const
153 {
154 return defaultPixelFormat_;
155 }
156
SetDefaultPixelFormat(HeifPixelFormat format)157 void HeifImage::SetDefaultPixelFormat(HeifPixelFormat format)
158 {
159 defaultPixelFormat_ = format;
160 }
161
SetThumbnailImage(heif_item_id id)162 void HeifImage::SetThumbnailImage(heif_item_id id)
163 {
164 thumbnailMasterItemId_ = id;
165 }
166
AddThumbnailImage(const std::shared_ptr<HeifImage> & img)167 void HeifImage::AddThumbnailImage(const std::shared_ptr<HeifImage> &img)
168 {
169 m_thumbnails.push_back(img);
170 }
171
IsThumbnailImage() const172 bool HeifImage::IsThumbnailImage() const
173 {
174 return thumbnailMasterItemId_ != 0;
175 }
176
GetThumbnailImages() const177 const std::vector<std::shared_ptr<HeifImage>> &HeifImage::GetThumbnailImages() const
178 {
179 return m_thumbnails;
180 }
181
IsAuxImage() const182 bool HeifImage::IsAuxImage() const
183 {
184 return auxMasterItemId_ != 0;
185 }
186
GetAuxImageType() const187 const std::string &HeifImage::GetAuxImageType() const
188 {
189 return auxType_;
190 }
191
GetAuxImages() const192 std::vector<std::shared_ptr<HeifImage>> HeifImage::GetAuxImages() const
193 {
194 return auxImages_;
195 }
196
GetAlphaImage() const197 std::shared_ptr<HeifImage> HeifImage::GetAlphaImage() const
198 {
199 for (std::shared_ptr<HeifImage> auxImage: auxImages_) {
200 if (auxImage != nullptr && auxImage->IsAuxImage() && auxImage->GetAuxImageType() == HEVC_ALPHA_AUX_TYPE) {
201 return auxImage;
202 }
203 }
204 return nullptr;
205 }
206
SetAuxImage(heif_item_id id,const std::string & aux_type)207 void HeifImage::SetAuxImage(heif_item_id id, const std::string &aux_type)
208 {
209 auxMasterItemId_ = id;
210 auxType_ = aux_type;
211 }
212
AddAuxImage(std::shared_ptr<HeifImage> img)213 void HeifImage::AddAuxImage(std::shared_ptr<HeifImage> img)
214 {
215 auxImages_.push_back(std::move(img));
216 }
217
GetAllMetadata() const218 const std::vector<std::shared_ptr<HeifMetadata>> &HeifImage::GetAllMetadata() const
219 {
220 return allMetadata_;
221 }
222
AddMetadata(std::shared_ptr<HeifMetadata> metadata)223 void HeifImage::AddMetadata(std::shared_ptr<HeifMetadata> metadata)
224 {
225 allMetadata_.push_back(std::move(metadata));
226 }
227
GetNclxColorProfile() const228 const std::shared_ptr<const HeifNclxColorProfile> &HeifImage::GetNclxColorProfile() const
229 {
230 return nclxColorProfile_;
231 }
232
GetRawColorProfile() const233 const std::shared_ptr<const HeifRawColorProfile> &HeifImage::GetRawColorProfile() const
234 {
235 return rawColorProfile_;
236 }
237
SetColorProfile(const std::shared_ptr<const HeifColorProfile> & profile)238 void HeifImage::SetColorProfile(const std::shared_ptr<const HeifColorProfile> &profile)
239 {
240 auto icc = std::dynamic_pointer_cast<const HeifRawColorProfile>(profile);
241 if (icc) {
242 rawColorProfile_ = std::move(icc);
243 }
244
245 auto nclx = std::dynamic_pointer_cast<const HeifNclxColorProfile>(profile);
246 if (nclx) {
247 nclxColorProfile_ = std::move(nclx);
248 }
249 }
250
SetGainmapMasterImage(heif_item_id id)251 void HeifImage::SetGainmapMasterImage(heif_item_id id)
252 {
253 gainmapMasterItemid_ = id;
254 }
255
AddGainmapImage(std::shared_ptr<HeifImage> & img)256 void HeifImage::AddGainmapImage(std::shared_ptr<HeifImage>& img)
257 {
258 gainmapImage_ = img;
259 }
260
GetGainmapImage() const261 std::shared_ptr<HeifImage> HeifImage::GetGainmapImage() const
262 {
263 return gainmapImage_;
264 }
265
SetTmapBoxId(heif_item_id id)266 void HeifImage::SetTmapBoxId(heif_item_id id)
267 {
268 tmapId_ = id;
269 }
270
SetStaticMetadata(std::vector<uint8_t> & displayInfo,std::vector<uint8_t> & lightInfo)271 void HeifImage::SetStaticMetadata(std::vector<uint8_t>& displayInfo, std::vector<uint8_t>& lightInfo)
272 {
273 displayInfo_ = displayInfo;
274 lightInfo_ = lightInfo;
275 }
276
SetUWAInfo(std::vector<uint8_t> & uwaInfo)277 void HeifImage::SetUWAInfo(std::vector<uint8_t>& uwaInfo)
278 {
279 uwaInfo_ = uwaInfo;
280 }
281
SetISOMetadata(std::vector<uint8_t> & isoMetadata)282 void HeifImage::SetISOMetadata(std::vector<uint8_t>& isoMetadata)
283 {
284 isoMetadata_ = isoMetadata;
285 }
286
SetFragmentMetadata(HeifFragmentMetadata fragmentMetadata)287 void HeifImage::SetFragmentMetadata(HeifFragmentMetadata fragmentMetadata)
288 {
289 fragmentMetadata_ = fragmentMetadata;
290 }
291
GetDisplayInfo()292 std::vector<uint8_t> HeifImage::GetDisplayInfo()
293 {
294 return displayInfo_;
295 }
296
GetLightInfo()297 std::vector<uint8_t> HeifImage::GetLightInfo()
298 {
299 return lightInfo_;
300 }
301
GetUWAInfo()302 std::vector<uint8_t> HeifImage::GetUWAInfo()
303 {
304 return uwaInfo_;
305 }
306
GetISOMetadata()307 std::vector<uint8_t> HeifImage::GetISOMetadata()
308 {
309 return isoMetadata_;
310 }
311
GetFragmentMetadata()312 HeifFragmentMetadata HeifImage::GetFragmentMetadata()
313 {
314 return fragmentMetadata_;
315 }
316
317 } // namespace ImagePlugin
318 } // namespace OHOS
319