From c5a01eed95f1837e93fee27bce4da78c79f4ed10 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期二, 12 十一月 2019 17:41:43 +0800 Subject: [PATCH] update --- csrc/worker/decoder.cpp | 76 ++++++++++++++++---------------------- 1 files changed, 32 insertions(+), 44 deletions(-) diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp index 67af0a1..558d871 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> @@ -25,7 +26,7 @@ std::lock_guard<std::mutex> l(mutex_frm_); for(auto i : list_frm_){ - av_frame_free(&i.frm); + free(i.data); } list_frm_.clear(); } @@ -46,25 +47,35 @@ return 0; } - int decoder::saveFrame(AVFrame *frame, int64_t &id){ + int decoder::saveFrame(AVFrame *frame, const int64_t &id){ + FRM frm; + frm.width = frame->width; + frm.height = frame->height; + frm.format = frame->format; + frm.id = id; + frm.data = cvbridge::extractFrame(frame, &frm.length); + + std::lock_guard<std::mutex> l(mutex_frm_); while(list_frm_.size() > 50){ for(int i = 0; i < 12; i++){ auto t = list_frm_.front(); - av_frame_free(&t.frm); + free(t.data); list_frm_.pop_front(); } } - list_frm_.push_back({frame,id}); + if (!frm.data) return 0; + list_frm_.push_back(frm); 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 -1; - if (!decRef_->isVideoPkt(&data->getAVPacket())) return -2; + if (!data) return -10; + if (!decRef_->isVideoPkt(&data->getAVPacket())) return -20; if (decRef_->getCodecContext() == NULL){ - if (initDecoder() != 0) return -3; + if (initDecoder() != 0) return -30; } AVFrame *frame = av_frame_alloc(); @@ -74,52 +85,29 @@ av_packet_unref(&np); if (ret == 0){ - saveFrame(frame, id); + saveFrame(frame, pkt.v_id); } + av_frame_free(&frame); + return ret; } void decoder::GetFrame(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){ - AVFrame *frm = NULL; - { - std::lock_guard<std::mutex> l(mutex_frm_); - if(list_frm_.empty()){ - *data = NULL; - *w = *h = 0; - *id = -1; - return; - } - auto p = list_frm_.front(); - list_frm_.pop_front(); - frm = p.frm; - *id = p.id; - *w = frm->width; - *h = frm->height; - *format = frm->format; - } - - *length = avpicture_get_size((enum AVPixelFormat)frm->format, frm->width, frm->height); - if (*length <= 0){ - logIt("get raw frame data error"); + std::lock_guard<std::mutex> l(mutex_frm_); + if(list_frm_.empty()){ *data = NULL; *w = *h = 0; *id = -1; return; } - - unsigned char *picData = (unsigned char*)malloc(*length); - auto ret = avpicture_layout((const AVPicture*)frm, (enum AVPixelFormat)frm->format, frm->width, frm->height, picData, *length); - av_frame_free(&frm); - - if (ret < 0){ - *data = NULL; - *w = *h = 0; - *id = -1; - free(picData); - return; - } - - *data = picData; + auto p = list_frm_.front(); + list_frm_.pop_front(); + *data = p.data; + *id = p.id; + *w = p.width; + *h = p.height; + *format = p.format; + *length = p.length; } } // namespace cffmpeg_wrap -- Gitblit v1.8.0