filterConfig->SetNumberOfStreams(1);
Нет, с этим проблем нету.
Если ставлю 1, то VMR переходит в Non-mixing mode и далее по его ещё нужно снабжать преференсами для режима смешивания.
Тут всё понятно.
----
Разобрался, почем проц 100%.
Всё дело в том, что у меня было два девайса Direct3DDecive9, один предлагал свои услуги VMR'у, а второй, собственно, рендерил на экран.
И второй, при наличии новых кадров, забирал себе кадр у первого девайса.
А всем же известно, что разные девайсы в соответствии с недоработками майкрософта не могут ничем между собой обмениваться.
То поэтому я юзал DXLoadSurfaceFromSurface, которая сначала танят память из видяхи в ОЗУ, потом обратно из ОЗУ в видяху, только в объект второго сурфейса, второго девайса.
Тупо да, копировать из видяхи в ОЗУ, а потом гнать обратно?
Собственно тут и был тормоз, на копировании из видяхи, в сторону видяхи скорость нормальная. (иначе они бы вообще никому не были нужны)
Была мысля создавать у первого девайса текстуру в D3DPOOL_SYSTEM, но VMR тупо выплёвывает такую текстуру, не зависимо в каком режиме он запущен.
Выплёвывает и всё, "не поддерживается, иди лесом."
Хотя я так бы смог уйти от лишних копирований и, что боле важно, от копирования памяти из видяхи.
Решил вопрос переходом на DirectX9Ex, где начал поддерживаться принцип шаринга ресурсов между девайсами.
(Само собой, ограничение на >=Vista)
(И сразу маленький ФАК:
Вопрос: "А нахрена тебе многопоточный рендеринг, клепай в один поток?"
Ответ : "Не катит, ибо тогда рендеринг общей сцены будет привязываться именно в fps видео. Это уже не говоря, если ты захочешь не одно видео на сцене. о_О Вот это да!"
Вопрос: "Тебе не надо больше одного видео, и fps 24 должно хватить, нэ?"
Ответ: "Нэ, сам знаю, что мне надо.")
---
Additional fun:
Хочу сделать буферизацию кадров, чтобы когда прошёл новый кадр, то поток видео-рендера не ждал забора его потока общего рендера, а снабжал VMR сурфейсом под новый кадр, чтобы тот уже начинал рисовать новый кадр.
Стандартная хотелка такая.
Так вот, у VMR'а есть поля для указания таких параметров, и заказа буффера сурфейсов нужного размера.
Но вот беда, ему абсолютно наплевать на эти переметры, тупо просит постоянно 1-й сурфейс.
Проинициализировал, к примеру, буффер из 3-х сурфейсов.
Дал ему первый, он его вырисовал.
Ты отдал его потоку2. VMR просит
Ты ему говоришь "Нет, он занят, приходи ещё"
Он снова ломится и снова просит сурфейс1.
И так пока не допросится.
Немёк на встроенную поддержку SurfacesChain есть, но ничерта не пашет. (Недоработка?)
Придётся писать свой chain или юзать EVR (привет, вин7!)
А если и в вин7 будет куча ограничений, то что?
И вообще, зачем интерфейсы DirectX при переходе с 9 на 10 так переколбасили?