annotate loader/dshow/allocator.c @ 1716:b8b17db5e3cc

*** empty log message ***
author gabucino
date Mon, 27 Aug 2001 16:46:09 +0000
parents da26060c81ef
children ce45cce7f7a5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
1 #include "allocator.h"
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
2 #include <com.h>
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
3 #include <wine/winerror.h>
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
4 #include <stdio.h>
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
5
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
6 //#undef Debug
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
7 //#define Debug
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
8
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 168
diff changeset
9 using namespace std;
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 168
diff changeset
10
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
11 class AllocatorKeeper
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
12 {
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
13 public:
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
14 AllocatorKeeper()
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
15 {
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
16 RegisterComClass(&CLSID_MemoryAllocator, MemAllocator::CreateAllocator);
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
17 }
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
18 ~AllocatorKeeper()
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
19 {
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
20 UnregisterComClass(&CLSID_MemoryAllocator, MemAllocator::CreateAllocator);
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
21 }
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
22 };
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
23 static AllocatorKeeper keeper;
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
24
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
25
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
26 GUID MemAllocator::interfaces[]=
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
27 {
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
28 IID_IUnknown,
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
29 IID_IMemAllocator,
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
30 };
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
31
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
32 IMPLEMENT_IUNKNOWN(MemAllocator)
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
33
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
34 long MemAllocator::CreateAllocator(GUID* clsid, GUID* iid, void** ppv)
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
35 {
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
36 if(!ppv)return -1;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
37 *ppv=0;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
38 if(memcmp(clsid, &CLSID_MemoryAllocator, sizeof(GUID)))
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
39 return -1;
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
40
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
41 IMemAllocator* p=new MemAllocator;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
42 int result=p->vt->QueryInterface((IUnknown*)p, iid, ppv);
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
43 p->vt->Release((IUnknown*)p);
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
44 return result;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
45 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
46
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
47
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
48 static HRESULT STDCALL MemAllocator_SetProperties(IMemAllocator * This,
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
49 /* [in] */ ALLOCATOR_PROPERTIES *pRequest,
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
50 /* [out] */ ALLOCATOR_PROPERTIES *pActual)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
51 {
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
52 Debug printf("MemAllocator_SetProperties() called\n");
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
53 if (!pRequest || !pActual)
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
54 return E_INVALIDARG;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
55 if (pRequest->cBuffers<=0 || pRequest->cbBuffer<=0)
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
56 return E_FAIL;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
57 MemAllocator* me = (MemAllocator*)This;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
58 if (me->used_list.size() || me->free_list.size())
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
59 return E_FAIL;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
60 me->props = *pRequest;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
61 *pActual = *pRequest;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
62 return 0;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
63 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
64
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
65 static HRESULT STDCALL MemAllocator_GetProperties(IMemAllocator * This,
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
66 /* [out] */ ALLOCATOR_PROPERTIES *pProps)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
67 {
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
68 Debug printf("MemAllocator_GetProperties(%p) called\n", This);
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
69 if (!pProps)
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
70 return E_INVALIDARG;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
71 if (((MemAllocator*)This)->props.cbBuffer<0)
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
72 return E_FAIL;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
73 *pProps=((MemAllocator*)This)->props;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
74 return 0;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
75 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
76
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
77 static HRESULT STDCALL MemAllocator_Commit(IMemAllocator * This)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
78 {
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
79 Debug printf("MemAllocator_Commit(%p) called\n", This);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
80 MemAllocator* me=(MemAllocator*)This;
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
81 if (((MemAllocator*)This)->props.cbBuffer < 0)
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
82 return E_FAIL;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
83 if (me->used_list.size() || me->free_list.size())
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
84 return E_INVALIDARG;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
85 for(int i = 0; i<me->props.cBuffers; i++)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
86 me->free_list.push_back(new CMediaSample(me, me->props.cbBuffer));
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
87
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
88 return 0;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
89 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
90
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
91 static HRESULT STDCALL MemAllocator_Decommit(IMemAllocator * This)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
92 {
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
93 Debug printf("MemAllocator_Decommit(%p) called\n", This);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
94 MemAllocator* me=(MemAllocator*)This;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
95 list<CMediaSample*>::iterator it;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
96 for(it=me->free_list.begin(); it!=me->free_list.end(); it++)
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
97 delete *it;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
98 for(it=me->used_list.begin(); it!=me->used_list.end(); it++)
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
99 delete *it;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
100 me->free_list.clear();
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
101 me->used_list.clear();
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
102 return 0;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
103 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
104
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
105 static HRESULT STDCALL MemAllocator_GetBuffer(IMemAllocator * This,
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
106 /* [out] */ IMediaSample **ppBuffer,
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
107 /* [in] */ REFERENCE_TIME *pStartTime,
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
108 /* [in] */ REFERENCE_TIME *pEndTime,
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
109 /* [in] */ DWORD dwFlags)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
110 {
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
111 Debug printf("MemAllocator_GetBuffer(%p) called\n", This);
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
112 MemAllocator* me = (MemAllocator*)This;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
113 if (me->free_list.size() == 0)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
114 {
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
115 Debug printf("No samples available\n");
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
116 return E_FAIL;//should block here if no samples are available
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
117 }
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
118 list<CMediaSample*>::iterator it = me->free_list.begin();
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
119 me->used_list.push_back(*it);
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
120 *ppBuffer = *it;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
121 (*ppBuffer)->vt->AddRef((IUnknown*)*ppBuffer);
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
122 if (me->new_pointer)
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 168
diff changeset
123 {
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 168
diff changeset
124 if(me->modified_sample)
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 168
diff changeset
125 me->modified_sample->ResetPointer();
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
126 (*it)->SetPointer(me->new_pointer);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 168
diff changeset
127 me->modified_sample=*it;
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
128 me->new_pointer = 0;
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 168
diff changeset
129 }
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
130 me->free_list.remove(*it);
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
131 return 0;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
132 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
133
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
134 static HRESULT STDCALL MemAllocator_ReleaseBuffer(IMemAllocator * This,
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
135 /* [in] */ IMediaSample *pBuffer)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
136 {
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
137 Debug printf("MemAllocator_ReleaseBuffer(%p) called\n", This);
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
138 MemAllocator* me = (MemAllocator*)This;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
139 list<CMediaSample*>::iterator it;
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
140 for (it = me->used_list.begin(); it != me->used_list.end(); it++)
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
141 if (*it == pBuffer)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
142 {
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
143 me->used_list.erase(it);
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
144 me->free_list.push_back((CMediaSample*)pBuffer);
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
145 return 0;
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
146 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
147 Debug printf("Releasing unknown buffer\n");
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
148 return E_FAIL;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
149 }
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
150
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
151 MemAllocator::MemAllocator()
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
152 {
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
153 Debug printf("MemAllocator::MemAllocator() called\n");
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
154 vt = new IMemAllocator_vt;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
155 vt->QueryInterface = QueryInterface;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
156 vt->AddRef = AddRef;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
157 vt->Release = Release;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
158 vt->SetProperties = MemAllocator_SetProperties;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
159 vt->GetProperties = MemAllocator_GetProperties;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
160 vt->Commit = MemAllocator_Commit;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
161 vt->Decommit = MemAllocator_Decommit;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
162 vt->GetBuffer = MemAllocator_GetBuffer;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
163 vt->ReleaseBuffer = MemAllocator_ReleaseBuffer;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
164
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
165 refcount = 1;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
166 props.cBuffers = 1;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
167 props.cbBuffer = 65536; /* :/ */
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
168 props.cbAlign = props.cbPrefix = 0;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
169
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
170 new_pointer=0;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
171 modified_sample=0;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
172 }
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
173
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
174 MemAllocator::~MemAllocator()
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
175 {
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
176 Debug printf("MemAllocator::~MemAllocator() called\n");
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
177 delete vt;
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 713
diff changeset
178 }