Вы можете использовать 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 в ГПУ, если вы хотите ... вы можете выбрать, как вы хотите.
Я думаю, что должно быть возможно считывать данные в PBO и сопоставлять их с адресным пространством клиента и ссылаться на этот адрес в структуре AVFrame. – derhass
, но формат данных - массив YUV. Мне нужны отдельные массивы –
Вы уже можете упорядочить данные по мере необходимости в шейдерах. Сначала это может показаться немного неинтуитивным, но это окончательно возможно. – derhass