1 /*
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 
13 class VideoDecoderGM : public skiagm::GM {
14     SkVideoDecoder fDecoder;
15 
16 public:
VideoDecoderGM()17     VideoDecoderGM() {}
18 
19 protected:
20 
onShortName()21     SkString onShortName() override {
22         return SkString("videodecoder");
23     }
24 
onISize()25     SkISize onISize() override {
26         return SkISize::Make(1024, 768);
27     }
28 
onOnceBeforeDraw()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 
onDraw(SkCanvas * canvas)36     void onDraw(SkCanvas* canvas) override {
37         auto* rContext = canvas->recordingContext();
38         if (!rContext) {
39             return;
40         }
41 
42         fDecoder.setGrContext(rContext);  // context can change over time in viewer
43 
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             }
54             canvas->drawImage(img, 10, 10, nullptr);
55         }
56     }
57 
onAnimate(double nanos)58     bool onAnimate(double nanos) override {
59         return true;
60     }
61 
62 private:
63     using INHERITED = GM;
64 };
65 DEF_GM( return new VideoDecoderGM; )
66 
67