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