Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkVideoDecoder.h
Go to the documentation of this file.
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#ifndef SkVideDecoder_DEFINED
9#define SkVideDecoder_DEFINED
10
12
13extern "C" {
14#include "libavcodec/avcodec.h"
15#include "libavformat/avformat.h"
16#include "libavformat/avio.h"
17#include "libavutil/pixdesc.h"
18#include "libswscale/swscale.h"
19}
20
21class SkStream;
22
24public:
27
28 void reset();
29 void setGrContext(GrRecordingContext* rContext) { fRecordingContext = rContext; }
30
31 bool loadStream(std::unique_ptr<SkStream>);
32 bool rewind();
33
34 SkISize dimensions() const;
35 double duration() const; // in seconds
36
37 // Returns each image in the video, or nullptr on eof
38 sk_sp<SkImage> nextImage(double* timeStamp = nullptr);
39
40private:
41 sk_sp<SkImage> convertFrame(const AVFrame*);
42 double computeTimeStamp(const AVFrame*) const;
43
44 struct ConvertedColorSpace {
45 AVColorPrimaries fPrimaries;
46 AVColorTransferCharacteristic fTransfer;
47 // fCS is the converted skia form of the above enums
49
50 // Init with illegal values, so our first compare will fail, forcing us to compute
51 // the skcolorspace.
52 ConvertedColorSpace();
53
54 void update(AVColorPrimaries, AVColorTransferCharacteristic);
55 };
56
57 GrRecordingContext* fRecordingContext = nullptr; // not owned by us
58
59 std::unique_ptr<SkStream> fStream;
60
61 AVIOContext* fStreamCtx = nullptr;
62 AVFormatContext* fFormatCtx = nullptr;
63 AVCodecContext* fDecoderCtx = nullptr;
64 int fStreamIndex = -1; // fFormatCtx->stream[...]
65
66 AVPacket fPacket;
67 AVFrame* fFrame = nullptr;
68 ConvertedColorSpace fCSCache;
69
70 enum Mode {
71 kProcessing_Mode,
72 kDraining_Mode,
73 kDone_Mode,
74 };
75 Mode fMode = kDone_Mode;
76};
77
78#endif
79
double duration() const
SkISize dimensions() const
void setGrContext(GrRecordingContext *rContext)
bool loadStream(std::unique_ptr< SkStream >)
sk_sp< SkImage > nextImage(double *timeStamp=nullptr)