Каков наилучший способ заполнить AVFrame.data

Я хочу передать данные кадрового буфера opengl в AVCodec как можно быстрее.

Я уже преобразовал RGB в YUV с помощью шейдера и прочитал его с помощью glReadPixels

Мне все еще нужно заполнить данные AVFrame вручную. Есть ли лучший способ?

AVFrame *frame;
// Y
frame->data[0][y*frame->linesize[0]+x] = data[i*3];
// U
frame->data[1][y*frame->linesize[1]+x] = data[i*3+1];
// V
frame->data[2][y*frame->linesize[2]+x] = data[i*3+2];

1 ответ

Решение

Ты можешь использовать sws_scale,

На самом деле, вам не нужны шейдеры для преобразования RGB->YUV. Поверьте мне, это не будет иметь совсем другое представление.

swsContext = sws_getContext(WIDTH, HEIGHT, AV_PIX_FMT_RGBA, WIDTH, HEIGHT, AV_PIX_FMT_YUV, SWS_BICUBIC, 0, 0, 0 );
sws_scale(swsContext, (const uint8_t * const *)sourcePictureRGB.data, sourcePictureRGB.linesize, 0, codecContext->height, destinyPictureYUV.data, destinyPictureYUV.linesize);

Данные в destinyPictureYUV будет готов перейти к кодеку.

В этом примере destinyPictureYUV - это AVFrame Вы хотите заполнить. Попробуйте настроить так:

AVFrame * frame;
AVPicture destinyPictureYUV;

avpicture_alloc(&destinyPictureYUV, codecContext->pix_fmt, newCodecContext->width, newCodecContext->height);

// THIS is what you want probably
*reinterpret_cast<AVPicture *>(frame) = destinyPictureYUV;

С этой настройкой вы МОЖЕТЕ ТАКЖЕ заполнить данными, которые вы уже преобразовали в YUV в графическом процессоре, если хотите... вы можете выбрать желаемый способ.

Другие вопросы по тегам