#include "PL_AVFrameYUV420.h" #include "MaterialBuffer.h" #include "logger.h" extern "C" { #include #include #include } struct AVFrameYUV420_Internal { uint8_t buffer[1920*1080*3];//#todo from config size_t buffSize; size_t buffSizeMax; MB_Frame lastFrame; AVFrameYUV420_Internal() : buffSize(0), buffSizeMax(sizeof(buffer)), lastFrame() { } ~AVFrameYUV420_Internal() { } void reset() { buffSize = 0; MB_Frame _lastFrame; lastFrame = _lastFrame; } }; PipeLineElem* create_PL_AVFrameYUV420() { return new PL_AVFrameYUV420; } PL_AVFrameYUV420::PL_AVFrameYUV420() : internal(new AVFrameYUV420_Internal) { } PL_AVFrameYUV420::~PL_AVFrameYUV420() { delete (AVFrameYUV420_Internal*)internal; internal= nullptr; } bool PL_AVFrameYUV420::init(void* args) { AVFrameYUV420_Internal* in = (AVFrameYUV420_Internal*)internal; in->reset(); return true; } void PL_AVFrameYUV420::finit() { AVFrameYUV420_Internal* in = (AVFrameYUV420_Internal*)internal; } bool PL_AVFrameYUV420::pay(const PipeMaterial& pm) { AVFrameYUV420_Internal* in = (AVFrameYUV420_Internal*)internal; if (pm.type != PipeMaterial::PMT_FRAME) { LOG_ERROR << "Only support PMT_FRAME" << std::endl; return false; } if (pm.buffer == nullptr) return false; 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; pm.type = PipeMaterial::PMT_FRAME; pm.buffer = &(in->lastFrame); pm.buffSize = 0; pm.former = this; return true; }