2015-03-13 8 views
3

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

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), кажется, что указатель данных фактически находится в ОЗУ не в памяти графического процессора, и когда я хочу отобразить поверхность, кажется, что данные переместился на GPU и затем отобразился. Поскольку я знаю, что загрузка процессора высока, когда данные копируются между ОЗУ и памятью GPU.

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

+0

Если указатель данных находится в ОЗУ, это происходит не из-за функции getPointerToYourSurfacePixels(), то есть ffmpeg ничего не может изменить об этом? – stijn

ответ

0

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

  1. преобразования в RGB
  2. Объема данных перемещается между оперативной памятью и GPU снижается

Таким образом, общее использование ЦП уменьшается.