| /* |
| * Copyright 2019 Google Inc. |
| * |
| * 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; ) |
| |