1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 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 #include "experimental/ffmpeg/SkVideoDecoder.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker class VideoDecoderGM : public skiagm::GM { 14*c8dee2aaSAndroid Build Coastguard Worker SkVideoDecoder fDecoder; 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker public: VideoDecoderGM()17*c8dee2aaSAndroid Build Coastguard Worker VideoDecoderGM() {} 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const20*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("videodecoder"); } 21*c8dee2aaSAndroid Build Coastguard Worker getISize()22*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(1024, 768); } 23*c8dee2aaSAndroid Build Coastguard Worker onOnceBeforeDraw()24*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { 25*c8dee2aaSAndroid Build Coastguard Worker if (!fDecoder.loadStream(SkStream::MakeFromFile("/skia/ice.mp4"))) { 26*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("could not load movie file\n"); 27*c8dee2aaSAndroid Build Coastguard Worker } 28*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("duration %g\n", fDecoder.duration()); 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)31*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 32*c8dee2aaSAndroid Build Coastguard Worker auto* rContext = canvas->recordingContext(); 33*c8dee2aaSAndroid Build Coastguard Worker if (!rContext) { 34*c8dee2aaSAndroid Build Coastguard Worker return; 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker fDecoder.setGrContext(rContext); // context can change over time in viewer 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker double timeStamp; 40*c8dee2aaSAndroid Build Coastguard Worker auto img = fDecoder.nextImage(&timeStamp); 41*c8dee2aaSAndroid Build Coastguard Worker if (!img) { 42*c8dee2aaSAndroid Build Coastguard Worker (void)fDecoder.rewind(); 43*c8dee2aaSAndroid Build Coastguard Worker img = fDecoder.nextImage(&timeStamp); 44*c8dee2aaSAndroid Build Coastguard Worker } 45*c8dee2aaSAndroid Build Coastguard Worker if (img) { 46*c8dee2aaSAndroid Build Coastguard Worker if (0) { 47*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("ts %g\n", timeStamp); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(img, 10, 10); 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker } 52*c8dee2aaSAndroid Build Coastguard Worker onAnimate(double nanos)53*c8dee2aaSAndroid Build Coastguard Worker bool onAnimate(double nanos) override { 54*c8dee2aaSAndroid Build Coastguard Worker return true; 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker private: 58*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 59*c8dee2aaSAndroid Build Coastguard Worker }; 60*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new VideoDecoderGM; ) 61*c8dee2aaSAndroid Build Coastguard Worker 62