Передать текстуру, используя указатель на процесс - PullRequest
0 голосов
/ 01 декабря 2008

Трудно поместить это в заголовок, поэтому позвольте мне объяснить.

У меня есть приложение, которое использует Direct3D для отображения некоторого меша и DirectShow (vmr9 + allocator) для воспроизведения некоторого видео, а затем отправляет видеокадр в качестве текстуры в часть Direct3D для применения к мешу. Приложение должно работать 24/7. По крайней мере, его можно перезапускать каждые 24 часа, но не чаще, чем это.

Теперь проблема в том, что DirectShow, похоже, дает проблемы после нескольких часов воспроизведения, либо из-за кодека, видео драйвера или самого видеофайла. В этот момент приложение просто перестает воспроизводить видео. Но часть Direct3D все еще работает нормально, сетка все еще отображается. После перезапуска приложения все возвращается на круги своя.

Итак, я думаю о том, чтобы разделить 2 части на 2 разных процесса. Так что, когда процесс видео не проигрывал видео, я мог, по крайней мере, немедленно его перезапустить, не теряя часть Direct3D.

Таким образом, здесь возникает реальный вопрос, возможно ли передать текстуру из видеопроигрывателя процессу Direct3D, передав указатель, или получить текстуру другого процесса из указателя? Мое первоначальное предположение невозможно из-за защищенной адресации памяти.

У меня есть настройка связи TCP для обоих процессов, и давайте не будем беспокоиться о связи указателя на этом этапе.

Это может быть сумасшедшая идея, но она будет удивительна, когда это возможно

Ответы [ 5 ]

2 голосов
/ 29 августа 2009

Да, вы можете сделать это с Direct3D 9Ex. Это работает только с Vista, и вы должны использовать Direct3DDevice9Ex. Вы можете прочитать об использовании ресурсов здесь.

1 голос
/ 01 декабря 2008

Теперь проблема в том, что DirectShow, похоже, создает проблему после нескольких часов воспроизведения, либо из-за кодека, видео драйвера или самого видеофайла. В этот момент приложение просто перестает воспроизводить видео.

Почему бы просто не исправить эту ошибку?

0 голосов
/ 11 мая 2009

Возможно, вы могли бы использовать Sample Grabber в вашем хост-процессе DirectShow, чтобы получить образ в качестве буфера системной памяти. Затем вы можете использовать WriteProcessMemory для записи данных по заранее согласованному адресу (который вы настроили через TCP или что-то еще) в приложении Direct3D.

0 голосов
/ 01 декабря 2008

Передача текстур не работает.

Я бы сделал это, используя следующие методы:

  • Замените VMR на пользовательский рендерер + распределитель, который помещает картинку в память
  • Вы выделяете память для изображений из общего пула памяти
  • Как только вы получаете другое изображение, вы сигнализируете о событии
  • Процесс Direct3D ожидает этого события и обновляет сетку с новой текстурой

Обратите внимание, что вам нужно перенести данные изображения на видеокарту. Большая разница в том, что эта передача теперь происходит в приложении Direct3D, а не в приложении DirectShow.

Вы также можете попытаться использовать VMR для этого. Я не уверен, что пользовательские части allocator / renderer позволят вам рендериться в общую память.

0 голосов
/ 01 декабря 2008

Если вы выделите его как отдельный процесс , то я подозреваю, что это было бы невозможно, но если бы это был дочерний поток , то, я полагаю, они бы использовали адресацию в общей памяти.

...