From eba319d23b87c72dfe3ac4b40f7283bfad858c33 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期三, 23 十月 2019 15:41:49 +0800 Subject: [PATCH] update --- csrc/worker/decoder.cpp | 41 ++++++++++++++++++++++++++++++++++++----- 1 files changed, 36 insertions(+), 5 deletions(-) diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp index f5e95b5..d421d37 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> @@ -46,14 +47,43 @@ 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); - + uint8_t *tmp = cvbridge::extractFrame(frame, &frm.length); + uint8_t *data = NULL; + if (frame->format == AV_PIX_FMT_YUV420P){ + data = tmp; + }else if (frame->format == AV_PIX_FMT_NV12){ + data = (uint8_t*)malloc(frm.length); + + int i, j; + int y_size = frame->width * frame->height; + + unsigned char* y = tmp; + unsigned char* uv = tmp + y_size; + + unsigned char* y_tmp = data; + unsigned char* u_tmp = data + y_size; + unsigned char* v_tmp = data + y_size * 5 / 4; + + // y + memcpy(y_tmp, y, y_size); + + // uv + for (j = 0, i = 0; j < y_size/2; j+=2, i++) + { + u_tmp[i] = uv[j]; + v_tmp[i] = uv[j+1]; + } + free(tmp); + }else{ + return 0; + } + frm.data = data; std::lock_guard<std::mutex> l(mutex_frm_); while(list_frm_.size() > 50){ for(int i = 0; i < 12; i++){ @@ -67,7 +97,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 +114,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