From 3f1386db26fc1d8d7b615907d21d0f196780eda2 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 22 十一月 2019 11:14:40 +0800 Subject: [PATCH] update --- csrc/worker/decoder.cpp | 45 ++++++++++++++++++--------------------------- 1 files changed, 18 insertions(+), 27 deletions(-) diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp index d421d37..f96f864 100644 --- a/csrc/worker/decoder.cpp +++ b/csrc/worker/decoder.cpp @@ -23,7 +23,7 @@ {} decoder::~decoder(){ - + std::lock_guard<std::mutex> l(mutex_frm_); for(auto i : list_frm_){ free(i.data); @@ -53,37 +53,28 @@ frm.height = frame->height; frm.format = frame->format; frm.id = id; - 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); + uint8_t *origin = cvbridge::extractFrame(frame, &frm.length); + if (!origin) return -1; - int i, j; - int y_size = frame->width * frame->height; + uint8_t *finale = NULL; + if (frame->format != AV_PIX_FMT_NV12){ + finale = (uint8_t*)malloc(frm.length); - 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]; + unsigned char* SrcU = origin + frm.width * frm.height; + unsigned char* SrcV = SrcU + frm.width * frm.height / 4 ; + unsigned char* DstU = finale + frm.width * frm.height; + memcpy(finale, origin, frm.width * frm.height); + int i = 0; + for( i = 0 ; i < frm.width * frm.height / 4 ; i++ ){ + *(DstU++) = *(SrcU++); + *(DstU++) = *(SrcV++); } - free(tmp); + free(origin); }else{ - return 0; + finale = origin; } - frm.data = data; + frm.data = finale; + std::lock_guard<std::mutex> l(mutex_frm_); while(list_frm_.size() > 50){ for(int i = 0; i < 12; i++){ -- Gitblit v1.8.0