VMR9 renderless panic
От: Аноним  
Дата: 06.06.11 21:54
Оценка:
Проблема:

Есть VMR9 в графе.
Если он не в Renderless mode, то всё ок.
Если он на win7, то всё ок.
Если он на XP, то проц грузит на 100%.
Комп неслабый, все плеера нормально отображают и БД на 1080р с загрузкой проца не более 60%.
Тут тебе на 100% загрузки проца, 50% потерянные кадры в VMR9, и это только на 720р...

Замечу, что НЕ Renderless работает нормально в GraphEdit.

Привожу примеры из кода кастомного презентатора-алокатора:


//чёткий метод презентации, да? 100% проца)
HRESULT STDMETHODCALLTYPE c_Texture_VMR9::PresentImage(DWORD_PTR dwUserID, VMR9PresentationInfo *lpPresInfo)
{
return S_OK;
}

//стандартная инициализации, ничего особенного, вроде как
HRESULT STDMETHODCALLTYPE c_Texture_VMR9::InitializeDevice(DWORD_PTR dwUserID, VMR9AllocationInfo *lpAllocInfo, DWORD *lpNumBuffers)
{
    m_pSurfaceWork = NULL;
    HRESULT Result = E_FAIL;
    if(lpNumBuffers == NULL)
        return E_POINTER;
    if(!mpVMRSurfaceAllocatorNotify || !m_pDirect3D || !mpDevice)
        return E_NOINTERFACE;

    Width = lpAllocInfo->dwWidth;
    Height = lpAllocInfo->dwHeight;
    if (d3dCaps.TextureCaps & D3DPTEXTURECAPS_POW2)
    {
        lpAllocInfo->dwWidth = 1;
        lpAllocInfo->dwHeight = 1;
        while(lpAllocInfo->dwWidth < Width )
            lpAllocInfo->dwWidth = lpAllocInfo->dwWidth << 1;
        while(lpAllocInfo->dwHeight < Height)
            lpAllocInfo->dwHeight = lpAllocInfo->dwHeight << 1;
    };
        //Тут я баловался и так и сяк- не выходит никак.
    //lpAllocInfo->Pool = D3DPOOL_DEFAULT;
    //lpAllocInfo->dwFlags = VMR9AllocFlag_OffscreenSurface;
    //lpAllocInfo->dwFlags |= VMR9AllocFlag_TextureSurface;
    
    //lpAllocInfo->Format = d3ddm.Format;
    UINT i;
    for (i = 0; i < mSurfaces.size(); ++i)
    {
        if (mSurfaces[i] != NULL)
        {
            mSurfaces[i]->Release();
            mSurfaces[i] = NULL;
        };
    };
    mSurfaces.resize(*lpNumBuffers);
    for (i = 0; i < mSurfaces.size(); ++i)
    {
        mSurfaces[i] = NULL;
    };
    Result = mpVMRSurfaceAllocatorNotify->AllocateSurfaceHelper(lpAllocInfo, lpNumBuffers, &(mSurfaces[0]));
    texWidth  = lpAllocInfo->dwWidth;
    texHeight = lpAllocInfo->dwHeight;

    return Result;
}

Замечу ещё, что пример из пакета "DX Extras" DX Extras 2004\Extras\DirectShow\Samples\C++\DirectShow\VMR9\VMR9Allocator\ без всяких моих вмешательств грузит проц на 100% всё равно.

Повторюсь, комп нормальный (НЕ Renderless — ок), тестировалось не на одной машине В итоге XP, Vista — проц 100%.
Всеми возможными путями было установлено, что это именно VMR9 Renderless грузит, от того и кадры пропускает.
Это какой-то полный бред...
Есть ли у кого какие мысли?
Мб, кто уже заводил VMR9 в Renderless?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.