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