ReactOS  0.4.14-dev-317-g96040ec
CKsAllocator Class Reference
Inheritance diagram for CKsAllocator:
Collaboration diagram for CKsAllocator:

Public Types

typedef std::stack< IMediaSample * > MediaSampleStack
 
typedef std::list< IMediaSample * > MediaSampleList
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 

Public Member Functions

STDMETHODIMP QueryInterface (REFIID InterfaceId, PVOID *Interface)
 
 STDMETHODIMP_ (ULONG) AddRef()
 
 STDMETHODIMP_ (ULONG) Release()
 
HANDLE STDMETHODCALLTYPE KsGetAllocatorHandle ()
 
KSALLOCATORMODE STDMETHODCALLTYPE KsGetAllocatorMode ()
 
HRESULT STDMETHODCALLTYPE KsGetAllocatorStatus (PKSSTREAMALLOCATOR_STATUS AllocatorStatus)
 
VOID STDMETHODCALLTYPE KsSetAllocatorMode (KSALLOCATORMODE Mode)
 
PALLOCATOR_PROPERTIES_EX STDMETHODCALLTYPE KsGetProperties ()
 
VOID STDMETHODCALLTYPE KsSetProperties (PALLOCATOR_PROPERTIES_EX Properties)
 
VOID STDMETHODCALLTYPE KsSetAllocatorHandle (HANDLE AllocatorHandle)
 
HANDLE STDMETHODCALLTYPE KsCreateAllocatorAndGetHandle (IKsPin *KsPin)
 
HRESULT STDMETHODCALLTYPE SetProperties (ALLOCATOR_PROPERTIES *pRequest, ALLOCATOR_PROPERTIES *pActual)
 
HRESULT STDMETHODCALLTYPE GetProperties (ALLOCATOR_PROPERTIES *pProps)
 
HRESULT STDMETHODCALLTYPE Commit ()
 
HRESULT STDMETHODCALLTYPE Decommit ()
 
HRESULT STDMETHODCALLTYPE GetBuffer (IMediaSample **ppBuffer, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime, DWORD dwFlags)
 
HRESULT STDMETHODCALLTYPE ReleaseBuffer (IMediaSample *pBuffer)
 
HRESULT STDMETHODCALLTYPE SetNotify (IMemAllocatorNotifyCallbackTemp *pNotify)
 
HRESULT STDMETHODCALLTYPE GetFreeCount (LONG *plBuffersFree)
 
 CKsAllocator ()
 
virtual ~CKsAllocator ()
 
VOID STDMETHODCALLTYPE FreeMediaSamples ()
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 

Protected Attributes

LONG m_Ref
 
HANDLE m_hAllocator
 
KSALLOCATORMODE m_Mode
 
ALLOCATOR_PROPERTIES_EX m_Properties
 
IMemAllocatorNotifyCallbackTempm_Notify
 
ULONG m_Allocated
 
LONG m_cbBuffer
 
LONG m_cBuffers
 
LONG m_cbAlign
 
LONG m_cbPrefix
 
BOOL m_Committed
 
CRITICAL_SECTION m_CriticalSection
 
MediaSampleStack m_FreeList
 
MediaSampleList m_UsedList
 
LPVOID m_Buffer
 
BOOL m_FreeSamples
 

Detailed Description

Definition at line 14 of file allocator.cpp.

Member Typedef Documentation

◆ MediaSampleList

Definition at line 19 of file allocator.cpp.

◆ MediaSampleStack

Definition at line 18 of file allocator.cpp.

Constructor & Destructor Documentation

◆ CKsAllocator()

CKsAllocator::CKsAllocator ( )

Definition at line 112 of file allocator.cpp.

112  : m_Ref(0),
113  m_hAllocator(0),
114  m_Mode(KsAllocatorMode_User),
115  m_Notify(0),
116  m_Allocated(0),
117  m_cbBuffer(0),
118  m_cBuffers(0),
119  m_cbAlign(0),
120  m_cbPrefix(0),
122  m_FreeList(),
123  m_UsedList(),
124  m_Buffer(0),
126 {
128 
129 }
LONG m_cbPrefix
Definition: allocator.cpp:77
CRITICAL_SECTION m_CriticalSection
Definition: allocator.cpp:79
MediaSampleList m_UsedList
Definition: allocator.cpp:81
IMemAllocatorNotifyCallbackTemp * m_Notify
Definition: allocator.cpp:72
LONG m_cbAlign
Definition: allocator.cpp:76
BOOL m_FreeSamples
Definition: allocator.cpp:83
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
KSALLOCATORMODE m_Mode
Definition: allocator.cpp:70
LPVOID m_Buffer
Definition: allocator.cpp:82
LONG m_cbBuffer
Definition: allocator.cpp:74
LONG m_cBuffers
Definition: allocator.cpp:75
MediaSampleStack m_FreeList
Definition: allocator.cpp:80
ULONG m_Allocated
Definition: allocator.cpp:73
BOOL m_Committed
Definition: allocator.cpp:78
HANDLE m_hAllocator
Definition: allocator.cpp:69

◆ ~CKsAllocator()

virtual CKsAllocator::~CKsAllocator ( )
inlinevirtual

Definition at line 65 of file allocator.cpp.

65 {}

Member Function Documentation

◆ Commit()

HRESULT STDMETHODCALLTYPE CKsAllocator::Commit ( void  )

Implements IMemAllocator.

Definition at line 212 of file allocator.cpp.

213 {
214  LONG Index;
216  IMediaSample * Sample;
217  HRESULT hr;
218 
219  //TODO integer overflow checks
221 
222 #ifdef KSPROXY_TRACE
223  OutputDebugStringW(L"CKsAllocator::Commit\n");
224 #endif
225 
226  if (m_Mode == KsAllocatorMode_Kernel)
227  {
228  /* no-op for kernel allocator */
230  return NOERROR;
231  }
232 
233  if (m_Committed)
234  {
235  // already committed
237  return NOERROR;
238  }
239 
240  if (m_cbBuffer < 0 || m_cBuffers < 0 || m_cbPrefix < 0)
241  {
242  // invalid parameter
244  return E_OUTOFMEMORY;
245  }
246 
248 
249  if (m_cbAlign > 1)
250  {
251  //check alignment
252  LONG Mod = Size % m_cbAlign;
253  if (Mod)
254  {
255  // calculate aligned size
256  Size += m_cbAlign - Mod;
257  }
258  }
259 
260  LONG TotalSize = Size * m_cBuffers;
261 
262  assert(TotalSize);
264  assert(Size);
265 
266  // now allocate buffer
268  if (!m_Buffer)
269  {
271  return E_OUTOFMEMORY;
272  }
273 
274  ZeroMemory(m_Buffer, TotalSize);
275 
277 
278  for (Index = 0; Index < m_cBuffers; Index++)
279  {
280  // construct media sample
281  hr = CMediaSample_Constructor((IMemAllocator*)this, CurrentBuffer + m_cbPrefix, m_cbBuffer, IID_IMediaSample, (void**)&Sample);
282  if (FAILED(hr))
283  {
285  return E_OUTOFMEMORY;
286  }
287 
288  // add to free list
289  m_FreeList.push(Sample);
290  m_Allocated++;
291 
292  //next sample buffer
293  CurrentBuffer += Size;
294  }
295 
296  // we are now committed
297  m_Committed = true;
298 
300  return S_OK;
301 }
LONG m_cbPrefix
Definition: allocator.cpp:77
CRITICAL_SECTION m_CriticalSection
Definition: allocator.cpp:79
HRESULT hr
Definition: shlfolder.c:183
#define NOERROR
Definition: winerror.h:2354
unsigned char * PUCHAR
Definition: retypes.h:3
#define assert(x)
Definition: debug.h:53
#define ZeroMemory
Definition: winbase.h:1642
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define MEM_COMMIT
Definition: nt_native.h:1313
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
LPVOID NTAPI VirtualAlloc(IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD flAllocationType, IN DWORD flProtect)
Definition: virtmem.c:74
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
LONG m_cbAlign
Definition: allocator.cpp:76
long LONG
Definition: pedump.c:60
HRESULT WINAPI CMediaSample_Constructor(IMemAllocator *Allocator, BYTE *pBuffer, ULONG BufferSize, REFIID riid, LPVOID *ppv)
smooth NULL
Definition: ftsmooth.c:416
KSALLOCATORMODE m_Mode
Definition: allocator.cpp:70
LONG HRESULT
Definition: typedefs.h:77
static const UCHAR Index[8]
Definition: usbohci.c:18
LPVOID m_Buffer
Definition: allocator.cpp:82
LONG m_cbBuffer
Definition: allocator.cpp:74
static const WCHAR L[]
Definition: oid.c:1250
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
LONG m_cBuffers
Definition: allocator.cpp:75
#define S_OK
Definition: intsafe.h:59
static PVOID CurrentBuffer
MediaSampleStack m_FreeList
Definition: allocator.cpp:80
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
ULONG m_Allocated
Definition: allocator.cpp:73
BOOL m_Committed
Definition: allocator.cpp:78
#define PAGE_READWRITE
Definition: nt_native.h:1304

◆ Decommit()

HRESULT STDMETHODCALLTYPE CKsAllocator::Decommit ( void  )

Implements IMemAllocator.

Definition at line 305 of file allocator.cpp.

306 {
308 
309 #ifdef KSPROXY_TRACE
310  OutputDebugStringW(L"CKsAllocator::Decommit\n");
311 #endif
312 
313  if (m_Mode == KsAllocatorMode_Kernel)
314  {
315  /* no-op for kernel allocator */
317  return NOERROR;
318  }
319 
320  m_Committed = false;
321 
322  if (m_Allocated != m_FreeList.size())
323  {
324  // outstanding buffers
325  m_FreeSamples = true;
327  return NOERROR;
328  }
329  else
330  {
331  // no outstanding buffers
332  // free to free them
334  }
335 
337  return NOERROR;
338 }
CRITICAL_SECTION m_CriticalSection
Definition: allocator.cpp:79
#define NOERROR
Definition: winerror.h:2354
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
BOOL m_FreeSamples
Definition: allocator.cpp:83
KSALLOCATORMODE m_Mode
Definition: allocator.cpp:70
static const WCHAR L[]
Definition: oid.c:1250
VOID STDMETHODCALLTYPE FreeMediaSamples()
Definition: allocator.cpp:578
MediaSampleStack m_FreeList
Definition: allocator.cpp:80
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
ULONG m_Allocated
Definition: allocator.cpp:73
BOOL m_Committed
Definition: allocator.cpp:78

◆ FreeMediaSamples()

VOID STDMETHODCALLTYPE CKsAllocator::FreeMediaSamples ( )

Definition at line 578 of file allocator.cpp.

579 {
580  ULONG Index;
581 
582  for(Index = 0; Index < m_FreeList.size(); Index++)
583  {
584  IMediaSample * Sample = m_FreeList.top();
585  m_FreeList.pop();
586  Sample->Release();
587  }
588 
589  m_FreeSamples = false;
590  m_Allocated = 0;
591 
592  if (m_Buffer)
593  {
594  // release buffer
596 
597  m_Buffer = NULL;
598  }
599 }
ULONG Release()
BOOL m_FreeSamples
Definition: allocator.cpp:83
smooth NULL
Definition: ftsmooth.c:416
static const UCHAR Index[8]
Definition: usbohci.c:18
LPVOID m_Buffer
Definition: allocator.cpp:82
MediaSampleStack m_FreeList
Definition: allocator.cpp:80
#define MEM_RELEASE
Definition: nt_native.h:1316
unsigned int ULONG
Definition: retypes.h:1
BOOL NTAPI VirtualFree(IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD dwFreeType)
Definition: virtmem.c:128
ULONG m_Allocated
Definition: allocator.cpp:73

Referenced by Decommit(), and ReleaseBuffer().

◆ GetBuffer()

HRESULT STDMETHODCALLTYPE CKsAllocator::GetBuffer ( IMediaSample **  ppBuffer,
REFERENCE_TIME pStartTime,
REFERENCE_TIME pEndTime,
DWORD  dwFlags 
)

Implements IMemAllocator.

Definition at line 343 of file allocator.cpp.

348 {
349  IMediaSample * Sample = NULL;
350 
351  if (!m_Committed)
352  return VFW_E_NOT_COMMITTED;
353 
354  do
355  {
357 
358  if (!m_FreeList.empty())
359  {
360  OutputDebugStringW(L"CKsAllocator::GetBuffer HACK\n");
361  Sample = m_FreeList.top();
362  m_FreeList.pop();
363  }
364 
366 
367  if (dwFlags & AM_GBF_NOWAIT)
368  {
369  // never wait untill a buffer becomes available
370  break;
371  }
372  }
373  while(Sample == NULL);
374 
375  if (!Sample)
376  {
377  // no sample acquired
378  //HACKKKKKKK
379  Sample = m_UsedList.back();
380  m_UsedList.pop_back();
381 
382  if (!Sample)
383  return VFW_E_TIMEOUT;
384  }
385 
386  // store result
387  *ppBuffer = Sample;
388 
389  // store sample in used list
390  m_UsedList.push_front(Sample);
391 
392  // done
393  return NOERROR;
394 }
CRITICAL_SECTION m_CriticalSection
Definition: allocator.cpp:79
MediaSampleList m_UsedList
Definition: allocator.cpp:81
#define NOERROR
Definition: winerror.h:2354
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
smooth NULL
Definition: ftsmooth.c:416
#define VFW_E_TIMEOUT
Definition: vfwmsgs.h:85
static const WCHAR L[]
Definition: oid.c:1250
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
MediaSampleStack m_FreeList
Definition: allocator.cpp:80
#define VFW_E_NOT_COMMITTED
Definition: vfwmsgs.h:56
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
BOOL m_Committed
Definition: allocator.cpp:78

◆ GetFreeCount()

HRESULT STDMETHODCALLTYPE CKsAllocator::GetFreeCount ( LONG plBuffersFree)

Implements IMemAllocatorCallbackTemp.

Definition at line 461 of file allocator.cpp.

463 {
464  *plBuffersFree = m_Allocated - m_FreeList.size();
465  return S_OK;
466 }
#define S_OK
Definition: intsafe.h:59
MediaSampleStack m_FreeList
Definition: allocator.cpp:80
ULONG m_Allocated
Definition: allocator.cpp:73

◆ GetProperties()

HRESULT STDMETHODCALLTYPE CKsAllocator::GetProperties ( ALLOCATOR_PROPERTIES pProps)

Implements IMemAllocator.

Definition at line 196 of file allocator.cpp.

198 {
199  if (!pProps)
200  return E_POINTER;
201 
202  pProps->cbBuffer = m_cbBuffer;
203  pProps->cBuffers = m_cBuffers;
204  pProps->cbAlign = m_cbAlign;
205  pProps->cbPrefix = m_cbPrefix;
206 
207  return NOERROR;
208 }
LONG m_cbPrefix
Definition: allocator.cpp:77
#define NOERROR
Definition: winerror.h:2354
LONG m_cbAlign
Definition: allocator.cpp:76
LONG m_cbBuffer
Definition: allocator.cpp:74
LONG m_cBuffers
Definition: allocator.cpp:75
#define E_POINTER
Definition: winerror.h:2365

◆ KsCreateAllocatorAndGetHandle()

HANDLE STDMETHODCALLTYPE CKsAllocator::KsCreateAllocatorAndGetHandle ( IKsPin *  KsPin)

Definition at line 529 of file allocator.cpp.

531 {
532  HRESULT hr;
533  IKsObject * pObject;
535  HANDLE hPin;
536 
537 #ifdef KSPROXY_TRACE
538  OutputDebugStringW(L"CKsAllocator::KsCreateAllocatorAndGetHandle\n");
539 #endif
540 
541  if (m_hAllocator)
542  {
544  m_hAllocator = NULL;
545  }
546 
547  // get pin IKsObject interface
548  hr = KsPin->QueryInterface(IID_IKsObject, (void**)&pObject);
549  if (FAILED(hr))
550  return NULL;
551 
552  // get pin handle
553  hPin = pObject->KsGetObjectHandle();
554 
555  //release IKsObject interface
556  pObject->Release();
557 
558  if (!hPin || hPin == INVALID_HANDLE_VALUE)
559  return NULL;
560 
561  //setup allocator framing
566  AllocatorFraming.PoolType = (m_Properties.LogicalMemoryType == KS_MemoryTypeKernelPaged);
567 
569  if (dwError)
570  return NULL;
571 
572  return m_hAllocator;
573 }
#define CloseHandle
Definition: compat.h:398
HRESULT hr
Definition: shlfolder.c:183
const GUID IID_IKsObject
ALLOCATOR_PROPERTIES_EX m_Properties
Definition: allocator.cpp:71
_In_ PKSALLOCATOR_FRAMING AllocatorFraming
Definition: ks.h:4518
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
#define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY
Definition: ks.h:1691
smooth NULL
Definition: ftsmooth.c:416
ULONG Frames
Definition: ks.h:1670
KSDDKAPI DWORD NTAPI KsCreateAllocator(HANDLE ConnectionHandle, PKSALLOCATOR_FRAMING AllocatorFraming, PHANDLE AllocatorHandle)
Definition: ksuser.c:107
LONG HRESULT
Definition: typedefs.h:77
nsrefcnt Release()
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
ULONG PoolType
Definition: ks.h:1668
ULONG FileAlignment
Definition: ks.h:1672
ULONG FrameSize
Definition: ks.h:1671
HANDLE m_hAllocator
Definition: allocator.cpp:69
ULONG OptionsFlags
Definition: ks.h:1662

◆ KsGetAllocatorHandle()

HANDLE STDMETHODCALLTYPE CKsAllocator::KsGetAllocatorHandle ( )

Definition at line 473 of file allocator.cpp.

474 {
475  return m_hAllocator;
476 }
HANDLE m_hAllocator
Definition: allocator.cpp:69

◆ KsGetAllocatorMode()

KSALLOCATORMODE STDMETHODCALLTYPE CKsAllocator::KsGetAllocatorMode ( )

Definition at line 480 of file allocator.cpp.

481 {
482  return m_Mode;
483 }
KSALLOCATORMODE m_Mode
Definition: allocator.cpp:70

◆ KsGetAllocatorStatus()

HRESULT STDMETHODCALLTYPE CKsAllocator::KsGetAllocatorStatus ( PKSSTREAMALLOCATOR_STATUS  AllocatorStatus)

Definition at line 487 of file allocator.cpp.

489 {
490  return NOERROR;
491 }
#define NOERROR
Definition: winerror.h:2354

◆ KsGetProperties()

PALLOCATOR_PROPERTIES_EX STDMETHODCALLTYPE CKsAllocator::KsGetProperties ( )

Definition at line 505 of file allocator.cpp.

506 {
507  return &m_Properties;
508 }
ALLOCATOR_PROPERTIES_EX m_Properties
Definition: allocator.cpp:71

◆ KsSetAllocatorHandle()

VOID STDMETHODCALLTYPE CKsAllocator::KsSetAllocatorHandle ( HANDLE  AllocatorHandle)

Definition at line 520 of file allocator.cpp.

522 {
524 }
_In_ PKSALLOCATOR_FRAMING _Out_ PHANDLE AllocatorHandle
Definition: ks.h:4518
HANDLE m_hAllocator
Definition: allocator.cpp:69

◆ KsSetAllocatorMode()

VOID STDMETHODCALLTYPE CKsAllocator::KsSetAllocatorMode ( KSALLOCATORMODE  Mode)

Definition at line 494 of file allocator.cpp.

496 {
497  m_Mode = Mode;
498 }
_In_ ULONG Mode
Definition: hubbusif.h:303
KSALLOCATORMODE m_Mode
Definition: allocator.cpp:70

◆ KsSetProperties()

VOID STDMETHODCALLTYPE CKsAllocator::KsSetProperties ( PALLOCATOR_PROPERTIES_EX  Properties)

Definition at line 512 of file allocator.cpp.

514 {
515  CopyMemory(&m_Properties, Properties, sizeof(ALLOCATOR_PROPERTIES_EX));
516 }
ALLOCATOR_PROPERTIES_EX m_Properties
Definition: allocator.cpp:71
#define CopyMemory
Definition: winbase.h:1640

◆ QueryInterface()

HRESULT STDMETHODCALLTYPE CKsAllocator::QueryInterface ( REFIID  InterfaceId,
PVOID Interface 
)

Definition at line 89 of file allocator.cpp.

92 {
93  if (IsEqualGUID(refiid, IID_IUnknown) ||
94  IsEqualGUID(refiid, IID_IKsAllocator) ||
96  {
97  *Output = PVOID(this);
98  reinterpret_cast<IUnknown*>(*Output)->AddRef();
99  return NOERROR;
100  }
101  if (IsEqualGUID(refiid, IID_IMemAllocator) ||
102  IsEqualGUID(refiid, IID_IMemAllocatorCallbackTemp))
103  {
104  *Output = (IMemAllocatorCallbackTemp*)(this);
105  reinterpret_cast<IMemAllocatorCallbackTemp*>(*Output)->AddRef();
106  return NOERROR;
107  }
108 
109  return E_NOINTERFACE;
110 }
#define E_NOINTERFACE
Definition: winerror.h:2364
#define NOERROR
Definition: winerror.h:2354
void * PVOID
Definition: retypes.h:9
const GUID IID_IUnknown
const GUID IID_IKsAllocatorEx
Definition: allocator.cpp:11
Definition: arc.h:85
const GUID IID_IKsAllocator
Definition: allocator.cpp:12
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112

◆ ReleaseBuffer()

HRESULT STDMETHODCALLTYPE CKsAllocator::ReleaseBuffer ( IMediaSample pBuffer)

Implements IMemAllocator.

Definition at line 398 of file allocator.cpp.

400 {
402 
403 #ifdef KSPROXY_TRACE
404  OutputDebugStringW(L"CKsAllocator::ReleaseBuffer\n");
405 #endif
406 
407  // media sample always 1 ref count in free list
408  pBuffer->AddRef();
409 
410  // add the sample to the free list
411  m_FreeList.push(pBuffer);
412 
413 
414  if (m_FreeSamples)
415  {
416  // pending de-commit
417  if (m_FreeList.size () == m_Allocated)
418  {
420  }
421  }
422 
423  if (m_Notify)
424  {
425  //notify caller of an available buffer
427  }
428 
430  return S_OK;
431 }
CRITICAL_SECTION m_CriticalSection
Definition: allocator.cpp:79
IMemAllocatorNotifyCallbackTemp * m_Notify
Definition: allocator.cpp:72
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
BOOL m_FreeSamples
Definition: allocator.cpp:83
PVOID pBuffer
static const WCHAR L[]
Definition: oid.c:1250
VOID STDMETHODCALLTYPE FreeMediaSamples()
Definition: allocator.cpp:578
#define S_OK
Definition: intsafe.h:59
MediaSampleStack m_FreeList
Definition: allocator.cpp:80
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
nsrefcnt AddRef()
ULONG m_Allocated
Definition: allocator.cpp:73

◆ SetNotify()

HRESULT STDMETHODCALLTYPE CKsAllocator::SetNotify ( IMemAllocatorNotifyCallbackTemp pNotify)

Implements IMemAllocatorCallbackTemp.

Definition at line 438 of file allocator.cpp.

440 {
442 
443 #ifdef KSPROXY_TRACE
444  OutputDebugStringW(L"CKsAllocator::SetNotify\n");
445 #endif
446 
447  if (pNotify)
448  pNotify->AddRef();
449 
450  if (m_Notify)
451  m_Notify->Release();
452 
453  m_Notify = pNotify;
454 
456  return NOERROR;
457 }
CRITICAL_SECTION m_CriticalSection
Definition: allocator.cpp:79
#define NOERROR
Definition: winerror.h:2354
IMemAllocatorNotifyCallbackTemp * m_Notify
Definition: allocator.cpp:72
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
ULONG Release()
ULONG AddRef()
static const WCHAR L[]
Definition: oid.c:1250
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)

◆ SetProperties()

HRESULT STDMETHODCALLTYPE CKsAllocator::SetProperties ( ALLOCATOR_PROPERTIES pRequest,
ALLOCATOR_PROPERTIES pActual 
)

Implements IMemAllocator.

Definition at line 136 of file allocator.cpp.

139 {
140  SYSTEM_INFO SystemInfo;
141 
143 
144 #ifdef KSPROXY_TRACE
145  OutputDebugStringW(L"CKsAllocator::SetProperties\n");
146 #endif
147 
148  if (!pRequest || !pActual)
149  return E_POINTER;
150 
151  // zero output properties
152  ZeroMemory(pActual, sizeof(ALLOCATOR_PROPERTIES));
153 
154  // get system info
155  GetSystemInfo(&SystemInfo);
156 
157  if (!pRequest->cbAlign || (pRequest->cbAlign - 1) & SystemInfo.dwAllocationGranularity)
158  {
159  // bad alignment
161  return VFW_E_BADALIGN;
162  }
163 
164  if (m_Mode == KsAllocatorMode_Kernel)
165  {
166  // u can't change a kernel allocator
169  }
170 
171  if (m_Committed)
172  {
173  // need to decommit first
176  }
177 
178  if (m_Allocated != m_FreeList.size())
179  {
180  // outstanding buffers
183  }
184 
185  pActual->cbAlign = m_cbAlign = pRequest->cbAlign;
186  pActual->cbBuffer = m_cbBuffer = pRequest->cbBuffer;
187  pActual->cbPrefix = m_cbPrefix = pRequest->cbPrefix;
188  pActual->cBuffers = m_cBuffers = pRequest->cBuffers;
189 
191  return NOERROR;
192 }
LONG m_cbPrefix
Definition: allocator.cpp:77
CRITICAL_SECTION m_CriticalSection
Definition: allocator.cpp:79
#define VFW_E_BADALIGN
Definition: vfwmsgs.h:53
#define NOERROR
Definition: winerror.h:2354
DWORD dwAllocationGranularity
Definition: winbase.h:1139
#define ZeroMemory
Definition: winbase.h:1642
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI SHIM_OBJ_NAME() OutputDebugStringW(LPCWSTR lpOutputString)
Definition: ignoredbgout.c:23
LONG m_cbAlign
Definition: allocator.cpp:76
#define VFW_E_ALREADY_COMMITTED
Definition: vfwmsgs.h:54
KSALLOCATORMODE m_Mode
Definition: allocator.cpp:70
LONG m_cbBuffer
Definition: allocator.cpp:74
static const WCHAR L[]
Definition: oid.c:1250
LONG m_cBuffers
Definition: allocator.cpp:75
#define VFW_E_BUFFERS_OUTSTANDING
Definition: vfwmsgs.h:55
VOID WINAPI GetSystemInfo(IN LPSYSTEM_INFO lpSystemInfo)
Definition: sysinfo.c:142
MediaSampleStack m_FreeList
Definition: allocator.cpp:80
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
#define E_POINTER
Definition: winerror.h:2365
ULONG m_Allocated
Definition: allocator.cpp:73
BOOL m_Committed
Definition: allocator.cpp:78

◆ STDMETHODIMP_() [1/2]

CKsAllocator::STDMETHODIMP_ ( ULONG  )
inline

Definition at line 23 of file allocator.cpp.

24  {
26  return m_Ref;
27  }
#define InterlockedIncrement
Definition: armddk.h:53

◆ STDMETHODIMP_() [2/2]

CKsAllocator::STDMETHODIMP_ ( ULONG  )
inline

Definition at line 28 of file allocator.cpp.

29  {
31 
32  if (!m_Ref)
33  {
34  delete this;
35  return 0;
36  }
37  return m_Ref;
38  }
#define InterlockedDecrement
Definition: armddk.h:52

Member Data Documentation

◆ m_Allocated

ULONG CKsAllocator::m_Allocated
protected

◆ m_Buffer

LPVOID CKsAllocator::m_Buffer
protected

Definition at line 82 of file allocator.cpp.

Referenced by Commit(), and FreeMediaSamples().

◆ m_cbAlign

LONG CKsAllocator::m_cbAlign
protected

Definition at line 76 of file allocator.cpp.

Referenced by Commit(), GetProperties(), and SetProperties().

◆ m_cbBuffer

LONG CKsAllocator::m_cbBuffer
protected

Definition at line 74 of file allocator.cpp.

Referenced by Commit(), GetProperties(), and SetProperties().

◆ m_cbPrefix

LONG CKsAllocator::m_cbPrefix
protected

Definition at line 77 of file allocator.cpp.

Referenced by Commit(), GetProperties(), and SetProperties().

◆ m_cBuffers

LONG CKsAllocator::m_cBuffers
protected

Definition at line 75 of file allocator.cpp.

Referenced by Commit(), GetProperties(), and SetProperties().

◆ m_Committed

BOOL CKsAllocator::m_Committed
protected

Definition at line 78 of file allocator.cpp.

Referenced by Commit(), Decommit(), GetBuffer(), and SetProperties().

◆ m_CriticalSection

CRITICAL_SECTION CKsAllocator::m_CriticalSection
protected

◆ m_FreeList

MediaSampleStack CKsAllocator::m_FreeList
protected

◆ m_FreeSamples

BOOL CKsAllocator::m_FreeSamples
protected

Definition at line 83 of file allocator.cpp.

Referenced by Decommit(), FreeMediaSamples(), and ReleaseBuffer().

◆ m_hAllocator

HANDLE CKsAllocator::m_hAllocator
protected

◆ m_Mode

KSALLOCATORMODE CKsAllocator::m_Mode
protected

Definition at line 70 of file allocator.cpp.

Referenced by Commit(), Decommit(), KsGetAllocatorMode(), KsSetAllocatorMode(), and SetProperties().

◆ m_Notify

IMemAllocatorNotifyCallbackTemp* CKsAllocator::m_Notify
protected

Definition at line 72 of file allocator.cpp.

Referenced by ReleaseBuffer(), and SetNotify().

◆ m_Properties

ALLOCATOR_PROPERTIES_EX CKsAllocator::m_Properties
protected

Definition at line 71 of file allocator.cpp.

Referenced by KsCreateAllocatorAndGetHandle(), KsGetProperties(), and KsSetProperties().

◆ m_Ref

LONG CKsAllocator::m_Ref
protected

Definition at line 68 of file allocator.cpp.

Referenced by STDMETHODIMP_().

◆ m_UsedList

MediaSampleList CKsAllocator::m_UsedList
protected

Definition at line 81 of file allocator.cpp.

Referenced by GetBuffer().


The documentation for this class was generated from the following file: