From b4c22313c0ba28bb4b4f4dad4f0a28c2161cf6d2 Mon Sep 17 00:00:00 2001 From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674> Date: 星期二, 28 二月 2017 14:36:00 +0800 Subject: [PATCH] add amcd --- RtspFace/PL_AVFrameBGRA.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 88 insertions(+), 19 deletions(-) diff --git a/RtspFace/PL_AVFrameBGRA.cpp b/RtspFace/PL_AVFrameBGRA.cpp index 816a3db..addb967 100644 --- a/RtspFace/PL_AVFrameBGRA.cpp +++ b/RtspFace/PL_AVFrameBGRA.cpp @@ -20,9 +20,12 @@ bool payError; + PL_AVFrameBGRA_Config config; + PL_AVFrameBGRA_Internal() : buffSize(0), buffSizeMax(sizeof(buffer)), lastFrame(), - payError(true) + payError(true), + config() { } @@ -37,6 +40,9 @@ MB_Frame _lastFrame; lastFrame = _lastFrame; + + PL_AVFrameBGRA_Config _config; + config = _config; } }; @@ -59,6 +65,12 @@ { PL_AVFrameBGRA_Internal* in = (PL_AVFrameBGRA_Internal*)internal; in->reset(); + + if (args != nullptr) + { + PL_AVFrameBGRA_Config* _config = (PL_AVFrameBGRA_Config*)args; + in->config = *_config; + } return true; } @@ -84,46 +96,103 @@ if (pm.buffer == nullptr) return false; + int src_height = 0; + int src_width = 0; + const uint8* src_y = nullptr; + const uint8* src_u = nullptr; + const uint8* src_v = nullptr; + MB_Frame* frame = (MB_Frame*)pm.buffer; - if (frame->type != MB_Frame::MBFT_PTR_AVFRAME) + if (frame->type == MB_Frame::MBFT_PTR_AVFRAME) + { + AVFrame* pAVFrame = (AVFrame*)frame->buffer; + if (pAVFrame == nullptr) + return false; + + src_height = pAVFrame->height; + src_width = pAVFrame->width; + + src_y = pAVFrame->data[0]; + src_u = pAVFrame->data[1]; + src_v = pAVFrame->data[2]; + } + if (frame->type == MB_Frame::MBFT_YUV420) + { + if (frame->buffer == nullptr) + return false; + + src_height = frame->height; + src_width = frame->width; + + src_y = (const uint8*)(frame->buffer); + src_u = (const uint8*)(src_y + (src_height * src_width)); + src_v = (const uint8*)(src_u + (src_height * src_width / 4)); + } + else { LOG_ERROR << "Only support MBFT_PTR_AVFRAME" << std::endl; return false; } - AVFrame* pAVFrame = (AVFrame*)frame->buffer; - if (pAVFrame == nullptr) - return false; - - const int height = pAVFrame->height; - const int width = pAVFrame->width; - //int I420ToBGRA(const uint8* src_y, int src_stride_y, // const uint8* src_u, int src_stride_u, // const uint8* src_v, int src_stride_v, // uint8* dst_argb, int dst_stride_argb, -// int width, int height); +// int width, int src_height); - libyuv::I420ToBGRA(pAVFrame->data[0], width, - pAVFrame->data[1], SUBSAMPLE(width, 2), - pAVFrame->data[2], SUBSAMPLE(width, 2), - in->buffer, 4 * width, - width, height); + if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_BGRA8888) + { + libyuv::I420ToBGRA(src_y, src_width, + src_u, SUBSAMPLE(src_width, 2), + src_v, SUBSAMPLE(src_width, 2), + in->buffer, 4 * src_width, + src_width, src_height); - in->buffSize = in->buffSizeMax; + in->buffSize = src_width * src_height * 4; // #todo use ret value? + } + else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB8888) + { + libyuv::I420ToARGB(src_y, src_width, + src_u, SUBSAMPLE(src_width, 2), + src_v, SUBSAMPLE(src_width, 2), + in->buffer, 4 * src_width, + src_width, src_height); + + in->buffSize = src_width * src_height * 4; // #todo use ret value? + } + else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB8888) + { + libyuv::I420ToARGB(src_y, src_width, + src_u, SUBSAMPLE(src_width, 2), + src_v, SUBSAMPLE(src_width, 2), + in->buffer, 4 * src_width, + src_width, src_height); + + in->buffSize = src_width * src_height * 4; // #todo use ret value? + } + else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB4444) + { + + } + else + { + LOG_ERROR << "PL_AVFrameBGRA_Config.convertTo not support" << std::endl; + return false; + } + //in->buffer readly in->lastFrame.type = MB_Frame::MBFT_BGRA; in->lastFrame.buffer = in->buffer; in->lastFrame.buffSize = in->buffSize; - in->lastFrame.width = width; - in->lastFrame.height = height; + in->lastFrame.width = src_width; + in->lastFrame.height = src_height; in->lastFrame.pts = frame->pts; //#test //static size_t f=0; //char fname[50]; - //sprintf(fname, "%u.bgra", ++f); + //sprintf(fname, "%u.argb", ++f); //FILE * pFile = fopen (fname,"wb"); //fwrite (in->buffer , sizeof(char), in->buffSize, pFile); //fclose(pFile); -- Gitblit v1.8.0