From e878e92811a2dbfb6b4d3f7b2c357435f56e28db Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期日, 29 九月 2019 10:27:21 +0800 Subject: [PATCH] add trytime --- csrc/worker/decoder.cpp | 74 +++++++++++++++++++++--------------- 1 files changed, 43 insertions(+), 31 deletions(-) diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp index 4cd1f8d..ce5f631 100644 --- a/csrc/worker/decoder.cpp +++ b/csrc/worker/decoder.cpp @@ -3,13 +3,13 @@ #include "../ffmpeg/bridge/cvbridge.hpp" #include "../ffmpeg/format/FormatIn.hpp" #include "../ffmpeg/data/CodedData.hpp" -#include "../ffmpeg/data/FrameData.hpp" #include "../ffmpeg/log/log.hpp" extern "C"{ #include <libavformat/avformat.h> #include <libavutil/opt.h> #include <libswscale/swscale.h> +#include <libavcodec/avcodec.h> } using namespace ffwrapper; @@ -26,15 +26,18 @@ {} decoder::~decoder(){ + if (conv_){ delete conv_; } - std::lock_guard<std::mutex> l(mutex_pic_); - for(auto &i : list_pic_){ - free(i.data); + { + std::lock_guard<std::mutex> l(mutex_pic_); + for(auto &i : list_pic_){ + free(i.data); + } + list_pic_.clear(); } - list_pic_.clear(); } int decoder::initDecoder(){ @@ -43,7 +46,7 @@ if(decRef_->getCodecContext() == NULL){ bool flag = true; - flag = decRef_->openCodec(AVMEDIA_TYPE_VIDEO, NULL); + flag = decRef_->openCodec(NULL); auto dec_ctx = decRef_->getCodecContext(); if(conv_){ delete conv_; @@ -64,38 +67,47 @@ return 0; } + int decoder::saveFrame(AVFrame *frame, int64_t &id){ + //缂撳瓨鏁版嵁 + BGR24 pic; + AVFrame *frm = frame; + pic.w = conv_w_; + pic.h = conv_h_; + unsigned char *picData = (unsigned char*)malloc(pic.w * pic.h * 3); + conv_->copyPicture(picData, frm); + pic.data = picData; + pic.id = id; + std::lock_guard<std::mutex> l(mutex_pic_); + while(list_pic_.size() > 50){ + for(int i = 0; i < 12; i++){ + auto t = list_pic_.front(); + free(t.data); + list_pic_.pop_front(); + } + } + list_pic_.emplace_back(pic); + return list_pic_.size(); + } + int decoder::SetFrame(std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){ + if (!data) return -1; - if (decRef_->isAudioPkt(data->getAVPacket())) return -2; + if (!decRef_->isVideoPkt(&data->getAVPacket())) return -2; if (!conv_){ - initDecoder(); + if (initDecoder() != 0) return -3; } - auto frame(std::make_shared<FrameData>()); - auto ret = decRef_->decode(frame, data); - if(ret == 1){ - //缂撳瓨鏁版嵁 - BGR24 pic; - AVFrame *frm = frame->getAVFrame(); - pic.w = conv_w_; - pic.h = conv_h_; - unsigned char *picData = (unsigned char*)malloc(pic.w * pic.h * 3); - conv_->copyPicture(picData, frm); - pic.data = picData; - pic.id = id; - std::lock_guard<std::mutex> l(mutex_pic_); - while(list_pic_.size() > 10){ - for(int i = 0; i < 5; i++){ - auto t = list_pic_.front(); - free(t.data); - list_pic_.pop_front(); - } - } - list_pic_.emplace_back(pic); - + AVFrame *frame = av_frame_alloc(); + AVPacket np(data->getAVPacket()); + av_copy_packet(&np, &data->getAVPacket()); + auto ret = decRef_->decode(frame, &np); + av_packet_unref(&np); + + if (ret == 0){ + saveFrame(frame, id); } - return list_pic_.size(); + av_frame_free(&frame); } void decoder::GetFrame(unsigned char **data, int *w, int *h, int64_t *id){ -- Gitblit v1.8.0