• 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 "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