| /* | |
| * Copyright 2019 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "experimental/ffmpeg/SkVideoDecoder.h" | |
| #include "gm/gm.h" | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkStream.h" | |
| class VideoDecoderGM : public skiagm::GM { | |
| SkVideoDecoder fDecoder; | |
| public: | |
| VideoDecoderGM() {} | |
| protected: | |
| SkString getName() const override { return SkString("videodecoder"); } | |
| SkISize getISize() override { return SkISize::Make(1024, 768); } | |
| void onOnceBeforeDraw() override { | |
| if (!fDecoder.loadStream(SkStream::MakeFromFile("/skia/ice.mp4"))) { | |
| SkDebugf("could not load movie file\n"); | |
| } | |
| SkDebugf("duration %g\n", fDecoder.duration()); | |
| } | |
| void onDraw(SkCanvas* canvas) override { | |
| auto* rContext = canvas->recordingContext(); | |
| if (!rContext) { | |
| return; | |
| } | |
| fDecoder.setGrContext(rContext); // context can change over time in viewer | |
| double timeStamp; | |
| auto img = fDecoder.nextImage(&timeStamp); | |
| if (!img) { | |
| (void)fDecoder.rewind(); | |
| img = fDecoder.nextImage(&timeStamp); | |
| } | |
| if (img) { | |
| if (0) { | |
| SkDebugf("ts %g\n", timeStamp); | |
| } | |
| canvas->drawImage(img, 10, 10); | |
| } | |
| } | |
| bool onAnimate(double nanos) override { | |
| return true; | |
| } | |
| private: | |
| using INHERITED = GM; | |
| }; | |
| DEF_GM( return new VideoDecoderGM; ) | |