Ускорение аппаратного обеспечения кадровой системы FFMPEG до DirectX

Я использую функции ffmpeg для декодирования кадров h264 и отображения в окне на платформе Windows. Подход, который я использую, описан ниже (от FFMPEG Frame до DirectX Surface):

AVFrame *frame;
avcodec_decode_video(_ffcontext, frame, etc...);

lockYourSurface();
uint8_t *buf = getPointerToYourSurfacePixels();

// Create an AVPicture structure which contains a pointer to the RGB surface.
AVPicture pict;

memset(&pict, 0, sizeof(pict));

avpicture_fill(&pict, buf, PIX_FMT_RGB32,
               _ffcontext->width, _ffcontext->height);



// Convert the image into RGB and copy to the surface.
img_convert(&pict, PIX_FMT_RGB32, (AVPicture *)frame,
            _context->pix_fmt, _context->width, _context->height);


unlockYourSurface();

В коде я использую sws_scale вместо img_convert.

Когда я передаю указатель данных поверхности в sws_scale (фактически в avpicture_fill), кажется, что указатель данных фактически находится в оперативной памяти, а не в памяти графического процессора, и когда я хочу отобразить поверхность, кажется, что данные перемещаются в графический процессор и затем отображается. Как я знаю, загрузка ЦП высока, когда данные копируются между оперативной и графической памятью.

Как я могу tel ffmpeg для рендеринга непосредственно на поверхность в памяти GPU (не указатель данных в RAM)?

1 ответ

Решение

Я нашел ответ на эту проблему. Чтобы предотвратить дополнительное использование процессора при отображении кадров с помощью ffmpeg, мы не должны декодировать кадр в RGB. Почти все видеофайлы декодируются в YUV (это оригинальный формат изображения внутри видеофайла). Дело в том, что GPU может отображать данные YUV напрямую, без необходимости конвертировать их в RGB. Как я знаю, используя обычную версию ffmpeg, декодированные данные всегда находятся в оперативной памяти. Для кадра объем данных YUV очень мал по сравнению с RGB-декодированным эквивалентом того же кадра. Поэтому, когда мы перемещаем данные YUV в графический процессор вместо преобразования в RGB, а затем переходим в графический процессор, мы ускоряем работу с двух сторон:

  1. Нет преобразования в RGB
  2. Количество данных, перемещаемых между RAM и GPU, уменьшается

Таким образом, в конечном итоге общее использование процессора уменьшилось.

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