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 ¶m, 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 ¶m); 160 161 bool SwDecodeIdenImage(std::shared_ptr<HeifImage> &image, HevcSoftDecodeParam ¶m, 162 GridInfo &gridInfo, bool isPrimary); 163 164 bool SwDecodeSingleImage(Media::ImageFwkExtManager &extManager, 165 std::shared_ptr<HeifImage> &image, HevcSoftDecodeParam ¶m); 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