1/*
2 * Copyright 2015 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 SkWebpCodec_DEFINED
9#define SkWebpCodec_DEFINED
10
11#include "include/codec/SkCodec.h"
12#include "include/core/SkEncodedImageFormat.h"
13#include "include/core/SkImageInfo.h"
14#include "include/core/SkTypes.h"
15#include "src/codec/SkFrameHolder.h"
16#include "src/codec/SkScalingCodec.h"
17
18#include <vector>
19
20class SkStream;
21extern "C" {
22 struct WebPDemuxer;
23 void WebPDemuxDelete(WebPDemuxer* dmux);
24}
25
26class SkWebpCodec final : public SkScalingCodec {
27public:
28 // Assumes IsWebp was called and returned true.
29 static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
30 static bool IsWebp(const void*, size_t);
31protected:
32 Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, int*) override;
33 SkEncodedImageFormat onGetEncodedFormat() const override { return SkEncodedImageFormat::kWEBP; }
34
35 bool onGetValidSubset(SkIRect* /* desiredSubset */) const override;
36
37 int onGetFrameCount() override;
38 bool onGetFrameInfo(int, FrameInfo*) const override;
39 int onGetRepetitionCount() override;
40
41 const SkFrameHolder* getFrameHolder() const override {
42 return &fFrameHolder;
43 }
44
45private:
46 SkWebpCodec(SkEncodedInfo&&, std::unique_ptr<SkStream>, WebPDemuxer*, sk_sp<SkData>,
47 SkEncodedOrigin);
48
49 SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> fDemux;
50
51 // fDemux has a pointer into this data.
52 // This should not be freed until the decode is completed.
53 sk_sp<SkData> fData;
54
55 class Frame : public SkFrame {
56 public:
57 Frame(int i, SkEncodedInfo::Alpha alpha)
58 : INHERITED(i)
59 , fReportedAlpha(alpha)
60 {}
61
62 protected:
63 SkEncodedInfo::Alpha onReportedAlpha() const override {
64 return fReportedAlpha;
65 }
66
67 private:
68 const SkEncodedInfo::Alpha fReportedAlpha;
69
70 typedef SkFrame INHERITED;
71 };
72
73 class FrameHolder : public SkFrameHolder {
74 public:
75 ~FrameHolder() override {}
76 void setScreenSize(int w, int h) {
77 fScreenWidth = w;
78 fScreenHeight = h;
79 }
80 Frame* appendNewFrame(bool hasAlpha);
81 const Frame* frame(int i) const;
82 int size() const {
83 return static_cast<int>(fFrames.size());
84 }
85 void reserve(int size) {
86 fFrames.reserve(size);
87 }
88
89 protected:
90 const SkFrame* onGetFrame(int i) const override;
91
92 private:
93 std::vector<Frame> fFrames;
94 };
95
96 FrameHolder fFrameHolder;
97 // Set to true if WebPDemuxGetFrame fails. This only means
98 // that we will cap the frame count to the frames that
99 // succeed.
100 bool fFailed;
101
102 typedef SkScalingCodec INHERITED;
103};
104#endif // SkWebpCodec_DEFINED
105