From 928db0d6dc74630e35df9360e9d9968f17d11ca9 Mon Sep 17 00:00:00 2001 From: pans <pans@454eff88-639b-444f-9e54-f578c98de674> Date: 星期三, 28 十二月 2016 14:09:57 +0800 Subject: [PATCH] --- RtspFace/PL_AVFrameYUV420.cpp | 106 +++++++++++++++++++++++++++++++--------------------- 1 files changed, 63 insertions(+), 43 deletions(-) diff --git a/RtspFace/PL_AVFrameYUV420.cpp b/RtspFace/PL_AVFrameYUV420.cpp index 5927ce5..5462ba9 100644 --- a/RtspFace/PL_AVFrameYUV420.cpp +++ b/RtspFace/PL_AVFrameYUV420.cpp @@ -1,4 +1,5 @@ #include "PL_AVFrameYUV420.h" +#include "MaterialBuffer.h" extern "C" { @@ -12,11 +13,10 @@ uint8_t buffer[1920*1080*3]; 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 +27,9 @@ void reset() { buffSize = 0; - payError = false; + + MB_Frame _lastFrame; + lastFrame = _lastFrame; } }; @@ -64,52 +66,70 @@ { 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) + { + printf("PL_H264Encoder::pay only support PMT_FRAME\n"); + 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) + { + printf("PL_H264Encoder::pay only support MBFT_PTR_AVFRAME\n"); + return false; + } + + AVFrame* pAVFrame = (AVFrame*)frame->buffer; + if (pAVFrame == nullptr) + return false; + + int picSize = pAVFrame->height * pAVFrame->width; + in->buffSize = picSize * 1.5; + + int height = pAVFrame->height; + 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.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 = (uint8_t*)(&(in->lastFrame)); + pm.buffSize = sizeof(in->lastFrame); pm.former = this; - return in->payError; + return true; } -- Gitblit v1.8.0