#include "PL_AVFrameYUV420.h" extern "C" { #include #include #include } struct AVFrameYUV420_Internal { uint8_t buffer[1920*1080*3]; size_t buffSize; size_t buffSizeMax; AVFrameYUV420_Internal() : buffSize(0), buffSizeMax(sizeof(buffer)) { } ~AVFrameYUV420_Internal() { } void reset() { buffSize = 0; } }; 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; AVFrame* pAVFrame = (AVFrame*)pm.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; // write yuv420 //int a=0; //for (int i = 0; i < height; i++) //{ // memcpy(in->buffer + a, pAVFrame->data[0] + i * pAVFrame->linesize[0], width); // a += width; //} //for (int i=0; ibuffer + a, pAVFrame->data[1] + i * pAVFrame->linesize[1], width / 2); // a += width / 2;//#todo 4 //} //for (int i=0; ibuffer + a, pAVFrame->data[2] + i * 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); return true; } bool PL_AVFrameYUV420::gain(PipeMaterial& pm) { AVFrameYUV420_Internal* in = (AVFrameYUV420_Internal*)internal; pm.buffer = in->buffer; pm.buffSize = in->buffSize; pm.former = this; return true; }