#ifndef _FFMPEG_FORMAT_CONTEXT_IN_H_ #define _FFMPEG_FORMAT_CONTEXT_IN_H_ #include #include #include #include "PsToEs.hpp" struct AVFormatContext; struct AVDictionary; struct AVStream; struct AVCodecContext; struct AVPacket; struct AVFrame; struct AVCodec; struct AVIOContext; struct AVCodecParserContext; typedef int(* read_packet)(void *opaque,uint8_t *buf, int buf_size); namespace ffwrapper{ class VideoProp; class FormatIn { public: explicit FormatIn(bool hw=true); explicit FormatIn(const VideoProp &prop, bool hw=true); virtual ~FormatIn(); public: virtual int open(const char *filename, AVDictionary **options); virtual const bool IsHEVC()const; virtual const bool IsAVC1()const; virtual int readPacket(AVPacket *pkt_out); virtual bool isVideoPkt(AVPacket *pkt); virtual bool isAudioPkt(AVPacket *pkt); bool notVideoAudio(AVPacket *pkt); int openWithCustomIO(void *opaque, read_packet fn, AVDictionary **options=NULL); bool openCodec(AVDictionary **options); int decode(AVFrame* frame, AVPacket *pkt); protected: bool allocCodec(AVCodec *dec, AVStream *s, AVDictionary **options); public: AVStream *getStream(int type = -1); AVCodecContext *getCodecContext(int type = 0); AVFormatContext *getFromatContext(){return ctx_;} const double getFPS()const{return fps_;} protected: AVFormatContext *ctx_; AVCodecContext *dec_ctx_; int vs_idx_; int as_idx_; VideoProp *prop_; int fps_; private: AVIOContext *io_ctx_; uint8_t *read_io_buff_; const int read_io_buff_size_; }; class FormatInGB : public FormatIn{ public: FormatInGB(); explicit FormatInGB(const VideoProp &prop); ~FormatInGB(); virtual int open(const char *filename, AVDictionary **options) override; virtual const bool IsHEVC()const override; virtual const bool IsAVC1()const override; virtual int readPacket(AVPacket *pkt_out) override; virtual bool isVideoPkt(AVPacket *pkt) override; virtual bool isAudioPkt(AVPacket *pkt) override; private: GB28181API* gb28181_; AVCodecParserContext* parser_ctx_; unsigned char* buffer_; int buffer_size_; std::deque q_pkt_; }; } #endif