#pragma once #include #include #include "msgq/visionipc/visionbuf.h" #include "system/camerad/cameras/camera_common.h" #include "tools/replay/filereader.h" extern "C" { #include #include } class VideoDecoder; class FrameReader { public: FrameReader(); ~FrameReader(); bool load(CameraType type, const std::string &url, bool no_hw_decoder = false, std::atomic *abort = nullptr, bool local_cache = false, int chunk_size = -1, int retries = 0); bool loadFromFile(CameraType type, const std::string &file, bool no_hw_decoder = false, std::atomic *abort = nullptr); bool get(int idx, VisionBuf *buf); size_t getFrameCount() const { return packets_info.size(); } int width = 0, height = 0; VideoDecoder *decoder_ = nullptr; AVFormatContext *input_ctx = nullptr; int prev_idx = -1; struct PacketInfo { int flags; int64_t pos; }; std::vector packets_info; }; class VideoDecoder { public: VideoDecoder(); ~VideoDecoder(); bool open(AVCodecParameters *codecpar, bool hw_decoder); bool decode(FrameReader *reader, int idx, VisionBuf *buf); int width = 0, height = 0; private: bool initHardwareDecoder(AVHWDeviceType hw_device_type); AVFrame *decodeFrame(AVPacket *pkt); bool copyBuffer(AVFrame *f, VisionBuf *buf); AVFrame *av_frame_, *hw_frame_; AVCodecContext *decoder_ctx = nullptr; AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; AVBufferRef *hw_device_ctx = nullptr; };