#ifndef _FFMPEG_FORMAT_CONTEXT_OUT_H_ #define _FFMPEG_FORMAT_CONTEXT_OUT_H_ #include #include #include #include struct AVFormatContext; struct AVStream; struct AVCodecContext; struct AVFrame; struct AVPacket; struct AVDictionary; namespace ffwrapper{ class VideoProp; class FormatOut { public: FormatOut(); ~FormatOut(); FormatOut(VideoProp &prop, const char *filename, char *format_name = NULL); FormatOut(const double fps, const char *format_name); void clear(); public: bool open(const char *filename, const char *format_name); bool openCodec(VideoProp &prop); int encode(AVPacket *pkt, AVFrame *frame); public: bool copyCodecFromIn(std::vector in); bool openResource(const char *filename, const int flags); bool closeResource(); bool JustWriter(std::vector in, const char *filename); bool EncodeWriter(const char *filename); bool writeFrame(AVPacket *pkt, const int64_t &frame_cnt, bool interleaved = true); void adjustPTS(AVPacket *pkt, const int64_t &frame_cnt); bool endWriter(); bool writeHeader(AVDictionary **options = NULL); bool writeFrame2(AVPacket *pkt, bool interleaved); bool writeTrailer(); public: AVStream *getStream(); const AVCodecContext *getCodecContext() const; const double getFPS()const{return fps_;} const char* getFormatName() const{return format_name_.c_str();} const char* getFileName() const;//{return ctx_->filename;} const bool isRecord(){return record_;} private: void configEncoder(VideoProp &prop); private: AVFormatContext *ctx_; int v_idx_; int a_idx_; AVCodecContext *enc_ctx_; int64_t sync_opts_; bool record_; double fps_; std::string format_name_; // rec std::vector in_streams_; }; } #endif