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
19enum 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
30struct HeifStream {
31    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
42struct HeifNclxColor {
43    uint16_t colorPrimaries;
44    uint16_t transferCharacteristics;
45    uint16_t matrixCoefficients;
46    uint8_t fullRangeFlag;
47};
48
49struct 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
60enum class HeifImageHdrType {
61    UNKNOWN = 0,
62    VIVID_DUAL = 1,
63    ISO_DUAL,
64    VIVID_SINGLE,
65    ISO_SINGLE,
66};
67
68struct HeifDecoder {
69    HeifDecoder() {}
70
71    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
100struct 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