• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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