Выделение памяти GPU для видео - PullRequest
2 голосов
/ 09 февраля 2011

Можно ли выделить немного памяти на GPU без cuda?

Я добавляю больше деталей ... мне нужно, чтобы видеокадр декодировался из VLC и иметь некоторые функции композитинга на видео; Я делаю это, используя новые возможности рендеринга SDL. Все работает нормально, пока мне не нужно отправлять декодированные данные в текстуру sdl ... эта часть кода обрабатывается стандартным malloc, который медлен для видео операций.

Сейчас я даже не уверен, что использование видео с GPU действительно поможет мне

Ответы [ 4 ]

3 голосов
/ 10 февраля 2011

Давайте проясним: вы пытаетесь выполнить обработку видео в реальном времени? Поскольку ваше последнее обновление значительно изменило проблему, я добавляю еще один ответ.

" медлительность"вы испытываете может быть из-за нескольких причин.Чтобы получить эффект « в режиме реального времени » (в смысле восприятия), вы должны иметь возможность обрабатывать кадр и отображать его в течение 33 мс (приблизительно, для видео со скоростью 30 кадров в секунду).Это означает, что вы должны декодировать фрейм, запустить на нем функции компоновки (как вы вызываете) и отобразить его на экране в течение этого промежутка времени.

Если функции компоновки слишком загружают процессор, то вы можетенаписание программы графического процессора для ускорения этой задачи.Но первое, что вы должны сделать , это точно определить узкое место вашего приложения .Вы можете на мгновение убрать ваше приложение, чтобы оно могло декодировать кадры и отображать их на экране (не выполнять функции компоновки), просто чтобы посмотреть, как оно работает.Если он медленный, то процесс декодирования может использовать слишком много ресурсов ЦП / ОЗУ (возможно, это ошибка на вашей стороне?).

Я однажды использовал FFMPEG и SDL для аналогичного проектаи я был очень доволен результатом. В этом руководстве показано, как сделать базовый видеоплеер с использованием обеих библиотек.По сути, он открывает видеофайл, декодирует кадры и отображает их на поверхности для отображения.

3 голосов
/ 09 февраля 2011

Да, это так.Вы можете выделить память в GPU с помощью текстур OpenGL.

3 голосов
/ 09 февраля 2011

Это можно сделать с помощью Direct3D 11 вычислительных шейдеров или OpenCL .По духу они похожи на CUDA.

1 голос
/ 09 февраля 2011

Только косвенно через графический фреймворк. Вы можете использовать OpenGL, который поддерживается практически на каждом компьютере.

Вы можете использовать буфер вершин для хранения ваших данных. Буферы вершин обычно используются для хранения точек для рендеринга, но вы можете легко использовать их для хранения любых массивов. В отличие от текстур, их емкость ограничена только объемом доступной графической памяти.

http://www.songho.ca/opengl/gl_vbo.html содержит хорошее руководство по чтению и записи данных в буферы вершин, вы можете игнорировать все, что касается рисования буфера вершин.

...