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() {
25 CAutoLock locked(&objCritSec);
33 DsAllocator::~DsAllocator() {
34 CAutoLock locked(&objCritSec);
39 void DsAllocator::CleanupSurfaces() {
40 for (int i=0;i<surfaces.size();i++) {
41 if (surfaces[i]!=NULL) surfaces[i]->Release();
46 HRESULT STDMETHODCALLTYPE DsAllocator::InitializeDevice(DWORD_PTR userid,VMR9AllocationInfo* allocinf,DWORD*numbuf){
47 CAutoLock locked(&objCritSec);
48 if (!surfallocnotify) return S_FALSE;
51 surfaces.resize(*numbuf);
52 return surfallocnotify->AllocateSurfaceHelper(allocinf,numbuf,&surfaces.at(0));
55 void DsAllocator::LostDevice() {
56 CAutoLock locked(&objCritSec);
57 if (!surfallocnotify) return ;
59 IDirect3DDevice9 *d3ddev;
60 d3ddev=((OsdWin*)Osd::getInstance())->getD3dDev();
61 HMONITOR hmon=((OsdWin*)Osd::getInstance())->getD3d()->GetAdapterMonitor(D3DADAPTER_DEFAULT);
62 surfallocnotify->ChangeD3DDevice(d3ddev,hmon);
66 HRESULT STDMETHODCALLTYPE DsAllocator::TerminateDevice(DWORD_PTR userid){
67 CAutoLock locked(&objCritSec);
69 return S_OK; //Do nothing
71 HRESULT STDMETHODCALLTYPE DsAllocator::GetSurface(DWORD_PTR userid,DWORD surfindex,DWORD surfflags, IDirect3DSurface9** surf)
73 if (surfindex>=surfaces.size()) return E_FAIL;
74 if (surf==NULL) return E_POINTER;
76 CAutoLock locked(&objCritSec);
77 surfaces[surfindex]->AddRef();
78 *surf=surfaces[surfindex];
81 HRESULT STDMETHODCALLTYPE DsAllocator::AdviseNotify(IVMRSurfaceAllocatorNotify9* allnoty){
82 CAutoLock locked(&objCritSec);
83 surfallocnotify=allnoty;
84 IDirect3DDevice9 *d3ddev;
85 //OK lets set the direct3d object from the osd
86 d3ddev=((OsdWin*)Osd::getInstance())->getD3dDev();
87 HMONITOR hmon=((OsdWin*)Osd::getInstance())->getD3d()->GetAdapterMonitor(D3DADAPTER_DEFAULT);
88 return surfallocnotify->SetD3DDevice(d3ddev,hmon);
92 HRESULT STDMETHODCALLTYPE DsAllocator::StartPresenting(DWORD_PTR userid){
93 ((OsdWin*)Osd::getInstance())->setExternalDriving(this);
96 HRESULT STDMETHODCALLTYPE DsAllocator::StopPresenting(DWORD_PTR userid){
97 ((OsdWin*)Osd::getInstance())->setExternalDriving(NULL);
101 HRESULT STDMETHODCALLTYPE DsAllocator::PresentImage(DWORD_PTR userid,VMR9PresentationInfo* presinf){
102 ((OsdWin*)Osd::getInstance())->RenderDS(presinf->lpSurf); //render and return
107 HRESULT STDMETHODCALLTYPE DsAllocator::QueryInterface(REFIID refiid,void ** obj){
\r
108 if (obj==NULL) return E_POINTER;
\r
110 if (refiid==IID_IVMRSurfaceAllocator9) {
\r
111 *obj=static_cast<IVMRSurfaceAllocator9*>(this);
\r
114 } else if (refiid==IID_IVMRImagePresenter9) {
\r
115 *obj=static_cast<IVMRImagePresenter9*>(this);
\r
119 return E_NOINTERFACE;
\r
122 ULONG STDMETHODCALLTYPE DsAllocator::AddRef(){
\r
123 return InterlockedIncrement(&refcount);
\r
126 ULONG STDMETHODCALLTYPE DsAllocator::Release(){
128 ref=InterlockedDecrement(&refcount);
130 delete this; //Commit suicide