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