• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 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 SkAvifCodec_DEFINED
9 #define SkAvifCodec_DEFINED
10 
11 #include "include/codec/SkEncodedImageFormat.h"
12 #include "include/codec/SkEncodedOrigin.h"
13 #include "include/core/SkData.h"
14 #include "include/core/SkRefCnt.h"
15 #include "include/private/SkEncodedInfo.h"
16 #include "src/codec/SkFrameHolder.h"
17 #include "src/codec/SkScalingCodec.h"
18 
19 #include <cstddef>
20 #include <memory>
21 #include <vector>
22 
23 class SkCodec;
24 class SkStream;
25 struct SkImageInfo;
26 struct avifDecoder;
27 struct AvifDecoderDeleter {
28     void operator()(avifDecoder* decoder) const;
29 };
30 using AvifDecoder = std::unique_ptr<avifDecoder, AvifDecoderDeleter>;
31 
32 class SkAvifCodec : public SkScalingCodec {
33 public:
34     /*
35      * Returns true if an AVIF image is detected. Returns false otherwise.
36      */
37     static bool IsAvif(const void*, size_t);
38 
39     /*
40      * Assumes IsAvif() was called and it returned true.
41      */
42     static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
43 
44 protected:
45     Result onGetPixels(const SkImageInfo& dstInfo,
46                        void* dst,
47                        size_t dstRowBytes,
48                        const Options& options,
49                        int* rowsDecoded) override;
50 
onGetEncodedFormat()51     SkEncodedImageFormat onGetEncodedFormat() const override { return SkEncodedImageFormat::kAVIF; }
52 
53     int onGetFrameCount() override;
54     bool onGetFrameInfo(int, FrameInfo*) const override;
55     int onGetRepetitionCount() override;
56     IsAnimated onIsAnimated() override;
getFrameHolder()57     const SkFrameHolder* getFrameHolder() const override { return &fFrameHolder; }
58 
59 private:
60     SkAvifCodec(SkEncodedInfo&&,
61                 std::unique_ptr<SkStream>,
62                 sk_sp<SkData>,
63                 AvifDecoder,
64                 SkEncodedOrigin,
65                 bool);
66 
67     // fAvifDecoder has a pointer to this data. This should not be freed until
68     // the decode is completed. To ensure that, we declare this before
69     // fAvifDecoder.
70     sk_sp<SkData> fData;
71 
72     AvifDecoder fAvifDecoder;
73     bool fUseAnimation;
74 
75     class Frame : public SkFrame {
76     public:
Frame(int i,SkEncodedInfo::Alpha alpha)77         Frame(int i, SkEncodedInfo::Alpha alpha) : INHERITED(i), fReportedAlpha(alpha) {}
78 
79     protected:
onReportedAlpha()80         SkEncodedInfo::Alpha onReportedAlpha() const override { return fReportedAlpha; }
81 
82     private:
83         const SkEncodedInfo::Alpha fReportedAlpha;
84 
85         using INHERITED = SkFrame;
86     };
87 
88     class FrameHolder : public SkFrameHolder {
89     public:
~FrameHolder()90         ~FrameHolder() override {}
setScreenSize(int w,int h)91         void setScreenSize(int w, int h) {
92             fScreenWidth = w;
93             fScreenHeight = h;
94         }
95         Frame* appendNewFrame(bool hasAlpha);
96         const Frame* frame(int i) const;
size()97         int size() const { return static_cast<int>(fFrames.size()); }
reserve(int size)98         void reserve(int size) { fFrames.reserve(size); }
99 
100     protected:
101         const SkFrame* onGetFrame(int i) const override;
102 
103     private:
104         std::vector<Frame> fFrames;
105     };
106 
107     FrameHolder fFrameHolder;
108     using INHERITED = SkScalingCodec;
109 };
110 
111 #endif  // SkAvifCodec_DEFINED
112