Как эффективно рендерить и обрабатывать видеопотоки с помощью графического процессора? - PullRequest
3 голосов
/ 26 января 2009

Я планирую разработать инструмент для обработки видео в реальном времени с использованием C ++, Qt и OpenGL. Наложение видео не вариант, так как шейдеры должны использоваться для обработки кадров. На данный момент я представляю следующую последовательность шагов:

  1. Декодирование видео (ЦП)
  2. Предварительная обработка (опционально, процессор)
  3. Перенесите его в видеопамять (GPU с использованием DMA)
  4. Дальнейшая обработка с использованием вершинных и фрагментных шейдеров (GPU)
  5. Render It (GPU)

Я ищу какой-то общий совет, объясняющий, какие расширения или технические приемы можно использовать здесь. Есть ли веская причина использовать Direct3D вместо этого?

Ответы [ 5 ]

2 голосов
/ 27 января 2009

Во-первых, на ПК нет явного способа использования DMA. Драйвер может использовать его или использовать что-то еще.

В любом случае, на шаге 3 будет «изменение данных текстуры на видеокарте». В OpenGL это расширение PBO (Pixel Buffer Object) или старая функция glTexSubImage *. В D3D9 это LockRect для текстуры или другими способами (например, LockRect для царапин на текстуру, а затем в текстуру GPU). Любой из них может использовать DMA, но вы не можете быть уверены.

Тогда данные в текстуре. Вы можете отобразить его на экране с помощью некоторых шейдеров (например, выполнив преобразование YCbCr), или выполнить рендеринг в другие текстуры для более сложных эффектов обработки (например, размытие / свечение /...).

Использовать Direct3D проще в том смысле, что существуют четко определенные «бесполезные» способы работы. В OpenGL гораздо больше возможностей сделать что-нибудь, и вам нужно каким-то образом выяснить, какие из них бывают быстрыми (иногда быстрые пути различаются на разных платформах или оборудовании).

2 голосов
/ 26 января 2009

Если вы используете Linux, последние драйверы NVIDIA серии 180.xx добавили поддержку декодирования видео через API VDPAU (Video Decoding and Presentation что-то). Многие основные проекты интегрированы с API, в том числе mplayer, vlc, ffmpeg и mythtv. Я не знаю всех особенностей, но они предоставляют API для многих кодеков, включая общие подоперации и манипуляции с битовым потоком.

Я бы посмотрел здесь, прежде чем идти прямо в CUDA (который, как я полагаю, может использовать VDPAU)

1 голос
/ 27 января 2009

Для передачи данных кадра из процессора в gpu вам может понадобиться PBO s. Проверьте это также.

Кроме того, если вы все равно используете шейдеры, вы можете уменьшить нагрузку на процессор, выполнив преобразования цветового пространства в шейдерах фрагментов (от YCbCr до RGB).

Шаги "дальнейшей обработки" и "рендеринга", как правило, в значительной степени совпадают, делают крутые вещи в шейдерах и смешивают их с кадровым буфером. Если вы хотите смешивать и сочетать видео и различные эффекты, FBO s также полезны.

0 голосов
/ 02 февраля 2009

Следующие шаги должны сделать это:

  1. декодирование видео в YUV

    Обычно так делают библиотеки-декодеры.

  2. Загрузка в OpenGL в качестве текстуры

  3. конвертировать YUV в RGB

    Поскольку вы не хотите использовать оверлей, вам придется конвертировать вручную. Здесь - пример использования шейдеров.

  4. положить преобразованную текстуру на квад и рендер на экран

0 голосов
/ 26 января 2009

В качестве альтернативы вы можете взглянуть на некоторые из различных языков для выполнения программирования на GPU общего назначения (GPGPU), такие как CUDA от NVIDIA или Stream SDK от ATI. Однако, в зависимости от того, что вы выберете, вы можете ограничиться одним графическим процессором одной марки. Причиной использования этих языков будет работа на уровне абстракции, который ближе к обычному высокоуровневому программированию, чем работа с шейдерами.

У меня нет опыта в том, что вы хотите сделать, поэтому я не могу сказать, действительно ли шейдеры лучше подходят для этой работы, но это то, что вы можете рассмотреть. Надо сказать, что дизайн алгоритма все же несколько отличается от обычного кода, и для его освоения требуется некоторое усилие (я работал только с CUDA, но все они, похоже, используют похожие абстракции).

Полагаю, что если у вас есть приличный опыт работы с шейдерами, вам не стоит тратить время на изучение новой платформы.

...