From 0d5ec550ad724aac0a019a5cd619330af7cbc572 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期四, 21 十一月 2019 16:47:36 +0800 Subject: [PATCH] updte --- csrc/worker/decoder.cpp | 43 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 34 insertions(+), 9 deletions(-) diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp index f5e95b5..805356e 100644 --- a/csrc/worker/decoder.cpp +++ b/csrc/worker/decoder.cpp @@ -4,6 +4,7 @@ #include "../ffmpeg/format/FormatIn.hpp" #include "../ffmpeg/data/CodedData.hpp" #include "../ffmpeg/log/log.hpp" +#include "../common.hpp" extern "C"{ #include <libavformat/avformat.h> @@ -19,10 +20,14 @@ { decoder::decoder(ffwrapper::FormatIn *dec) :decRef_(dec) + ,conv_(NULL) {} decoder::~decoder(){ - + if (conv_){ + delete conv_; + conv_ = NULL; + } std::lock_guard<std::mutex> l(mutex_frm_); for(auto i : list_frm_){ free(i.data); @@ -46,14 +51,33 @@ return 0; } - int decoder::saveFrame(AVFrame *frame, int64_t &id){ + int decoder::saveFrame(AVFrame *frame, const int64_t &id){ + AVFrame *cFrame = NULL; + bool conv = false; + if (frame->format != AV_PIX_FMT_NV12){ + if (!conv_){ + conv_ = new cvbridge( + frame->width, frame->height, frame->format, + frame->width, frame->height, AV_PIX_FMT_NV12); + } + if (conv_){ + cFrame = conv_->convert2Frame(frame); + if (!cFrame) return -1; + conv = true; + } + } + AVFrame * rFrame = frame; + if (conv && cFrame) rFrame = cFrame; + FRM frm; - frm.width = frame->width; - frm.height = frame->height; - frm.format = frame->format; + frm.width = rFrame->width; + frm.height = rFrame->height; + frm.format = rFrame->format; frm.id = id; - frm.data = cvbridge::extractFrame(frame, &frm.length); - + frm.data = cvbridge::extractFrame(rFrame, &frm.length); + + if (conv && cFrame) av_frame_free(&cFrame); + std::lock_guard<std::mutex> l(mutex_frm_); while(list_frm_.size() > 50){ for(int i = 0; i < 12; i++){ @@ -67,7 +91,8 @@ return list_frm_.size(); } - int decoder::SetFrame(std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){ + int decoder::SetFrame(const CPacket &pkt){ + auto data = pkt.data; if (!data) return -10; if (!decRef_->isVideoPkt(&data->getAVPacket())) return -20; @@ -83,7 +108,7 @@ av_packet_unref(&np); if (ret == 0){ - saveFrame(frame, id); + saveFrame(frame, pkt.v_id); } av_frame_free(&frame); return ret; -- Gitblit v1.8.0