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