• 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 #ifndef PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEIF_DECODER_IMPL_H
17 #define PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEIF_DECODER_IMPL_H
18 
19 #include "HeifDecoder.h"
20 
21 #ifdef HEIF_HW_DECODE_ENABLE
22 #include "heif_parser.h"
23 #include "hevc_sw_decode_param.h"
24 #include "image_type.h"
25 #include "surface_buffer.h"
26 #include "v2_1/icodec_image.h"
27 
28 #ifdef IMAGE_COLORSPACE_FLAG
29 #include "color_space.h"
30 #endif
31 
32 namespace OHOS::Media {
33     class ImageFwkExtManager;
34 }
35 
36 namespace OHOS {
37 namespace ImagePlugin {
38 class HeifDecoderImpl : public HeifDecoder {
39 public:
40     HeifDecoderImpl();
41 
42     ~HeifDecoderImpl() override;
43 
44     bool init(HeifStream *stream, HeifFrameInfo *frameInfo) override;
45 
46     bool getSequenceInfo(HeifFrameInfo *frameInfo, size_t *frameCount) override;
47 
48     bool setOutputColor(SkHeifColorFormat heifColor) override;
49 
50     bool decode(HeifFrameInfo *frameInfo) override;
51 
52     bool decodeSequence(int frameIndex, HeifFrameInfo *frameInfo) override;
53 
54     void setDstBuffer(uint8_t *dstBuffer, size_t rowStride, void *context) override;
55 
56     bool getScanline(uint8_t *dst) override;
57 
58     size_t skipScanlines(int count) override;
59 
60     bool getImageInfo(HeifFrameInfo *frameInfo) override;
61     bool decodeGainmap() override;
setGainmapDstBuffer(uint8_t * dstBuffer,size_t rowStride)62     void setGainmapDstBuffer(uint8_t* dstBuffer, size_t rowStride) override {}
63     bool getGainmapInfo(HeifFrameInfo* frameInfo) override;
64     bool getTmapInfo(HeifFrameInfo* frameInfo) override;
65     HeifImageHdrType getHdrType() override;
66     void getVividMetadata(std::vector<uint8_t>& uwaInfo, std::vector<uint8_t>& displayInfo,
67         std::vector<uint8_t>& lightInfo) override;
68     void getISOMetadata(std::vector<uint8_t>& isoMetadata) override;
69     void getErrMsg(std::string& errMsg) override;
70     uint32_t getColorDepth() override;
71     GridInfo GetGridInfo();
72     bool CheckAuxiliaryMap(Media::AuxiliaryPictureType type);
73     bool setAuxiliaryMap(Media::AuxiliaryPictureType type);
74     bool getAuxiliaryMapInfo(HeifFrameInfo* frameInfo);
75     bool decodeAuxiliaryMap();
76     void setAuxiliaryDstBuffer(uint8_t* dstBuffer, size_t dstSize, size_t rowStride, void *context);
77     void getFragmentMetadata(Media::Rect& fragmentMetadata);
78     bool SwDecode(bool isSharedMemory = false);
79     void SetDecodeRegion(int32_t colCount, int32_t rowCount, int32_t left, int32_t top, size_t rowStride);
80     bool IsHeifHasAlphaImage();
81     void SetPadding(int32_t widthPadding, int32_t heightPadding);
82     bool IsHeifGainmapDivisibility(int32_t primaryDisplayWidth, int32_t primaryDisplayHeight);
83     bool IsHeifGainmapYuv400();
84     bool IsHeifAlphaYuv400();
85     void SetSampleFormat(uint32_t sampleSize, ColorManager::ColorSpaceName colorSpaceName, bool isColorSpaceFromCicp);
86     int32_t GetPrimaryLumaBitNum();
87     bool IsGainmapDivisibleBySampleSize(uint32_t sampleSize);
88     void setGainmapDstBuffer(uint8_t* dstBuffer, size_t rowStride, void *context);
89 private:
90     bool Reinit(HeifFrameInfo *frameInfo);
91 
92     void InitFrameInfo(HeifFrameInfo *frameInfo, const std::shared_ptr<HeifImage> &image);
93 
94     bool SeekRefGridRangeInfo(const std::shared_ptr<HeifImage> &image);
95 
96     void InitGridInfo(const std::shared_ptr<HeifImage> &image, GridInfo &gridInfo);
97 
98     void GetTileSize(const std::shared_ptr<HeifImage> &image, GridInfo &gridInfo);
99 
100     void GetRowColNum(GridInfo &gridInfo);
101 
102     GraphicPixelFormat GetInPixelFormat(const std::shared_ptr<HeifImage> &image);
103 
104     bool ProcessChunkHead(uint8_t *data, size_t len);
105 
106     bool copyToAshmem(std::vector<std::vector<uint8_t>> &inputs, std::vector<sptr<Ashmem>> &hwInputs);
107 
108     void SetHwDecodeInfo(GridInfo &gridInfo,
109         OHOS::HDI::Codec::Image::V2_1::CodecHeifDecInfo &heifDecodeInfo);
110 
111     GSError HwSetColorSpaceData(sptr<SurfaceBuffer> &buffer, GridInfo &gridInfo);
112 
113     bool HwDecodeImage(std::shared_ptr<HeifImage> &image, GridInfo &gridInfo,
114         sptr<SurfaceBuffer> *outBuffer, bool isPrimary);
115 
116     void PrepareInput(std::vector<std::shared_ptr<HeifImage>> tileImages,
117         std::vector<std::vector<uint8_t>> &inputs, size_t gridCount);
118 
119     bool IsRegionDecode();
120 
121     void DoRegionDecodeForUnpacked(std::vector<std::shared_ptr<HeifImage>> tileImages, uint32_t decodeIndex,
122         std::vector<std::vector<uint8_t>> &unPackedInput, std::shared_ptr<HeifImage> &tileImage);
123 
124     void HwRegionDecodeForUnPacked(std::vector<std::shared_ptr<HeifImage>> tileImages,
125         std::vector<std::vector<uint8_t>> &unPackedInput, size_t gridCount);
126 
127     void HwPrepareUnPackedInput(std::vector<std::shared_ptr<HeifImage>> tileImages,
128         std::vector<std::vector<uint8_t>> &unPackedInput, size_t gridCount);
129 
130     void DoSwRegionDecode(std::vector<std::shared_ptr<HeifImage>> tileImages,
131         std::vector<std::vector<uint8_t>> &inputs, std::shared_ptr<HeifImage> &tileImage, uint32_t decodeIndex);
132 
133     void SwRegionDecode(std::vector<std::shared_ptr<HeifImage>> tileImages,
134         std::vector<std::vector<uint8_t>> &inputs, size_t numGrid);
135 
136     bool IsGainmapGrid();
137 
138     bool AllocateHwOutputBuffer(sptr<SurfaceBuffer> &hwBuffer, bool isPrimary);
139 
140     bool HwDecodeGrids(std::shared_ptr<HeifImage> &image,
141         GridInfo &gridInfo, sptr<SurfaceBuffer> &hwBuffer);
142 
143     bool HwDecodeIdenImage(std::shared_ptr<HeifImage> &image, GridInfo &gridInfo,
144         sptr<SurfaceBuffer> *outBuffer, bool isPrimary);
145 
146     bool HwDecodeSingleImage(std::shared_ptr<HeifImage> &image,
147         GridInfo &gridInfo, sptr<SurfaceBuffer> &hwBuffer);
148 
149     bool HwDecodeMimeImage(std::shared_ptr<HeifImage> &image);
150 
151     bool SwDecodeImage(std::shared_ptr<HeifImage> &image, HevcSoftDecodeParam &param,
152                        GridInfo &gridInfo, bool isPrimary);
153     bool SwDecodeAuxiliaryImage(std::shared_ptr<HeifImage> &gainmapImage,
154                                 GridInfo &gainmapGridInfo, uint8_t *auxiliaryDstMemory);
155     bool DoSwDecodeAuxiliaryImage(std::shared_ptr<HeifImage> &gainmapImage, GridInfo &gainmapGridInfo,
156                                   sptr<SurfaceBuffer> &output, uint8_t *auxiliaryDstMemory);
157 
158     bool SwDecodeGrids(Media::ImageFwkExtManager &extManager,
159                        std::shared_ptr<HeifImage> &image, HevcSoftDecodeParam &param);
160 
161     bool SwDecodeIdenImage(std::shared_ptr<HeifImage> &image, HevcSoftDecodeParam &param,
162                            GridInfo &gridInfo, bool isPrimary);
163 
164     bool SwDecodeSingleImage(Media::ImageFwkExtManager &extManager,
165                              std::shared_ptr<HeifImage> &image, HevcSoftDecodeParam &param);
166 
167     bool HwApplyAlphaImage(std::shared_ptr<HeifImage> &masterImage, uint8_t *dstMemory, size_t dstRowStride);
168 
169     bool SwApplyAlphaImage(std::shared_ptr<HeifImage> &masterImage, uint8_t *dstMemory, size_t dstRowStride);
170 
171     bool ConvertHwBufferPixelFormat(sptr<SurfaceBuffer> &hwBuffer, GridInfo &gridInfo,
172                                     uint8_t *dstMemory, size_t dstRowStride, bool isPrimary);
173 
174     bool IsDirectYUVDecode();
175 
176     bool IsAuxiliaryDirectYUVDecode(std::shared_ptr<HeifImage> &auxiliaryImage);
177 
178     void SetColorSpaceInfo(HeifFrameInfo* info, const std::shared_ptr<HeifImage>& image);
179 
180     void GetGainmapColorSpace(ColorManager::ColorSpaceName &gainmapColor);
181 
182     void SetHardwareDecodeErrMsg(const uint32_t width, const uint32_t height);
183 
184     std::shared_ptr<HeifParser> parser_;
185     std::shared_ptr<HeifImage> primaryImage_;
186     Media::PixelFormat outPixelFormat_;
187     Media::PixelFormat gainmapOutPixelFormat_ = Media::PixelFormat::RGBA_8888;
188     HeifFrameInfo imageInfo_{};
189 
190     GridInfo gridInfo_ = {0, 0, false, 0, 0, 0, 0, 1};
191     uint8_t *srcMemory_ = nullptr;
192     uint8_t *dstMemory_;
193     size_t dstRowStride_;
194     SurfaceBuffer *dstHwBuffer_;
195     typedef struct GridRegionInfo {
196         uint32_t colCount;
197         uint32_t rowCount;
198         uint32_t left;
199         uint32_t top;
200         uint32_t heightPadding;
201         uint32_t widthPadding;
202         size_t rowStride;
203         bool isGainmapImage;
204     } GridRegionInfo;
205     GridRegionInfo regionInfo_ = {0, 0, 0, 0, 0, 0, 0, false};
206 
207     std::shared_ptr<HeifImage> gainmapImage_ = nullptr;
208     HeifFrameInfo gainmapImageInfo_{};
209     uint8_t* gainmapDstMemory_;
210     size_t gainmapDstRowStride_;
211 
212     std::shared_ptr<HeifImage> auxiliaryImage_ = nullptr;
213     HeifFrameInfo auxiliaryImageInfo_{};
214     GridInfo auxiliaryGridInfo_ = {0, 0, false, 0, 0, 0, 0, 1};
215     uint8_t* auxiliaryDstMemory_;
216     size_t auxiliaryDstRowStride_;
217     size_t auxiliaryDstMemorySize_;
218     bool isAuxiliaryDecode_ = false;
219     bool isGainmapDecode_ = false;
220     SurfaceBuffer *auxiliaryDstHwbuffer_;
221     SurfaceBuffer *gainMapDstHwbuffer_;
222     uint32_t sampleSize_ = 1;
223     OHOS::ColorManager::ColorSpaceName colorSpaceName_ = ColorManager::ColorSpaceName::NONE;
224     bool isColorSpaceFromCicp_ = false;
225     HeifFrameInfo tmapInfo_{};
226     std::string errMsg_;
227 
228     GridInfo gainmapGridInfo_ = {0, 0, false, 0, 0, 0, 0, 1};
229 };
230 } // namespace ImagePlugin
231 } // namespace OHOS
232 #endif
233 
234 #ifdef __cplusplus
235 extern "C" {
236 #endif
237 
238 HeifDecoder* CreateHeifDecoderImpl(void);
239 
240 #ifdef __cplusplus
241 }
242 #endif
243 
244 #endif // PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEIF_DECODER_IMPL_H
245