1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#include "DMO_Filter.h"
#include "wine/winerror.h"
#include "wine/windef.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct CMediaBuffer
{
IMediaBuffer_vt* vt;
DECLARE_IUNKNOWN();
GUID interfaces[2];
void* mem;
unsigned long len;
unsigned long maxlen;
int freemem;
};
static HRESULT STDCALL CMediaBuffer_SetLength(IMediaBuffer* This,
unsigned long cbLength)
{
CMediaBuffer* cmb = (CMediaBuffer*) This;
Debug printf("CMediaBuffer_SetLength(%p) called (%ld, %ld)\n", This, cbLength, cmb->maxlen);
if (cbLength > cmb->maxlen)
return E_INVALIDARG;
cmb->len = cbLength;
return S_OK;
}
static HRESULT STDCALL CMediaBuffer_GetMaxLength(IMediaBuffer* This,
/* [out] */ unsigned long *pcbMaxLength)
{
CMediaBuffer* cmb = (CMediaBuffer*) This;
Debug printf("CMediaBuffer_GetMaxLength(%p) called -> %ld\n", This, cmb->maxlen);
if (!pcbMaxLength)
return E_POINTER;
*pcbMaxLength = cmb->maxlen;
return S_OK;
}
static HRESULT STDCALL CMediaBuffer_GetBufferAndLength(IMediaBuffer* This,
/* [out] */ char** ppBuffer,
/* [out] */ unsigned long* pcbLength)
{
CMediaBuffer* cmb = (CMediaBuffer*) This;
Debug printf("CMediaBuffer_GetBufferAndLength(%p) called -> %p %ld\n", This, cmb->mem, cmb->len);
if (!ppBuffer && !pcbLength)
return E_POINTER;
if (ppBuffer)
*ppBuffer = cmb->mem;
if (pcbLength)
*pcbLength = cmb->len;
return S_OK;
}
static void CMediaBuffer_Destroy(CMediaBuffer* This)
{
Debug printf("CMediaBuffer_Destroy(%p) called\n", This);
if (This->freemem)
free(This->mem);
free(This->vt);
free(This);
}
IMPLEMENT_IUNKNOWN(CMediaBuffer)
CMediaBuffer* CMediaBufferCreate(unsigned long maxlen, void* mem,
unsigned long len, int copy)
{
CMediaBuffer* This = (CMediaBuffer*) malloc(sizeof(CMediaBuffer));
if (!This)
return NULL;
This->vt = (IMediaBuffer_vt*) malloc(sizeof(IMediaBuffer_vt));
if (!This->vt)
{
CMediaBuffer_Destroy(This);
return NULL;
}
This->refcount = 1;
This->len = len;
This->maxlen = maxlen;
This->freemem = 0;
This->mem = mem;
if (copy)
/* make a private copy of data */
This->mem = 0;
if (This->mem == NULL)
{
if (This->maxlen)
{
This->mem = malloc(This->maxlen);
if (!This->mem)
{
CMediaBuffer_Destroy(This);
return NULL;
}
This->freemem = 1;
if (copy)
memcpy(This->mem, mem, This->len);
}
}
This->vt->QueryInterface = CMediaBuffer_QueryInterface;
This->vt->AddRef = CMediaBuffer_AddRef;
This->vt->Release = CMediaBuffer_Release;
This->vt->SetLength = CMediaBuffer_SetLength;
This->vt->GetMaxLength = CMediaBuffer_GetMaxLength;
This->vt->GetBufferAndLength = CMediaBuffer_GetBufferAndLength;
This->interfaces[0] = IID_IUnknown;
This->interfaces[1] = IID_IMediaBuffer;
return This;
}
|