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