1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkAnimCodecPlayer_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkAnimCodecPlayer_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/codec/SkCodec.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 17*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 18*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class SkImage; 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker class SkAnimCodecPlayer { 23*c8dee2aaSAndroid Build Coastguard Worker public: 24*c8dee2aaSAndroid Build Coastguard Worker SkAnimCodecPlayer(std::unique_ptr<SkCodec> codec); 25*c8dee2aaSAndroid Build Coastguard Worker ~SkAnimCodecPlayer(); 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker /** 28*c8dee2aaSAndroid Build Coastguard Worker * Returns the current frame of the animation. This defaults to the first frame for 29*c8dee2aaSAndroid Build Coastguard Worker * animated codecs (i.e. msec = 0). Calling this multiple times (without calling seek()) 30*c8dee2aaSAndroid Build Coastguard Worker * will always return the same image object (or null if there was an error). 31*c8dee2aaSAndroid Build Coastguard Worker */ 32*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> getFrame(); 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker /** 35*c8dee2aaSAndroid Build Coastguard Worker * Return the size of the image(s) that will be returned by getFrame(). 36*c8dee2aaSAndroid Build Coastguard Worker */ 37*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions() const; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker /** 40*c8dee2aaSAndroid Build Coastguard Worker * Returns the total duration of the animation in milliseconds. Returns 0 for a single-frame 41*c8dee2aaSAndroid Build Coastguard Worker * image. 42*c8dee2aaSAndroid Build Coastguard Worker */ duration()43*c8dee2aaSAndroid Build Coastguard Worker uint32_t duration() const { return fTotalDuration; } 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker /** 46*c8dee2aaSAndroid Build Coastguard Worker * Finds the closest frame associated with the time code (in milliseconds) and sets that 47*c8dee2aaSAndroid Build Coastguard Worker * to be the current frame (call getFrame() to retrieve that image). 48*c8dee2aaSAndroid Build Coastguard Worker * Returns true iff this call to seek() changed the "current frame" for the animation. 49*c8dee2aaSAndroid Build Coastguard Worker * Thus if seek() returns false, then getFrame() will return the same image as it did 50*c8dee2aaSAndroid Build Coastguard Worker * before this call to seek(). 51*c8dee2aaSAndroid Build Coastguard Worker */ 52*c8dee2aaSAndroid Build Coastguard Worker bool seek(uint32_t msec); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker private: 56*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkCodec> fCodec; 57*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo fImageInfo; 58*c8dee2aaSAndroid Build Coastguard Worker std::vector<SkCodec::FrameInfo> fFrameInfos; 59*c8dee2aaSAndroid Build Coastguard Worker std::vector<sk_sp<SkImage> > fImages; 60*c8dee2aaSAndroid Build Coastguard Worker int fCurrIndex = 0; 61*c8dee2aaSAndroid Build Coastguard Worker uint32_t fTotalDuration; 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> getFrameAt(int index); 64*c8dee2aaSAndroid Build Coastguard Worker }; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker #endif 67*c8dee2aaSAndroid Build Coastguard Worker 68