1b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi/*
2b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * Copyright (C) 2013 The Android Open Source Project
3b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi *
4b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * Licensed under the Apache License, Version 2.0 (the "License");
5b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * you may not use this file except in compliance with the License.
6b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * You may obtain a copy of the License at
7b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi *
8b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi *      http://www.apache.org/licenses/LICENSE-2.0
9b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi *
10b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * Unless required by applicable law or agreed to in writing, software
11b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * distributed under the License is distributed on an "AS IS" BASIS,
12b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * See the License for the specific language governing permissions and
14b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi * limitations under the License.
15b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi */
16b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
17b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#ifndef RASTERMILL_FRAMESQUENCE_WEBP_H
18b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#define RASTERMILL_FRAMESQUENCE_WEBP_H
19b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
20b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#include "config.h"
21b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#include "webp/decode.h"
22b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#include "webp/demux.h"
23b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
24b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#include "Stream.h"
25b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#include "Color.h"
26b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#include "FrameSequence.h"
27b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
28b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi// Parser for a possibly-animated WebP bitstream.
29b34f1da83570613bb349f8026d4325552ac495edUrvang Joshiclass FrameSequence_webp : public FrameSequence {
30b34f1da83570613bb349f8026d4325552ac495edUrvang Joshipublic:
31b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    FrameSequence_webp(Stream* stream);
32b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual ~FrameSequence_webp();
33b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
34b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual int getWidth() const {
35c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik        if (!mDemux) {
36c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik            return 0;
37c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik        }
38b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi        return WebPDemuxGetI(mDemux, WEBP_FF_CANVAS_WIDTH);
39b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    }
40b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
41b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual int getHeight() const {
42c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik        if (!mDemux) {
43c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik            return 0;
44c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik        }
45b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi        return WebPDemuxGetI(mDemux, WEBP_FF_CANVAS_HEIGHT);
46b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    }
47b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
48b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual bool isOpaque() const {
49b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi        return !(mFormatFlags & ALPHA_FLAG);
50b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    }
51b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
52b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual int getFrameCount() const {
53c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik        if (!mDemux) {
54c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik            return 0;
55c6eca849a1d737fe7c0d397fb8265584d1e34226Chris Craik        }
56b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi        return WebPDemuxGetI(mDemux, WEBP_FF_FRAME_COUNT);
57b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    }
58b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
59b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual int getDefaultLoopCount() const {
60b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi        return mLoopCount;
61b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    }
62b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
636a61141137c7a46d747aa611c9caf62436bc119fChris Craik    virtual jobject getRawByteBuffer() const {
646a61141137c7a46d747aa611c9caf62436bc119fChris Craik        return mRawByteBuffer;
656a61141137c7a46d747aa611c9caf62436bc119fChris Craik    }
666a61141137c7a46d747aa611c9caf62436bc119fChris Craik
67b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual FrameSequenceState* createState() const;
68b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
69b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    WebPDemuxer* getDemuxer() const { return mDemux; }
70b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
714fbb1a29d3ca05199561acb9036a8e9c1aed72c0Urvang Joshi    bool isKeyFrame(size_t frameNr) const { return mIsKeyFrame[frameNr]; }
72b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
73b34f1da83570613bb349f8026d4325552ac495edUrvang Joshiprivate:
74b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    void constructDependencyChain();
75b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
76b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    WebPData mData;
77b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    WebPDemuxer* mDemux;
78b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    int mLoopCount;
79b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    uint32_t mFormatFlags;
80b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    // mIsKeyFrame[i] is true if ith canvas can be constructed without decoding any prior frames.
81b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    bool* mIsKeyFrame;
8272f6c7663a591b003b8e8d2429164bbc74d8b7d2Chris Craik    jobject mRawByteBuffer = nullptr;
83b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi};
84b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
85b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi// Produces frames of a possibly-animated WebP file for display.
86b34f1da83570613bb349f8026d4325552ac495edUrvang Joshiclass FrameSequenceState_webp : public FrameSequenceState {
87b34f1da83570613bb349f8026d4325552ac495edUrvang Joshipublic:
88b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    FrameSequenceState_webp(const FrameSequence_webp& frameSequence);
89b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual ~FrameSequenceState_webp();
90b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
91b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    // Returns frame's delay time in milliseconds.
92b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    virtual long drawFrame(int frameNr,
93b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi            Color8888* outputPtr, int outputPixelStride, int previousFrameNr);
94b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
95b34f1da83570613bb349f8026d4325552ac495edUrvang Joshiprivate:
96b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    void initializeFrame(const WebPIterator& currIter, Color8888* currBuffer, int currStride,
97b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi            const WebPIterator& prevIter, const Color8888* prevBuffer, int prevStride);
98b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    bool decodeFrame(const WebPIterator& iter, Color8888* currBuffer, int currStride,
99b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi            const WebPIterator& prevIter, const Color8888* prevBuffer, int prevStride);
100b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
101b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    const FrameSequence_webp& mFrameSequence;
102b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    WebPDecoderConfig mDecoderConfig;
103b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi    Color8888* mPreservedBuffer;
104b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi};
105b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi
106b34f1da83570613bb349f8026d4325552ac495edUrvang Joshi#endif //RASTERMILL_FRAMESQUENCE_WEBP_H
107