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