1 /* 2 * Copyright 2017 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkStubHeifDecoderAPI_DEFINED 9 #define SkStubHeifDecoderAPI_DEFINED 10 11 // This stub implementation of HeifDecoderAPI.h lets us compile SkHeifCodec.cpp 12 // even when libheif is not available. It, of course, does nothing and fails to decode. 13 14 #include <memory> 15 #include <stddef.h> 16 #include <stdint.h> 17 #include <vector> 18 19 enum SkHeifColorFormat { 20 kHeifColorFormat_RGB565, 21 kHeifColorFormat_RGBA_8888, 22 kHeifColorFormat_BGRA_8888, 23 kHeifColorFormat_NV12, 24 kHeifColorFormat_NV21, 25 kHeifColorFormat_RGBA_1010102, 26 kHeifColorFormat_P010_NV12, 27 kHeifColorFormat_P010_NV21, 28 }; 29 30 struct HeifStream { ~HeifStreamHeifStream31 virtual ~HeifStream() {} 32 33 virtual size_t read(void*, size_t) = 0; 34 virtual bool rewind() = 0; 35 virtual bool seek(size_t) = 0; 36 virtual bool hasLength() const = 0; 37 virtual size_t getLength() const = 0; 38 virtual bool hasPosition() const = 0; 39 virtual size_t getPosition() const = 0; 40 }; 41 42 struct HeifNclxColor { 43 uint16_t colorPrimaries; 44 uint16_t transferCharacteristics; 45 uint16_t matrixCoefficients; 46 uint8_t fullRangeFlag; 47 }; 48 49 struct HeifFrameInfo { 50 uint32_t mWidth; 51 uint32_t mHeight; 52 int32_t mRotationAngle; // Rotation angle, clockwise, should be multiple of 90 53 uint32_t mBytesPerPixel; // Number of bytes for one pixel 54 int64_t mDurationUs; // Duration of the frame in us 55 std::vector<uint8_t> mIccData; // ICC data array 56 bool hasNclxColor = false; 57 HeifNclxColor nclxColor; 58 }; 59 60 enum class HeifImageHdrType { 61 UNKNOWN = 0, 62 VIVID_DUAL = 1, 63 ISO_DUAL, 64 VIVID_SINGLE, 65 ISO_SINGLE, 66 }; 67 68 struct HeifDecoder { HeifDecoderHeifDecoder69 HeifDecoder() {} 70 ~HeifDecoderHeifDecoder71 virtual ~HeifDecoder() {} 72 73 virtual bool init(HeifStream* stream, HeifFrameInfo* frameInfo) = 0; 74 75 virtual bool getSequenceInfo(HeifFrameInfo* frameInfo, size_t *frameCount) = 0; 76 77 virtual bool decode(HeifFrameInfo* frameInfo) = 0; 78 79 virtual bool decodeSequence(int frameIndex, HeifFrameInfo* frameInfo) = 0; 80 81 virtual bool setOutputColor(SkHeifColorFormat colorFormat) = 0; 82 83 virtual void setDstBuffer(uint8_t *dstBuffer, size_t rowStride, void *context) = 0; 84 85 virtual bool getScanline(uint8_t* dst) = 0; 86 87 virtual size_t skipScanlines(int count) = 0; 88 virtual void getErrMsg(std::string& errMsg) = 0; 89 90 virtual bool getImageInfo(HeifFrameInfo *frameInfo) = 0; 91 virtual bool decodeGainmap() = 0; 92 virtual void setGainmapDstBuffer(uint8_t* dstBuffer, size_t rowStride) = 0; 93 virtual bool getGainmapInfo(HeifFrameInfo* frameInfo) = 0; 94 virtual bool getTmapInfo(HeifFrameInfo* frameInfo) = 0; 95 virtual HeifImageHdrType getHdrType() = 0; 96 virtual void getVividMetadata(std::vector<uint8_t>& uwaInfo, std::vector<uint8_t>& displayInfo, 97 std::vector<uint8_t>& lightInfo) = 0; 98 virtual void getISOMetadata(std::vector<uint8_t>& isoMetadata) = 0; 99 }; 100 101 struct StubHeifDecoder : HeifDecoder { initStubHeifDecoder102 bool init(HeifStream* stream, HeifFrameInfo* frameInfo) override { 103 delete stream; 104 return false; 105 } 106 getSequenceInfoStubHeifDecoder107 bool getSequenceInfo(HeifFrameInfo* frameInfo, size_t *frameCount) override { 108 return false; 109 } 110 decodeStubHeifDecoder111 bool decode(HeifFrameInfo* frameInfo) override { 112 return false; 113 } 114 decodeSequenceStubHeifDecoder115 bool decodeSequence(int frameIndex, HeifFrameInfo* frameInfo) override { 116 return false; 117 } 118 setOutputColorStubHeifDecoder119 bool setOutputColor(SkHeifColorFormat colorFormat) override { 120 return false; 121 } 122 setDstBufferStubHeifDecoder123 void setDstBuffer(uint8_t *dstBuffer, size_t rowStride, void *context) override { 124 return; 125 } 126 getScanlineStubHeifDecoder127 bool getScanline(uint8_t* dst) override { 128 return false; 129 } 130 skipScanlinesStubHeifDecoder131 size_t skipScanlines(int count) override { 132 return 0; 133 } 134 getErrMsgStubHeifDecoder135 void getErrMsg(std::string& errMsg) override { 136 return; 137 } 138 getImageInfoStubHeifDecoder139 bool getImageInfo(HeifFrameInfo *frameInfo) override { 140 return false; 141 } 142 decodeGainmapStubHeifDecoder143 bool decodeGainmap() override { 144 return false; 145 } 146 setGainmapDstBufferStubHeifDecoder147 void setGainmapDstBuffer(uint8_t* dstBuffer, size_t rowStride) override { 148 return; 149 } 150 getGainmapInfoStubHeifDecoder151 bool getGainmapInfo(HeifFrameInfo* frameInfo) override { 152 return false; 153 } 154 getTmapInfoStubHeifDecoder155 bool getTmapInfo(HeifFrameInfo* frameInfo) override { 156 return false; 157 } 158 getHdrTypeStubHeifDecoder159 HeifImageHdrType getHdrType() override { 160 return HeifImageHdrType::UNKNOWN; 161 } 162 getVividMetadataStubHeifDecoder163 void getVividMetadata(std::vector<uint8_t>& uwaInfo, std::vector<uint8_t>& displayInfo, 164 std::vector<uint8_t>& lightInfo) override { 165 return; 166 } 167 getISOMetadataStubHeifDecoder168 void getISOMetadata(std::vector<uint8_t>& isoMetadata) override { 169 return; 170 } 171 }; 172 173 #endif//SkStubHeifDecoderAPI_DEFINED 174