Использование OpenGL для выполнения композитинга видео в формате цвета YUV - производительность - PullRequest
0 голосов
/ 12 февраля 2019

Я написал реализацию C / C ++, которую я называю «композитором» (я пришел из видео-фона) для композитного / наложения видео / графики поверх видеоисточника.Моя текущая реализация композитора довольно наивна, и есть место для улучшений оптимизации процессора (например, SIMD, многопоточность и т. Д.).

Я создал высокоуровневую диаграмму того, что я сейчас делаю:

overlay diagram

Диаграмма не требует пояснений.Тем не менее, я остановлюсь на некоторых ограничениях:

  • Основное видео всегда поставляется в 8-битном формате YUV 4: 2: 2
  • Вторичное видео (опционально) поставляется в 8-битном формате YUV 4: 2: 2 или в формате YUVA 4: 2: 2: 4.
  • Выход из оверлея должен выходить в 8-битном формате YUV 4: Упакованный формат 2: 2

Некоторые другие биты информации:

  • Количество графических входов будет различным;оно может (или не может) быть постоянным значением.
  • Цветовой формат графики может быть закреплен либо в формате ARGB, либо в формате YUVA (т. е. я могу предоставить его по вашему усмотрению).На данный момент я прикрепляю его к YUVA, чтобы сохранить постоянный цветовой формат.

Потенциал использования OpenGL и сопровождающих его шейдеров довольно привлекателен:

  1. Не нужно заново изобретатьколесо (с точки зрения фактического исполнения композиции)
  2. Возможность использования графического процессора там, где он доступен.

Меня беспокоит использование OpenGL - производительность.Оглядываясь в Интернете, я понимаю, что поверхность YUV будет внутренне преобразована в RGB;Я хотел бы свести к минимуму количество преобразований формата цвета и обеспечить оптимальную производительность.Без предварительного опыта OpenGL, я надеюсь, что кто-то сможет пролить некоторый свет и предложить, если я собираюсь пойти по неверному пути.

Возможно, моя проблема с производительностью меньше связана с использованием выделенного графического процессора?Нужно ли учитывать отдельные пути кода:

  • Аппаратное обеспечение с графическим процессором (-ами)
  • Аппаратное обеспечение только с процессором (-ами)?

Кроме того, утраЯ собираюсь бороться, когда мне нужно обработать 10-битный YUV?

1 Ответ

0 голосов
/ 13 февраля 2019

Вы должны иметь возможность рассматривать YUV как независимые каналы повсюду.Шейдеры OpenGL будут называть их r, g и b, но это просто данные, которые можно обрабатывать как угодно.

Большинство графических процессоров будут поддерживать 10 бит на канал (+ 2 альфа-бита).Различный будет поддерживать 16 бит на канал для всех 4 каналов, но я немного заржавел, поэтому я понятия не имею, насколько общая поддержка для этого.Не уверен насчет данных 4: 2: 2, но вы всегда можете рассматривать их как 3 отдельные поверхности.

  • Количество графических входов будет различным;оно может (или не может) быть постоянным значением.

В этом я немного менее уверен.Такие шейдеры должны быть предсказуемыми.Если ваша реализация позволяет вам добавлять каждый вход итеративно, тогда у вас все будет в порядке.

В качестве альтернативного предложения вы рассматривали OpenCL?

...