[PATCH v2 3/6] mp3dmod: Implement ProcessInput().
Zebediah Figura
z.figura12 at gmail.com
Fri May 11 10:18:12 CDT 2018
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/mp3dmod/mp3dmod.c | 34 +++++++++++++++++++++++++++++++---
1 file changed, 31 insertions(+), 3 deletions(-)
diff --git a/dlls/mp3dmod/mp3dmod.c b/dlls/mp3dmod/mp3dmod.c
index 2922082..ccba5c0 100644
--- a/dlls/mp3dmod/mp3dmod.c
+++ b/dlls/mp3dmod/mp3dmod.c
@@ -41,6 +41,7 @@ struct mp3_decoder {
LONG ref;
mpg123_handle *mh;
DMO_MEDIA_TYPE outtype;
+ IMediaBuffer *buffer;
};
static inline struct mp3_decoder *impl_from_IMediaObject(IMediaObject *iface)
@@ -256,10 +257,36 @@ static HRESULT WINAPI MediaObject_GetInputStatus(IMediaObject *iface, DWORD inde
static HRESULT WINAPI MediaObject_ProcessInput(IMediaObject *iface, DWORD index,
IMediaBuffer *buffer, DWORD flags, REFERENCE_TIME timestamp, REFERENCE_TIME timelength)
{
- FIXME("(%p)->(%d, %p, %#x, %s, %s) stub!\n", iface, index, buffer, flags,
+ struct mp3_decoder *This = impl_from_IMediaObject(iface);
+ HRESULT hr;
+ BYTE *data;
+ DWORD len;
+ int err;
+
+ TRACE("(%p)->(%d, %p, %#x, %s, %s)\n", iface, index, buffer, flags,
wine_dbgstr_longlong(timestamp), wine_dbgstr_longlong(timelength));
- return E_NOTIMPL;
+ if (This->buffer)
+ {
+ ERR("Already have a buffer.\n");
+ return DMO_E_NOTACCEPTING;
+ }
+
+ IMediaBuffer_AddRef(buffer);
+ This->buffer = buffer;
+
+ hr = IMediaBuffer_GetBufferAndLength(buffer, &data, &len);
+ if (FAILED(hr))
+ return hr;
+
+ err = mpg123_feed(This->mh, data, len);
+ if (err != MPG123_OK)
+ {
+ ERR("mpg123_feed() failed: %s\n", mpg123_strerror(This->mh));
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI MediaObject_ProcessOutput(IMediaObject *iface, DWORD flags, DWORD count, DMO_OUTPUT_DATA_BUFFER *buffers, DWORD *status)
@@ -308,7 +335,7 @@ static HRESULT create_mp3_decoder(REFIID iid, void **obj)
struct mp3_decoder *This;
int err;
- if (!(This = heap_alloc(sizeof(*This))))
+ if (!(This = heap_alloc_zero(sizeof(*This))))
return E_OUTOFMEMORY;
This->IMediaObject_iface.lpVtbl = &IMediaObject_vtbl;
@@ -316,6 +343,7 @@ static HRESULT create_mp3_decoder(REFIID iid, void **obj)
mpg123_init();
This->mh = mpg123_new(NULL, &err);
+ mpg123_open_feed(This->mh);
mpg123_format_none(This->mh);
return IMediaObject_QueryInterface(&This->IMediaObject_iface, iid, obj);
--
2.7.4
More information about the wine-devel
mailing list