blob: 107f8ebfa4e8f72598ead0856444e42102c04395 [file] [log] [blame]
Mike Reed7bf160e2019-05-17 16:50:51 -04001/*
2 * Copyright 2019 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "experimental/ffmpeg/SkVideoDecoder.h"
9#include "gm/gm.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkStream.h"
12
13class VideoDecoderGM : public skiagm::GM {
14 SkVideoDecoder fDecoder;
15
16public:
17 VideoDecoderGM() {}
18
19protected:
20
21 SkString onShortName() override {
22 return SkString("videodecoder");
23 }
24
25 SkISize onISize() override {
26 return SkISize::Make(1024, 768);
27 }
28
29 void onOnceBeforeDraw() override {
30 if (!fDecoder.loadStream(SkStream::MakeFromFile("/skia/ice.mp4"))) {
31 SkDebugf("could not load movie file\n");
32 }
33 SkDebugf("duration %g\n", fDecoder.duration());
34 }
35
36 void onDraw(SkCanvas* canvas) override {
Florin Malita8b5ed022020-09-22 08:51:43 -040037 auto* rContext = canvas->recordingContext();
Brian Salomonc2a9a972020-09-15 11:24:28 -040038 if (!rContext) {
Mike Reed7bf160e2019-05-17 16:50:51 -040039 return;
40 }
41
Brian Salomonc2a9a972020-09-15 11:24:28 -040042 fDecoder.setGrContext(rContext); // context can change over time in viewer
Mike Reed7bf160e2019-05-17 16:50:51 -040043
44 double timeStamp;
45 auto img = fDecoder.nextImage(&timeStamp);
46 if (!img) {
47 (void)fDecoder.rewind();
48 img = fDecoder.nextImage(&timeStamp);
49 }
50 if (img) {
51 if (0) {
52 SkDebugf("ts %g\n", timeStamp);
53 }
Florin Malitaef47e012021-01-30 12:36:52 -050054 canvas->drawImage(img, 10, 10);
Mike Reed7bf160e2019-05-17 16:50:51 -040055 }
56 }
57
Hal Canary41248072019-07-11 16:32:53 -040058 bool onAnimate(double nanos) override {
Mike Reed7bf160e2019-05-17 16:50:51 -040059 return true;
60 }
61
62private:
John Stiles7571f9e2020-09-02 22:42:33 -040063 using INHERITED = GM;
Mike Reed7bf160e2019-05-17 16:50:51 -040064};
65DEF_GM( return new VideoDecoderGM; )
66