summaryrefslogtreecommitdiffstats
path: root/loader/dmo/buffer.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-26 22:54:11 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-26 22:54:11 +0000
commitc989ead81b1629d601fbc25975a33a28952485e7 (patch)
tree0255f8b5026f62c77cb6b66ea850e0b536b4412e /loader/dmo/buffer.c
parentc665efef4a3f27182ff2305da94ba7fa3329bdff (diff)
downloadmpv-c989ead81b1629d601fbc25975a33a28952485e7.tar.bz2
mpv-c989ead81b1629d601fbc25975a33a28952485e7.tar.xz
DMO interfaces (copied/converted(c++->c) from avifile)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8295 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'loader/dmo/buffer.c')
-rw-r--r--loader/dmo/buffer.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/loader/dmo/buffer.c b/loader/dmo/buffer.c
new file mode 100644
index 0000000000..3d53c3ce99
--- /dev/null
+++ b/loader/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;
+}