среда, 5 декабря 2007 г.

DirectShow & D3DERR_OUTOFVIDEOMEMORY solution

I've wrote recently about the error D3DERR_OUTOFVIDEOMEMORY which you can reproduce by creating/destroying VMR9 instance in the Windowless mode X times (X depends of yours video card memory amount).

With the help of the DirectX9 debug binaries I have found that the memory leak takes place in case of switching VMR9 in the Windowsless mode. I've found that the DirectX9 surface which is created on that step will never be destroyed.

Seem to be the solution is to use DirectX9 Nov2007. No more leaks and works fine.

5 комментариев:

  1. Hello. This is very nice post. Thanks. Because I had problem with memory leaks when I used VMR9 in Windowless mode. I saw that memory leaks happens when I play DVD files with extension VOB too. I build DirectShow Graph as in examples of DirectX SDK, for all types of media files. Do you know where may be problem?

    ОтветитьУдалить
  2. As I wrote in my post the problem was in VMR9 implementation. It was buggy in DirectX SDK before Noveber, 2007. I haven't meet memory leaks using latest DirectX SDK.

    VMR9 implementation creates number of DirectX objects such as DX surface, DX fonts etc. And seems to be never destroys them later.

    Using what version of DX9SDK did you had problem with memory leaks?

    ОтветитьУдалить
  3. Я использую DirectX SDK Февраль 2007. Но я установил DirectX 9.0 Redist Март 2008. Как я понял дело именно в версии DirectX SDK ? Сейчас качаю DirectX SDK Март 2008. Надеюсь, что это поможет. Просто дело в том, что не в каждом DirectX SDK есть DirectShow.

    ОтветитьУдалить
  4. С какого-то момента DirectShow переместили в PlatformSDK из DirectX SDK. Трудно сказать начиная с какой именно версии ошибка была исправлена.

    Я не исследовал этот вопрос после того как ошибка перестала проявлятся, но мне кажется, что дело именно в версии SDK.

    В конце концов я полностью отказался от DirectShow(чего и Вам желаю), т.к. крайне трудно обрабатывать ошибки из-за того, что там используются свои потоки.

    На данный момент мое решение - декодирование через VfW и рендеринг в DirectX с использование динамических текстур. Этот вариант гораздо более гибкий в плане обработки ошибок сторонних кодеков и управления памятью, хотя и более сложен в плане кодирования. Фактически - это уход с более высокого уровня абстракции вниз.

    ОтветитьУдалить
  5. Спасибо за совет.
    В общем DirectShow сейчас перекочевала в Windows SDK. Использую его оттуда. Запустил тест. Завтра будет видно что к чему. Мне только одно интересно. Если к примеру создать граф запустить его, остановить, а потом высвободить полностью, то память используемая программой увеличивается. Причём это происходит и в примерах из DirectShow.
    Не знаете ли вы с чем это связано?

    ОтветитьУдалить