1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright 2011 Google Inc. 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*d57664e9SAndroid Build Coastguard Worker * found in the LICENSE file. 6*d57664e9SAndroid Build Coastguard Worker */ 7*d57664e9SAndroid Build Coastguard Worker #include "Movie.h" 8*d57664e9SAndroid Build Coastguard Worker #include "SkBitmap.h" 9*d57664e9SAndroid Build Coastguard Worker #include "SkStream.h" 10*d57664e9SAndroid Build Coastguard Worker #include "SkTypes.h" 11*d57664e9SAndroid Build Coastguard Worker 12*d57664e9SAndroid Build Coastguard Worker // We should never see this in normal operation since our time values are 13*d57664e9SAndroid Build Coastguard Worker // 0-based. So we use it as a sentinel. 14*d57664e9SAndroid Build Coastguard Worker #define UNINITIALIZED_MSEC ((Movie::MSec)-1) 15*d57664e9SAndroid Build Coastguard Worker Movie()16*d57664e9SAndroid Build Coastguard WorkerMovie::Movie() 17*d57664e9SAndroid Build Coastguard Worker { 18*d57664e9SAndroid Build Coastguard Worker fInfo.fDuration = UNINITIALIZED_MSEC; // uninitialized 19*d57664e9SAndroid Build Coastguard Worker fCurrTime = UNINITIALIZED_MSEC; // uninitialized 20*d57664e9SAndroid Build Coastguard Worker fNeedBitmap = true; 21*d57664e9SAndroid Build Coastguard Worker } 22*d57664e9SAndroid Build Coastguard Worker ensureInfo()23*d57664e9SAndroid Build Coastguard Workervoid Movie::ensureInfo() 24*d57664e9SAndroid Build Coastguard Worker { 25*d57664e9SAndroid Build Coastguard Worker if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo)) 26*d57664e9SAndroid Build Coastguard Worker memset(&fInfo, 0, sizeof(fInfo)); // failure 27*d57664e9SAndroid Build Coastguard Worker } 28*d57664e9SAndroid Build Coastguard Worker duration()29*d57664e9SAndroid Build Coastguard WorkerMovie::MSec Movie::duration() 30*d57664e9SAndroid Build Coastguard Worker { 31*d57664e9SAndroid Build Coastguard Worker this->ensureInfo(); 32*d57664e9SAndroid Build Coastguard Worker return fInfo.fDuration; 33*d57664e9SAndroid Build Coastguard Worker } 34*d57664e9SAndroid Build Coastguard Worker width()35*d57664e9SAndroid Build Coastguard Workerint Movie::width() 36*d57664e9SAndroid Build Coastguard Worker { 37*d57664e9SAndroid Build Coastguard Worker this->ensureInfo(); 38*d57664e9SAndroid Build Coastguard Worker return fInfo.fWidth; 39*d57664e9SAndroid Build Coastguard Worker } 40*d57664e9SAndroid Build Coastguard Worker height()41*d57664e9SAndroid Build Coastguard Workerint Movie::height() 42*d57664e9SAndroid Build Coastguard Worker { 43*d57664e9SAndroid Build Coastguard Worker this->ensureInfo(); 44*d57664e9SAndroid Build Coastguard Worker return fInfo.fHeight; 45*d57664e9SAndroid Build Coastguard Worker } 46*d57664e9SAndroid Build Coastguard Worker isOpaque()47*d57664e9SAndroid Build Coastguard Workerint Movie::isOpaque() 48*d57664e9SAndroid Build Coastguard Worker { 49*d57664e9SAndroid Build Coastguard Worker this->ensureInfo(); 50*d57664e9SAndroid Build Coastguard Worker return fInfo.fIsOpaque; 51*d57664e9SAndroid Build Coastguard Worker } 52*d57664e9SAndroid Build Coastguard Worker setTime(Movie::MSec time)53*d57664e9SAndroid Build Coastguard Workerbool Movie::setTime(Movie::MSec time) 54*d57664e9SAndroid Build Coastguard Worker { 55*d57664e9SAndroid Build Coastguard Worker Movie::MSec dur = this->duration(); 56*d57664e9SAndroid Build Coastguard Worker if (time > dur) 57*d57664e9SAndroid Build Coastguard Worker time = dur; 58*d57664e9SAndroid Build Coastguard Worker 59*d57664e9SAndroid Build Coastguard Worker bool changed = false; 60*d57664e9SAndroid Build Coastguard Worker if (time != fCurrTime) 61*d57664e9SAndroid Build Coastguard Worker { 62*d57664e9SAndroid Build Coastguard Worker fCurrTime = time; 63*d57664e9SAndroid Build Coastguard Worker changed = this->onSetTime(time); 64*d57664e9SAndroid Build Coastguard Worker fNeedBitmap |= changed; 65*d57664e9SAndroid Build Coastguard Worker } 66*d57664e9SAndroid Build Coastguard Worker return changed; 67*d57664e9SAndroid Build Coastguard Worker } 68*d57664e9SAndroid Build Coastguard Worker bitmap()69*d57664e9SAndroid Build Coastguard Workerconst SkBitmap& Movie::bitmap() 70*d57664e9SAndroid Build Coastguard Worker { 71*d57664e9SAndroid Build Coastguard Worker if (fCurrTime == UNINITIALIZED_MSEC) // uninitialized 72*d57664e9SAndroid Build Coastguard Worker this->setTime(0); 73*d57664e9SAndroid Build Coastguard Worker 74*d57664e9SAndroid Build Coastguard Worker if (fNeedBitmap) 75*d57664e9SAndroid Build Coastguard Worker { 76*d57664e9SAndroid Build Coastguard Worker if (!this->onGetBitmap(&fBitmap)) // failure 77*d57664e9SAndroid Build Coastguard Worker fBitmap.reset(); 78*d57664e9SAndroid Build Coastguard Worker fNeedBitmap = false; 79*d57664e9SAndroid Build Coastguard Worker } 80*d57664e9SAndroid Build Coastguard Worker return fBitmap; 81*d57664e9SAndroid Build Coastguard Worker } 82*d57664e9SAndroid Build Coastguard Worker 83*d57664e9SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////// 84*d57664e9SAndroid Build Coastguard Worker DecodeMemory(const void * data,size_t length)85*d57664e9SAndroid Build Coastguard WorkerMovie* Movie::DecodeMemory(const void* data, size_t length) { 86*d57664e9SAndroid Build Coastguard Worker SkMemoryStream stream(data, length, false); 87*d57664e9SAndroid Build Coastguard Worker return Movie::DecodeStream(&stream); 88*d57664e9SAndroid Build Coastguard Worker } 89*d57664e9SAndroid Build Coastguard Worker DecodeFile(const char path[])90*d57664e9SAndroid Build Coastguard WorkerMovie* Movie::DecodeFile(const char path[]) { 91*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<SkStreamRewindable> stream = SkStream::MakeFromFile(path); 92*d57664e9SAndroid Build Coastguard Worker return stream ? Movie::DecodeStream(stream.get()) : nullptr; 93*d57664e9SAndroid Build Coastguard Worker } 94