ГПУ ЮВ в РГБ. Стоит усилий? - PullRequest
2 голосов
/ 26 марта 2010

Мне нужно конвертировать несколько полных видео PAL (720x576 @ 25) из формата YUV 4: 2: 2 в RGB в режиме реального времени, и, возможно, для каждого из них необходимо изменить размер. Я думал об использовании графического процессора, так как я видел некоторый пример, который делает именно это (за исключением того, что это 4: 4: 4, поэтому bpp одинаков по источнику и назначению) - http://www.fourcc.org/source/YUV420P-OpenGL-GLSLang.c

Однако у меня нет опыта использования графических процессоров, и я не уверен, что можно сделать. Пример, насколько я понимаю, просто конвертирует видеокадр в YUV и отображает его на экране.

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

Будучи немного зависимым от платформы, предполагая, что я работаю с окнами, возможно ли получить поверхность OpenGL или DirectDraw из окна, чтобы графический процессор мог рисовать непосредственно к ней?

Ответы [ 2 ]

2 голосов
/ 30 марта 2010

Я на самом деле запрограммировал это для CUDA в C, и pthreads один в C. (только для забавы, учтите.) И я обнаружил, что GPU работает так быстро, что вы тратите 50-80% своего времени отправка данных туда и обратно, даже если вы каждый раз полностью заполняете память графического процессора. Из-за этого процессор делал эту работу почти так же быстро, как мог графический процессор. Эта проблема чрезвычайно дружественна к потокам, как вы уже поняли, поэтому при использовании современного оборудования пропускная способность памяти является самой большой проблемой.

Я протестировал это с Core i7 в качестве процессора и GeForce 8800GT / GTX 285 в качестве видеокарты. GTX285 обрабатывал видео со скоростью 1500 кадров в секунду с разрешением 1920x1080, поэтому независимо от того, что вы выберете, все будет невероятно быстро.

2 голосов
/ 30 марта 2010

Реальный вопрос в том, что вы надеетесь получить от этого?

При частоте кадров, которую вы принимаете, вы можете использовать что-то вроде Intel Performance Primitives для выполнения пары операций, которые вам нужны, и легко поддерживать поток.

Если вы хотите научиться программировать на GPU, это хорошая простая задача, которую вы можете реализовать.

Возможно получить обработанный кадр, выполнив обратную передачу из GPU в память. Фактическая механика зависит от того, какой API вы используете (OpenGL, DirectX, CUDA, OpenCL). Я сделал это с намного большим разрешением видео и все еще не отставал от потока 25fps. Однако все это зависит от оборудования, которое вы будете использовать.

DirectX и OpenGL имеют отличные руководства по использованию поверхностей Windows в качестве целей рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...