quartz: Add Video Mixing Renderer 7.
This commit is contained in:
parent
bc59206e0e
commit
f9cccaa3de
|
@ -75,6 +75,7 @@ static const struct object_creation_info object_creation[] =
|
||||||
{ &CLSID_MPEG1Splitter, MPEGSplitter_create },
|
{ &CLSID_MPEG1Splitter, MPEGSplitter_create },
|
||||||
{ &CLSID_VideoRenderer, VideoRenderer_create },
|
{ &CLSID_VideoRenderer, VideoRenderer_create },
|
||||||
{ &CLSID_NullRenderer, NullRenderer_create },
|
{ &CLSID_NullRenderer, NullRenderer_create },
|
||||||
|
{ &CLSID_VideoMixingRenderer, VMR7Impl_create },
|
||||||
{ &CLSID_VideoMixingRenderer9, VMR9Impl_create },
|
{ &CLSID_VideoMixingRenderer9, VMR9Impl_create },
|
||||||
{ &CLSID_VideoRendererDefault, VideoRendererDefault_create },
|
{ &CLSID_VideoRendererDefault, VideoRendererDefault_create },
|
||||||
{ &CLSID_DSoundRender, DSoundRender_create },
|
{ &CLSID_DSoundRender, DSoundRender_create },
|
||||||
|
|
|
@ -54,6 +54,7 @@ HRESULT VideoRendererDefault_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC
|
||||||
HRESULT QUARTZ_CreateSystemClock(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN;
|
HRESULT QUARTZ_CreateSystemClock(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN;
|
||||||
HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN;
|
HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN;
|
||||||
HRESULT WAVEParser_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN;
|
HRESULT WAVEParser_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN;
|
||||||
|
HRESULT VMR7Impl_create(IUnknown *pUnkOuter, LPVOID *ppv) DECLSPEC_HIDDEN;
|
||||||
HRESULT VMR9Impl_create(IUnknown *pUnkOuter, LPVOID *ppv) DECLSPEC_HIDDEN;
|
HRESULT VMR9Impl_create(IUnknown *pUnkOuter, LPVOID *ppv) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
HRESULT EnumMonikerImpl_Create(IMoniker ** ppMoniker, ULONG nMonikerCount, IEnumMoniker ** ppEnum) DECLSPEC_HIDDEN;
|
HRESULT EnumMonikerImpl_Create(IMoniker ** ppMoniker, ULONG nMonikerCount, IEnumMoniker ** ppEnum) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -154,6 +154,13 @@ coclass ACMWrapper { interface IBaseFilter; }
|
||||||
]
|
]
|
||||||
coclass WAVEParser { interface IBaseFilter; }
|
coclass WAVEParser { interface IBaseFilter; }
|
||||||
|
|
||||||
|
[
|
||||||
|
helpstring("Video Mixing Renderer"),
|
||||||
|
threading(both),
|
||||||
|
uuid(b87beb7b-8d29-423f-ae4d-6582c10175ac)
|
||||||
|
]
|
||||||
|
coclass VideoMixingRenderer { interface IBaseFilter; }
|
||||||
|
|
||||||
[
|
[
|
||||||
helpstring("Video Mixing Renderer 9"),
|
helpstring("Video Mixing Renderer 9"),
|
||||||
threading(both),
|
threading(both),
|
||||||
|
|
|
@ -952,6 +952,18 @@ static struct regsvr_filter const filter_list[] = {
|
||||||
{ 0xFFFFFFFF },
|
{ 0xFFFFFFFF },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{ &CLSID_VideoMixingRenderer,
|
||||||
|
&CLSID_LegacyAmFilterCategory,
|
||||||
|
{'V','i','d','e','o',' ','M','i','x','i','n','g',' ','R','e','n','d','e','r','e','r',0},
|
||||||
|
0x200000,
|
||||||
|
{ { REG_PINFLAG_B_RENDERER,
|
||||||
|
{ { &MEDIATYPE_Video, &GUID_NULL },
|
||||||
|
{ NULL }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ 0xFFFFFFFF },
|
||||||
|
}
|
||||||
|
},
|
||||||
{ &CLSID_VideoMixingRenderer9,
|
{ &CLSID_VideoMixingRenderer9,
|
||||||
&CLSID_LegacyAmFilterCategory,
|
&CLSID_LegacyAmFilterCategory,
|
||||||
{'V','i','d','e','o',' ','M','i','x','i','n','g',' ','R','e','n','d','e','r','e','r',' ','9',0},
|
{'V','i','d','e','o',' ','M','i','x','i','n','g',' ','R','e','n','d','e','r','e','r',' ','9',0},
|
||||||
|
|
|
@ -880,7 +880,7 @@ static ULONG WINAPI VMR9_Release(IBaseFilter * iface)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const IBaseFilterVtbl VMR9_Vtbl =
|
static const IBaseFilterVtbl VMR_Vtbl =
|
||||||
{
|
{
|
||||||
VMR9_QueryInterface,
|
VMR9_QueryInterface,
|
||||||
VMR9_AddRef,
|
VMR9_AddRef,
|
||||||
|
@ -1581,67 +1581,86 @@ static const IVMRSurfaceAllocatorNotify9Vtbl IVMRSurfaceAllocatorNotify9_Vtbl =
|
||||||
VMR9SurfaceAllocatorNotify_NotifyEvent
|
VMR9SurfaceAllocatorNotify_NotifyEvent
|
||||||
};
|
};
|
||||||
|
|
||||||
HRESULT VMR9Impl_create(IUnknown * outer_unk, LPVOID * ppv)
|
static HRESULT vmr_create(IUnknown *outer_unk, LPVOID *ppv, const CLSID *clsid)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
struct quartz_vmr* pVMR9;
|
struct quartz_vmr* pVMR;
|
||||||
|
|
||||||
TRACE("(%p, %p)\n", outer_unk, ppv);
|
TRACE("(%p, %p)\n", outer_unk, ppv);
|
||||||
|
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
|
|
||||||
pVMR9 = CoTaskMemAlloc(sizeof(struct quartz_vmr));
|
pVMR = CoTaskMemAlloc(sizeof(struct quartz_vmr));
|
||||||
|
|
||||||
pVMR9->hD3d9 = LoadLibraryA("d3d9.dll");
|
pVMR->hD3d9 = LoadLibraryA("d3d9.dll");
|
||||||
if (!pVMR9->hD3d9 )
|
if (!pVMR->hD3d9 )
|
||||||
{
|
{
|
||||||
WARN("Could not load d3d9.dll\n");
|
WARN("Could not load d3d9.dll\n");
|
||||||
CoTaskMemFree(pVMR9);
|
CoTaskMemFree(pVMR);
|
||||||
return VFW_E_DDRAW_CAPS_NOT_SUITABLE;
|
return VFW_E_DDRAW_CAPS_NOT_SUITABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
pVMR9->outer_unk = outer_unk;
|
pVMR->outer_unk = outer_unk;
|
||||||
pVMR9->bUnkOuterValid = FALSE;
|
pVMR->bUnkOuterValid = FALSE;
|
||||||
pVMR9->bAggregatable = FALSE;
|
pVMR->bAggregatable = FALSE;
|
||||||
pVMR9->IUnknown_inner.lpVtbl = &IInner_VTable;
|
pVMR->IUnknown_inner.lpVtbl = &IInner_VTable;
|
||||||
pVMR9->IAMFilterMiscFlags_iface.lpVtbl = &IAMFilterMiscFlags_Vtbl;
|
pVMR->IAMFilterMiscFlags_iface.lpVtbl = &IAMFilterMiscFlags_Vtbl;
|
||||||
|
|
||||||
pVMR9->mode = 0;
|
pVMR->mode = 0;
|
||||||
pVMR9->allocator_d3d9_dev = NULL;
|
pVMR->allocator_d3d9_dev = NULL;
|
||||||
pVMR9->allocator_mon= NULL;
|
pVMR->allocator_mon= NULL;
|
||||||
pVMR9->num_surfaces = pVMR9->cur_surface = 0;
|
pVMR->num_surfaces = pVMR->cur_surface = 0;
|
||||||
pVMR9->allocator = NULL;
|
pVMR->allocator = NULL;
|
||||||
pVMR9->presenter = NULL;
|
pVMR->presenter = NULL;
|
||||||
pVMR9->hWndClippingWindow = NULL;
|
pVMR->hWndClippingWindow = NULL;
|
||||||
pVMR9->IVMRFilterConfig9_iface.lpVtbl = &VMR9_FilterConfig_Vtbl;
|
pVMR->IVMRFilterConfig9_iface.lpVtbl = &VMR9_FilterConfig_Vtbl;
|
||||||
pVMR9->IVMRWindowlessControl9_iface.lpVtbl = &VMR9_WindowlessControl_Vtbl;
|
pVMR->IVMRWindowlessControl9_iface.lpVtbl = &VMR9_WindowlessControl_Vtbl;
|
||||||
pVMR9->IVMRSurfaceAllocatorNotify9_iface.lpVtbl = &IVMRSurfaceAllocatorNotify9_Vtbl;
|
pVMR->IVMRSurfaceAllocatorNotify9_iface.lpVtbl = &IVMRSurfaceAllocatorNotify9_Vtbl;
|
||||||
|
|
||||||
|
if (IsEqualGUID(clsid, &CLSID_VideoMixingRenderer))
|
||||||
|
hr = BaseRenderer_Init(&pVMR->renderer, &VMR_Vtbl, outer_unk, &CLSID_VideoMixingRenderer,
|
||||||
|
(DWORD_PTR)(__FILE__ ": VMR7Impl.csFilter"), &BaseFuncTable);
|
||||||
|
else
|
||||||
|
hr = BaseRenderer_Init(&pVMR->renderer, &VMR_Vtbl, outer_unk, &CLSID_VideoMixingRenderer9,
|
||||||
|
(DWORD_PTR)(__FILE__ ": VMR9Impl.csFilter"), &BaseFuncTable);
|
||||||
|
|
||||||
hr = BaseRenderer_Init(&pVMR9->renderer, &VMR9_Vtbl, outer_unk, &CLSID_VideoMixingRenderer9, (DWORD_PTR)(__FILE__ ": VMR9Impl.csFilter"), &BaseFuncTable);
|
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
hr = BaseControlWindow_Init(&pVMR9->baseControlWindow, &IVideoWindow_VTable, &pVMR9->renderer.filter, &pVMR9->renderer.filter.csFilter, &pVMR9->renderer.pInputPin->pin, &renderer_BaseWindowFuncTable);
|
hr = BaseControlWindow_Init(&pVMR->baseControlWindow, &IVideoWindow_VTable, &pVMR->renderer.filter,
|
||||||
|
&pVMR->renderer.filter.csFilter, &pVMR->renderer.pInputPin->pin,
|
||||||
|
&renderer_BaseWindowFuncTable);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
hr = BaseControlVideo_Init(&pVMR9->baseControlVideo, &IBasicVideo_VTable, &pVMR9->renderer.filter, &pVMR9->renderer.filter.csFilter, &pVMR9->renderer.pInputPin->pin, &renderer_BaseControlVideoFuncTable);
|
hr = BaseControlVideo_Init(&pVMR->baseControlVideo, &IBasicVideo_VTable, &pVMR->renderer.filter,
|
||||||
|
&pVMR->renderer.filter.csFilter, &pVMR->renderer.pInputPin->pin,
|
||||||
|
&renderer_BaseControlVideoFuncTable);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
*ppv = (LPVOID)pVMR9;
|
*ppv = (LPVOID)pVMR;
|
||||||
ZeroMemory(&pVMR9->source_rect, sizeof(RECT));
|
ZeroMemory(&pVMR->source_rect, sizeof(RECT));
|
||||||
ZeroMemory(&pVMR9->target_rect, sizeof(RECT));
|
ZeroMemory(&pVMR->target_rect, sizeof(RECT));
|
||||||
TRACE("Created at %p\n", pVMR9);
|
TRACE("Created at %p\n", pVMR);
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
BaseRendererImpl_Release(&pVMR9->renderer.filter.IBaseFilter_iface);
|
BaseRendererImpl_Release(&pVMR->renderer.filter.IBaseFilter_iface);
|
||||||
CloseHandle(pVMR9->hD3d9);
|
CloseHandle(pVMR->hD3d9);
|
||||||
CoTaskMemFree(pVMR9);
|
CoTaskMemFree(pVMR);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT VMR7Impl_create(IUnknown *outer_unk, LPVOID *ppv)
|
||||||
|
{
|
||||||
|
return vmr_create(outer_unk, ppv, &CLSID_VideoMixingRenderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT VMR9Impl_create(IUnknown *outer_unk, LPVOID *ppv)
|
||||||
|
{
|
||||||
|
return vmr_create(outer_unk, ppv, &CLSID_VideoMixingRenderer9);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static HRESULT WINAPI VMR9_ImagePresenter_QueryInterface(IVMRImagePresenter9 *iface, REFIID riid, LPVOID * ppv)
|
static HRESULT WINAPI VMR9_ImagePresenter_QueryInterface(IVMRImagePresenter9 *iface, REFIID riid, LPVOID * ppv)
|
||||||
|
|
|
@ -275,6 +275,7 @@ OUR_GUID_ENTRY(CLSID_VideoProcAmpPropertyPage, 0x71f96464, 0x78f3, 0x11d0,
|
||||||
OUR_GUID_ENTRY(CLSID_CameraControlPropertyPage, 0x71f96465, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56)
|
OUR_GUID_ENTRY(CLSID_CameraControlPropertyPage, 0x71f96465, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56)
|
||||||
OUR_GUID_ENTRY(CLSID_AnalogVideoDecoderPropertyPage, 0x71f96466, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56)
|
OUR_GUID_ENTRY(CLSID_AnalogVideoDecoderPropertyPage, 0x71f96466, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56)
|
||||||
OUR_GUID_ENTRY(CLSID_VideoStreamConfigPropertyPage, 0x71f96467, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56)
|
OUR_GUID_ENTRY(CLSID_VideoStreamConfigPropertyPage, 0x71f96467, 0x78f3, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56)
|
||||||
|
OUR_GUID_ENTRY(CLSID_VideoMixingRenderer, 0xb87beb7b, 0x8d29, 0x423f, 0xae, 0x4d, 0x65, 0x82, 0xc1, 0x01, 0x75, 0xac)
|
||||||
OUR_GUID_ENTRY(CLSID_VideoMixingRenderer9, 0x51b4abf3, 0x748f, 0x4e3b, 0xa2, 0x76, 0xc8, 0x28, 0x33, 0x0e, 0x92, 0x6a)
|
OUR_GUID_ENTRY(CLSID_VideoMixingRenderer9, 0x51b4abf3, 0x748f, 0x4e3b, 0xa2, 0x76, 0xc8, 0x28, 0x33, 0x0e, 0x92, 0x6a)
|
||||||
|
|
||||||
#undef OUR_GUID_ENTRY
|
#undef OUR_GUID_ENTRY
|
||||||
|
|
Loading…
Reference in New Issue