diff options
author | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2002-12-23 15:54:42 +0000 |
---|---|---|
committer | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2002-12-23 15:54:42 +0000 |
commit | 9b2f0a778eaa65fc7cfe197d318b4faed40b1d10 (patch) | |
tree | 2e360b243be07e5500647fce4d7e0327467f09e3 /src/libw32dll/dmo/buffer.c | |
parent | d15276928e22160cdb606a0cf65ad48f1268f072 (diff) | |
download | xine-lib-9b2f0a778eaa65fc7cfe197d318b4faed40b1d10.tar.gz xine-lib-9b2f0a778eaa65fc7cfe197d318b4faed40b1d10.tar.bz2 |
wmv9 support
CVS patchset: 3651
CVS date: 2002/12/23 15:54:42
Diffstat (limited to 'src/libw32dll/dmo/buffer.c')
-rw-r--r-- | src/libw32dll/dmo/buffer.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/libw32dll/dmo/buffer.c b/src/libw32dll/dmo/buffer.c new file mode 100644 index 000000000..3d53c3ce9 --- /dev/null +++ b/src/libw32dll/dmo/buffer.c @@ -0,0 +1,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; +} |