From fa8b072f4c5359703ae664ef8a5d79139742e2e8 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 29 十一月 2019 11:20:08 +0800 Subject: [PATCH] optimize ffmpeg decode cpu and memory --- csrc/worker/decoder.hpp | 41 +++++++++++++++++++++++++---------------- 1 files changed, 25 insertions(+), 16 deletions(-) diff --git a/csrc/worker/decoder.hpp b/csrc/worker/decoder.hpp index 0f3f76a..533140d 100644 --- a/csrc/worker/decoder.hpp +++ b/csrc/worker/decoder.hpp @@ -5,42 +5,51 @@ #include <memory> #include <list> #include <mutex> +#include <thread> +#include <atomic> +#include <condition_variable> + +struct AVFrame; +struct AVCodecContext; + +class CPacket; namespace ffwrapper { class FormatIn; - class cvbridge; class CodedData; } // namespace ffwrapper namespace cffmpeg_wrap { - typedef struct _pic_bgr24{ - unsigned char *data; - int w; - int h; - + typedef struct _frm{ + AVFrame *avframe; + int length; + int width; + int height; int64_t id; - }BGR24; + }FRM; class decoder { private: - ffwrapper::cvbridge *conv_; - int conv_w_, conv_h_, conv_flag_; ffwrapper::FormatIn *decRef_; - - std::list<BGR24> list_pic_; - std::mutex mutex_pic_; - + + std::list<FRM> list_frm_; + std::mutex mutex_frm_; + private: int initDecoder(); + int saveFrame(AVFrame *frame, const int64_t &id); public: - int SetFrame(std::shared_ptr<ffwrapper::CodedData> data, int64_t &id); - void GetFrame(unsigned char **data, int *w, int *h, int64_t *id); + void Start(); + int SetFrame(const CPacket &pkt); + void GetFrame(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id); + private: + public: - decoder(ffwrapper::FormatIn *dec, const int w, const int h, const int f); + explicit decoder(ffwrapper::FormatIn *dec); ~decoder(); }; -- Gitblit v1.8.0