• 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 SkHeifCodec_DEFINED
9 #define SkHeifCodec_DEFINED
10 
11 #include "include/codec/SkCodec.h"
12 #include "include/codec/SkEncodedOrigin.h"
13 #include "include/core/SkImageInfo.h"
14 #include "include/core/SkStream.h"
15 #include "src/codec/SkFrameHolder.h"
16 #include "src/codec/SkSwizzler.h"
17 
18 #if __has_include("HeifDecoderAPI.h")
19     #include "HeifDecoderAPI.h"
20 #else
21     #include "src/codec/SkStubHeifDecoderAPI.h"
22 #endif
23 
24 class SkHeifCodec : public SkCodec {
25 public:
26     static bool IsHeif(const void*, size_t);
27 
28     /*
29      * Assumes IsHeif was called and returned true.
30      */
31     static std::unique_ptr<SkCodec> MakeFromStream(
32             std::unique_ptr<SkStream>, SkCodec::SelectionPolicy selectionPolicy, Result*);
33 
34 protected:
35 
36     Result onGetPixels(
37             const SkImageInfo& dstInfo,
38             void* dst, size_t dstRowBytes,
39             const Options& options,
40             int* rowsDecoded) override;
41 
onGetEncodedFormat()42     SkEncodedImageFormat onGetEncodedFormat() const override {
43         return SkEncodedImageFormat::kHEIF;
44     }
45 
46     int onGetFrameCount() override;
47     bool onGetFrameInfo(int, FrameInfo*) const override;
48     int onGetRepetitionCount() override;
getFrameHolder()49     const SkFrameHolder* getFrameHolder() const override {
50         return &fFrameHolder;
51     }
52 
53     bool conversionSupported(const SkImageInfo&, bool, bool) override;
54 
55     bool onRewind() override;
56 
57 private:
58     /*
59      * Creates an instance of the decoder
60      * Called only by NewFromStream
61      */
62     SkHeifCodec(SkEncodedInfo&&, HeifDecoder*, SkEncodedOrigin, bool animation);
63 
64     void initializeSwizzler(const SkImageInfo& dstInfo, const Options& options);
65     void allocateStorage(const SkImageInfo& dstInfo);
66     int readRows(const SkImageInfo& dstInfo, void* dst,
67             size_t rowBytes, int count, const Options&);
68 
69     /*
70      * Scanline decoding.
71      */
72     SkSampler* getSampler(bool createIfNecessary) override;
73     Result onStartScanlineDecode(const SkImageInfo& dstInfo,
74             const Options& options) override;
75     int onGetScanlines(void* dst, int count, size_t rowBytes) override;
76     bool onSkipScanlines(int count) override;
77 
78     std::unique_ptr<HeifDecoder>       fHeifDecoder;
79     HeifFrameInfo                      fFrameInfo;
80     SkAutoTMalloc<uint8_t>             fStorage;
81     uint8_t*                           fSwizzleSrcRow;
82     uint32_t*                          fColorXformSrcRow;
83 
84     std::unique_ptr<SkSwizzler>        fSwizzler;
85     bool                               fUseAnimation;
86 
87     class Frame : public SkFrame {
88     public:
Frame(int i)89         Frame(int i) : INHERITED(i) {}
90 
91     protected:
onReportedAlpha()92         SkEncodedInfo::Alpha onReportedAlpha() const override {
93             return SkEncodedInfo::Alpha::kOpaque_Alpha;
94         }
95 
96     private:
97         typedef SkFrame INHERITED;
98     };
99 
100     class FrameHolder : public SkFrameHolder {
101     public:
~FrameHolder()102         ~FrameHolder() override {}
setScreenSize(int w,int h)103         void setScreenSize(int w, int h) {
104             fScreenWidth = w;
105             fScreenHeight = h;
106         }
107         Frame* appendNewFrame();
108         const Frame* frame(int i) const;
109         Frame* editFrameAt(int i);
size()110         int size() const {
111             return static_cast<int>(fFrames.size());
112         }
reserve(int size)113         void reserve(int size) {
114             fFrames.reserve(size);
115         }
116 
117     protected:
118         const SkFrame* onGetFrame(int i) const override;
119 
120     private:
121         std::vector<Frame> fFrames;
122     };
123 
124     FrameHolder fFrameHolder;
125     typedef SkCodec INHERITED;
126 };
127 
128 #endif // SkHeifCodec_DEFINED
129