2 Copyright 2004-2005 Chris Tallon
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "dsallocator.h"
24 DsAllocator::DsAllocator() {
32 DsAllocator::~DsAllocator() {
37 void DsAllocator::CleanupSurfaces() {
38 for (int i=0;i<surfaces.size();i++) {
39 if (surfaces[i]!=NULL) surfaces[i]->Release();
44 HRESULT STDMETHODCALLTYPE DsAllocator::InitializeDevice(DWORD_PTR userid,VMR9AllocationInfo* allocinf,DWORD*numbuf){
45 if (!surfallocnotify) return S_FALSE;
49 surfaces.resize(*numbuf);
50 HRESULT hres= surfallocnotify->AllocateSurfaceHelper(allocinf,numbuf,&surfaces.at(0));
55 void DsAllocator::LostDevice(IDirect3DDevice9 *d3ddev, IDirect3D9* d3d) {
56 if (!surfallocnotify) return ;
59 // d3ddev=((OsdWin*)Osd::getInstance())->getD3dDev();
60 HMONITOR hmon=d3d->GetAdapterMonitor(D3DADAPTER_DEFAULT);
61 surfallocnotify->ChangeD3DDevice(d3ddev,hmon);
66 HRESULT STDMETHODCALLTYPE DsAllocator::TerminateDevice(DWORD_PTR userid){
70 return S_OK; //Do nothing
72 HRESULT STDMETHODCALLTYPE DsAllocator::GetSurface(DWORD_PTR userid,DWORD surfindex,DWORD surfflags, IDirect3DSurface9** surf)
74 if (surfindex>=surfaces.size()) return E_FAIL;
75 if (surf==NULL) return E_POINTER;
78 surfaces[surfindex]->AddRef();
79 *surf=surfaces[surfindex];
83 HRESULT STDMETHODCALLTYPE DsAllocator::AdviseNotify(IVMRSurfaceAllocatorNotify9* allnoty){
85 surfallocnotify=allnoty;
86 IDirect3DDevice9 *d3ddev;
87 //OK lets set the direct3d object from the osd
88 d3ddev=((OsdWin*)Osd::getInstance())->getD3dDev();
89 HMONITOR hmon=((OsdWin*)Osd::getInstance())->getD3d()->GetAdapterMonitor(D3DADAPTER_DEFAULT);
90 HRESULT hres=surfallocnotify->SetD3DDevice(d3ddev,hmon);
96 HRESULT STDMETHODCALLTYPE DsAllocator::StartPresenting(DWORD_PTR userid){
97 ((OsdWin*)Osd::getInstance())->setExternalDriving(this);
100 HRESULT STDMETHODCALLTYPE DsAllocator::StopPresenting(DWORD_PTR userid){
101 ((OsdWin*)Osd::getInstance())->setExternalDriving(NULL);
105 HRESULT STDMETHODCALLTYPE DsAllocator::PresentImage(DWORD_PTR userid,VMR9PresentationInfo* presinf){
106 ((OsdWin*)Osd::getInstance())->RenderDS(presinf->lpSurf); //render and return
111 HRESULT STDMETHODCALLTYPE DsAllocator::QueryInterface(REFIID refiid,void ** obj){
112 if (obj==NULL) return E_POINTER;
114 if (refiid==IID_IVMRSurfaceAllocator9) {
115 *obj=static_cast<IVMRSurfaceAllocator9*>(this);
118 } else if (refiid==IID_IVMRImagePresenter9) {
119 *obj=static_cast<IVMRImagePresenter9*>(this);
123 return E_NOINTERFACE;
126 ULONG STDMETHODCALLTYPE DsAllocator::AddRef(){
127 return InterlockedIncrement(&refcount);
130 ULONG STDMETHODCALLTYPE DsAllocator::Release(){
132 ref=InterlockedDecrement(&refcount);
134 delete this; //Commit suicide