/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkVideDecoder_DEFINED #define SkVideDecoder_DEFINED #include "include/core/SkImage.h" extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavformat/avio.h" #include "libavutil/pixdesc.h" #include "libswscale/swscale.h" } class SkVideoDecoder { public: SkVideoDecoder(GrRecordingContext* = nullptr); ~SkVideoDecoder(); void reset(); void setGrContext(GrRecordingContext* rContext) { fRecordingContext = rContext; } bool loadStream(std::unique_ptr); bool rewind(); SkISize dimensions() const; double duration() const; // in seconds // Returns each image in the video, or nullptr on eof sk_sp nextImage(double* timeStamp = nullptr); private: sk_sp convertFrame(const AVFrame*); double computeTimeStamp(const AVFrame*) const; struct ConvertedColorSpace { AVColorPrimaries fPrimaries; AVColorTransferCharacteristic fTransfer; // fCS is the converted skia form of the above enums sk_sp fCS; // Init with illegal values, so our first compare will fail, forcing us to compute // the skcolorspace. ConvertedColorSpace(); void update(AVColorPrimaries, AVColorTransferCharacteristic); }; GrRecordingContext* fRecordingContext = nullptr; // not owned by us std::unique_ptr fStream; AVIOContext* fStreamCtx = nullptr; AVFormatContext* fFormatCtx = nullptr; AVCodecContext* fDecoderCtx = nullptr; int fStreamIndex = -1; // fFormatCtx->stream[...] AVPacket fPacket; AVFrame* fFrame = nullptr; ConvertedColorSpace fCSCache; enum Mode { kProcessing_Mode, kDraining_Mode, kDone_Mode, }; Mode fMode = kDone_Mode; }; #endif