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 bool getImageInfo(HeifFrameInfo *frameInfo) = 0; 89 virtual bool decodeGainmap() = 0; 90 virtual void setGainmapDstBuffer(uint8_t* dstBuffer, size_t rowStride) = 0; 91 virtual bool getGainmapInfo(HeifFrameInfo* frameInfo) = 0; 92 virtual bool getTmapInfo(HeifFrameInfo* frameInfo) = 0; 93 virtual HeifImageHdrType getHdrType() = 0; 94 virtual void getVividMetadata(std::vector<uint8_t>& uwaInfo, std::vector<uint8_t>& displayInfo, 95 std::vector<uint8_t>& lightInfo) = 0; 96 virtual void getISOMetadata(std::vector<uint8_t>& isoMetadata) = 0; 97 virtual void getErrMsg(std::string& errMsg) = 0; 98 }; 99 100 struct StubHeifDecoder : HeifDecoder { 101 bool init(HeifStream* stream, HeifFrameInfo* frameInfo) override { 102 delete stream; 103 return false; 104 } 105 106 bool getSequenceInfo(HeifFrameInfo* frameInfo, size_t *frameCount) override { 107 return false; 108 } 109 110 bool decode(HeifFrameInfo* frameInfo) override { 111 return false; 112 } 113 114 bool decodeSequence(int frameIndex, HeifFrameInfo* frameInfo) override { 115 return false; 116 } 117 118 bool setOutputColor(SkHeifColorFormat colorFormat) override { 119 return false; 120 } 121 122 void setDstBuffer(uint8_t *dstBuffer, size_t rowStride, void *context) override { 123 return; 124 } 125 126 bool getScanline(uint8_t* dst) override { 127 return false; 128 } 129 130 size_t skipScanlines(int count) override { 131 return 0; 132 } 133 134 bool getImageInfo(HeifFrameInfo *frameInfo) override { 135 return false; 136 } 137 138 bool decodeGainmap() override { 139 return false; 140 } 141 142 void setGainmapDstBuffer(uint8_t* dstBuffer, size_t rowStride) override { 143 return; 144 } 145 146 bool getGainmapInfo(HeifFrameInfo* frameInfo) override { 147 return false; 148 } 149 150 bool getTmapInfo(HeifFrameInfo* frameInfo) override { 151 return false; 152 } 153 154 HeifImageHdrType getHdrType() override { 155 return HeifImageHdrType::UNKNOWN; 156 } 157 158 void getVividMetadata(std::vector<uint8_t>& uwaInfo, std::vector<uint8_t>& displayInfo, 159 std::vector<uint8_t>& lightInfo) override { 160 return; 161 } 162 163 void getISOMetadata(std::vector<uint8_t>& isoMetadata) override { 164 return; 165 } 166 167 void getErrMsg(std::string& errMsg) override { 168 return; 169 } 170 }; 171 172 #endif//SkStubHeifDecoderAPI_DEFINED 173