From 109ffe9a777658936a38d0c146579a67c60a0d17 Mon Sep 17 00:00:00 2001 From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674> Date: 星期四, 11 五月 2017 17:48:48 +0800 Subject: [PATCH] --- RtspFace/PL_AVFrameYUV420.cpp | 111 +++++++++++++++++++++++++++++++++---------------------- 1 files changed, 67 insertions(+), 44 deletions(-) diff --git a/RtspFace/PL_AVFrameYUV420.cpp b/RtspFace/PL_AVFrameYUV420.cpp index 5927ce5..3c61b7c 100644 --- a/RtspFace/PL_AVFrameYUV420.cpp +++ b/RtspFace/PL_AVFrameYUV420.cpp @@ -1,4 +1,6 @@ #include "PL_AVFrameYUV420.h" +#include "MaterialBuffer.h" +#include "logger.h" extern "C" { @@ -9,14 +11,13 @@ struct AVFrameYUV420_Internal { - uint8_t buffer[1920*1080*3]; + uint8_t buffer[1920*1080*3];//#todo from config size_t buffSize; size_t buffSizeMax; - bool payError; + MB_Frame lastFrame; AVFrameYUV420_Internal() : - buffSize(0), buffSizeMax(sizeof(buffer)), - payError(false) + buffSize(0), buffSizeMax(sizeof(buffer)), lastFrame() { } @@ -27,7 +28,9 @@ void reset() { buffSize = 0; - payError = false; + + MB_Frame _lastFrame; + lastFrame = _lastFrame; } }; @@ -64,52 +67,72 @@ { AVFrameYUV420_Internal* in = (AVFrameYUV420_Internal*)internal; - int picSize = in->pAVCodecContext->height * in->pAVCodecContext->width; - in->buffSize = picSize * 1.5; - - int height = in->pAVFrame->height; - int width = in->pAVFrame->width; - - // write yuv420 - int a=0; - for (int i = 0; i < height; i++) - { - memcpy(in->buffer + a, in->pAVFrame->data[0] + i * in->pAVFrame->linesize[0], width); - a += width; - } - for (int i=0; i<height/2; i++) - { - memcpy(in->buffer + a, in->pAVFrame->data[1] + i * in->pAVFrame->linesize[1], width / 2); - a += width / 2; - } - for (int i=0; i<height/2; i++) - { - memcpy(in->buffer + a, in->pAVFrame->data[2] + i * in->pAVFrame->linesize[2], width / 2); - a += width / 2; - } - - //in->buffer readly - - //static size_t f=0; - //char fname[50]; - //sprintf(fname, "%u.yuv420", ++f); - //FILE * pFile = fopen (fname,"wb"); - //fwrite (in->buffer , sizeof(char), in->buffSize, pFile); - //fclose(pFile); + if (pm.type != PipeMaterial::PMT_FRAME) + { + LOG_ERROR << "Only support PMT_FRAME" << std::endl; + return false; + } + if (pm.buffer == nullptr) + return false; - return in->payError; + MB_Frame* frame = (MB_Frame*)pm.buffer; + if (frame->type != MB_Frame::MBFT_PTR_AVFRAME) + { + LOG_ERROR << "Only support MBFT_PTR_AVFRAME" << std::endl; + return false; + } + + AVFrame* pAVFrame = (AVFrame*)frame->buffer; + if (pAVFrame == nullptr) + return false; + + int picSize = pAVFrame->height * pAVFrame->width; + in->buffSize = picSize * 1.5; + + const int height = pAVFrame->height; + const int width = pAVFrame->width; + + uint8_t* pBuff = in->buffer; + + memcpy(pBuff, pAVFrame->data[0], height * width); + pBuff += height * width; + + memcpy(pBuff, pAVFrame->data[1], height * width / 4); + pBuff += height * width / 4; + + memcpy(pBuff, pAVFrame->data[2], height * width / 4); + pBuff += height * width / 4; + + in->buffSize = pBuff - in->buffer; + + //in->buffer readly + + in->lastFrame.type = MB_Frame::MBFT_YUV420; + in->lastFrame.buffer = in->buffer; + in->lastFrame.buffSize = in->buffSize; + in->lastFrame.width = width; + in->lastFrame.height = height; + in->lastFrame.pts = frame->pts; + + //#test + //static size_t f=0; + //char fname[50]; + //sprintf(fname, "%u.yuv420", ++f); + //FILE * pFile = fopen (fname,"wb"); + //fwrite (in->buffer , sizeof(char), in->buffSize, pFile); + //fclose(pFile); + + return true; } bool PL_AVFrameYUV420::gain(PipeMaterial& pm) { AVFrameYUV420_Internal* in = (AVFrameYUV420_Internal*)internal; - if (!in->payError) - { - pm.buffer = in->buffer; - pm.buffSize = in->buffSize; - } + pm.type = PipeMaterial::PMT_FRAME; + pm.buffer = &(in->lastFrame); + pm.buffSize = 0; pm.former = this; - return in->payError; + return true; } -- Gitblit v1.8.0