| | |
| | |
|
| | | bool payError;
|
| | |
|
| | | PL_AVFrameBGRA_Config config;
|
| | | |
| | | PL_AVFrameBGRA_Internal() :
|
| | | buffSize(0), buffSizeMax(sizeof(buffer)), lastFrame(),
|
| | | payError(true)
|
| | | payError(true),
|
| | | config()
|
| | | {
|
| | | }
|
| | |
|
| | |
| | |
|
| | | MB_Frame _lastFrame;
|
| | | lastFrame = _lastFrame;
|
| | | |
| | | PL_AVFrameBGRA_Config _config;
|
| | | config = _config;
|
| | | }
|
| | | };
|
| | |
|
| | |
| | | {
|
| | | PL_AVFrameBGRA_Internal* in = (PL_AVFrameBGRA_Internal*)internal;
|
| | | in->reset();
|
| | | |
| | | if (args != nullptr)
|
| | | {
|
| | | PL_AVFrameBGRA_Config* _config = (PL_AVFrameBGRA_Config*)args;
|
| | | in->config = *_config;
|
| | | }
|
| | |
|
| | | return true;
|
| | | }
|
| | |
| | | if (pm.buffer == nullptr)
|
| | | return false;
|
| | |
|
| | | int src_height = 0;
|
| | | int src_width = 0;
|
| | | const uint8* src_y = nullptr;
|
| | | const uint8* src_u = nullptr;
|
| | | const uint8* src_v = nullptr;
|
| | | |
| | | MB_Frame* frame = (MB_Frame*)pm.buffer;
|
| | | if (frame->type != MB_Frame::MBFT_PTR_AVFRAME)
|
| | | if (frame->type == MB_Frame::MBFT_PTR_AVFRAME)
|
| | | {
|
| | | AVFrame* pAVFrame = (AVFrame*)frame->buffer;
|
| | | if (pAVFrame == nullptr)
|
| | | return false;
|
| | | |
| | | src_height = pAVFrame->height;
|
| | | src_width = pAVFrame->width;
|
| | | |
| | | src_y = pAVFrame->data[0];
|
| | | src_u = pAVFrame->data[1];
|
| | | src_v = pAVFrame->data[2];
|
| | | }
|
| | | if (frame->type == MB_Frame::MBFT_YUV420)
|
| | | {
|
| | | if (frame->buffer == nullptr)
|
| | | return false;
|
| | | |
| | | src_height = frame->height;
|
| | | src_width = frame->width;
|
| | | |
| | | src_y = (const uint8*)(frame->buffer);
|
| | | src_u = (const uint8*)(src_y + (src_height * src_width));
|
| | | src_v = (const uint8*)(src_u + (src_height * src_width / 4));
|
| | | }
|
| | | else
|
| | | {
|
| | | LOG_ERROR << "Only support MBFT_PTR_AVFRAME" << std::endl;
|
| | | return false;
|
| | | }
|
| | |
|
| | | AVFrame* pAVFrame = (AVFrame*)frame->buffer;
|
| | | if (pAVFrame == nullptr)
|
| | | return false;
|
| | |
|
| | | const int height = pAVFrame->height;
|
| | | const int width = pAVFrame->width;
|
| | |
|
| | | //int I420ToBGRA(const uint8* src_y, int src_stride_y,
|
| | | // const uint8* src_u, int src_stride_u,
|
| | | // const uint8* src_v, int src_stride_v,
|
| | | // uint8* dst_argb, int dst_stride_argb,
|
| | | // int width, int height);
|
| | | // int width, int src_height);
|
| | |
|
| | | libyuv::I420ToBGRA(pAVFrame->data[0], width, |
| | | pAVFrame->data[1], SUBSAMPLE(width, 2), |
| | | pAVFrame->data[2], SUBSAMPLE(width, 2), |
| | | in->buffer, 4 * width, |
| | | width, height);
|
| | | if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_BGRA8888)
|
| | | {
|
| | | libyuv::I420ToBGRA(src_y, src_width, |
| | | src_u, SUBSAMPLE(src_width, 2), |
| | | src_v, SUBSAMPLE(src_width, 2), |
| | | in->buffer, 4 * src_width, |
| | | src_width, src_height);
|
| | |
|
| | | in->buffSize = in->buffSizeMax;
|
| | | in->buffSize = src_width * src_height * 4; // #todo use ret value?
|
| | | }
|
| | | else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB8888)
|
| | | {
|
| | | libyuv::I420ToARGB(src_y, src_width, |
| | | src_u, SUBSAMPLE(src_width, 2), |
| | | src_v, SUBSAMPLE(src_width, 2), |
| | | in->buffer, 4 * src_width, |
| | | src_width, src_height);
|
| | |
|
| | | in->buffSize = src_width * src_height * 4; // #todo use ret value?
|
| | | }
|
| | | else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB8888)
|
| | | {
|
| | | libyuv::I420ToARGB(src_y, src_width, |
| | | src_u, SUBSAMPLE(src_width, 2), |
| | | src_v, SUBSAMPLE(src_width, 2), |
| | | in->buffer, 4 * src_width, |
| | | src_width, src_height);
|
| | |
|
| | | in->buffSize = src_width * src_height * 4; // #todo use ret value?
|
| | | }
|
| | | else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB4444)
|
| | | {
|
| | | |
| | | }
|
| | | else
|
| | | {
|
| | | LOG_ERROR << "PL_AVFrameBGRA_Config.convertTo not support" << std::endl;
|
| | | return false;
|
| | | }
|
| | |
|
| | | //in->buffer readly
|
| | |
|
| | | in->lastFrame.type = MB_Frame::MBFT_BGRA;
|
| | | in->lastFrame.buffer = in->buffer;
|
| | | in->lastFrame.buffSize = in->buffSize;
|
| | | in->lastFrame.width = width;
|
| | | in->lastFrame.height = height;
|
| | | in->lastFrame.width = src_width;
|
| | | in->lastFrame.height = src_height;
|
| | | in->lastFrame.pts = frame->pts;
|
| | |
|
| | | //#test
|
| | | //static size_t f=0;
|
| | | //char fname[50];
|
| | | //sprintf(fname, "%u.bgra", ++f);
|
| | | //sprintf(fname, "%u.argb", ++f);
|
| | | //FILE * pFile = fopen (fname,"wb");
|
| | | //fwrite (in->buffer , sizeof(char), in->buffSize, pFile);
|
| | | //fclose(pFile);
|