Module: wine Branch: master Commit: 3b0d68e4093622cdf7a943cc5e3825e81176be31 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3b0d68e4093622cdf7a943cc5e...
Author: Dan Hipschman dsh@linux.ucla.edu Date: Wed Apr 9 16:01:30 2008 -0700
qedit: Implement IMediaDet_get_StreamMediaType.
---
dlls/qedit/mediadet.c | 88 +++++++++++++++++++++++++++++++++++++++++-- dlls/qedit/tests/mediadet.c | 26 ++++++++++--- 2 files changed, 104 insertions(+), 10 deletions(-)
diff --git a/dlls/qedit/mediadet.c b/dlls/qedit/mediadet.c index abccca9..16b2a85 100644 --- a/dlls/qedit/mediadet.c +++ b/dlls/qedit/mediadet.c @@ -1,6 +1,6 @@ /* DirectShow Media Detector object (QEDIT.DLL) * - * Copyright 2008 Google (Lei Zhang) + * Copyright 2008 Google (Lei Zhang, Dan Hipschman) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,6 +17,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include <assert.h> #include <stdarg.h>
#define COBJMACROS @@ -39,10 +40,13 @@ typedef struct MediaDetImpl { IBaseFilter *splitter; long num_streams; long cur_stream; + IPin *cur_pin; } MediaDetImpl;
static void MD_cleanup(MediaDetImpl *This) { + if (This->cur_pin) IPin_Release(This->cur_pin); + This->cur_pin = NULL; if (This->source) IBaseFilter_Release(This->source); This->source = NULL; if (This->splitter) IBaseFilter_Release(This->splitter); @@ -164,6 +168,47 @@ static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, long *pVal) return S_OK; }
+static HRESULT SetCurPin(MediaDetImpl *This, long strm) +{ + IEnumPins *pins; + IPin *pin; + HRESULT hr; + + assert(This->splitter); + assert(0 <= strm && strm < This->num_streams); + + if (This->cur_pin) + { + IPin_Release(This->cur_pin); + This->cur_pin = NULL; + } + + hr = IBaseFilter_EnumPins(This->splitter, &pins); + if (FAILED(hr)) + return hr; + + while (IEnumPins_Next(pins, 1, &pin, NULL) == S_OK && !This->cur_pin) + { + PIN_DIRECTION dir; + hr = IPin_QueryDirection(pin, &dir); + if (FAILED(hr)) + { + IPin_Release(pin); + IEnumPins_Release(pins); + return hr; + } + + if (dir == PINDIR_OUTPUT && strm-- == 0) + This->cur_pin = pin; + else + IPin_Release(pin); + } + IEnumPins_Release(pins); + + assert(This->cur_pin); + return S_OK; +} + static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal) { MediaDetImpl *This = (MediaDetImpl *)iface; @@ -182,6 +227,10 @@ static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal) if (newVal < 0 || This->num_streams <= newVal) return E_INVALIDARG;
+ hr = SetCurPin(This, newVal); + if (FAILED(hr)) + return hr; + This->cur_stream = newVal; return S_OK; } @@ -403,7 +452,11 @@ static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal)
This->graph = gb; This->source = bf; - return GetSplitter(This); + hr = GetSplitter(This); + if (FAILED(hr)) + return hr; + + return MediaDet_put_CurrentStream(iface, 0); }
static HRESULT WINAPI MediaDet_GetBitmapBits(IMediaDet* iface, @@ -430,8 +483,34 @@ static HRESULT WINAPI MediaDet_get_StreamMediaType(IMediaDet* iface, AM_MEDIA_TYPE *pVal) { MediaDetImpl *This = (MediaDetImpl *)iface; - FIXME("(%p)->(%p): not implemented!\n", This, pVal); - return E_NOTIMPL; + IEnumMediaTypes *types; + AM_MEDIA_TYPE *pmt; + HRESULT hr; + + TRACE("(%p)\n", This); + + if (!pVal) + return E_POINTER; + + if (!This->cur_pin) + return E_INVALIDARG; + + hr = IPin_EnumMediaTypes(This->cur_pin, &types); + if (SUCCEEDED(hr)) + { + hr = (IEnumMediaTypes_Next(types, 1, &pmt, NULL) == S_OK + ? S_OK + : E_NOINTERFACE); + IEnumMediaTypes_Release(types); + } + + if (SUCCEEDED(hr)) + { + *pVal = *pmt; + CoTaskMemFree(pmt); + } + + return hr; }
static HRESULT WINAPI MediaDet_GetSampleGrabber(IMediaDet* iface, @@ -500,6 +579,7 @@ HRESULT MediaDet_create(IUnknown * pUnkOuter, LPVOID * ppv) { obj->graph = NULL; obj->source = NULL; obj->splitter = NULL; + obj->cur_pin = NULL; obj->num_streams = -1; obj->cur_stream = 0; *ppv = obj; diff --git a/dlls/qedit/tests/mediadet.c b/dlls/qedit/tests/mediadet.c index 422554d..c97ccc2 100644 --- a/dlls/qedit/tests/mediadet.c +++ b/dlls/qedit/tests/mediadet.c @@ -1,7 +1,7 @@ /* * Unit tests for Media Detector * - * Copyright (C) 2008 Google (Lei Zhang) + * Copyright (C) 2008 Google (Lei Zhang, Dan Hipschman) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -136,6 +136,12 @@ static void test_mediadet(void) hr = IMediaDet_put_CurrentStream(pM, -1); ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
+ hr = IMediaDet_get_StreamMediaType(pM, &mt); + ok(hr == E_INVALIDARG, "IMediaDet_get_StreamMediaType\n"); + + hr = IMediaDet_get_StreamMediaType(pM, NULL); + ok(hr == E_POINTER, "IMediaDet_get_StreamMediaType\n"); + filename = SysAllocString(test_avi_filename); hr = IMediaDet_put_Filename(pM, filename); ok(hr == S_OK, "IMediaDet_put_Filename -> %x\n", hr); @@ -147,6 +153,11 @@ static void test_mediadet(void) ok(hr == S_OK, "IMediaDet_get_CurrentStream\n"); ok(strm == 0, "IMediaDet_get_CurrentStream\n");
+ ZeroMemory(&mt, sizeof mt); + hr = IMediaDet_get_StreamMediaType(pM, &mt); + ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n"); + CoTaskMemFree(mt.pbFormat); + /* Even before get_OutputStreams. */ hr = IMediaDet_put_CurrentStream(pM, 1); ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n"); @@ -195,9 +206,10 @@ static void test_mediadet(void)
ZeroMemory(&mt, sizeof mt); hr = IMediaDet_get_StreamMediaType(pM, &mt); - todo_wine ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n"); - todo_wine ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Video), + ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n"); + ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Video), "IMediaDet_get_StreamMediaType\n"); + CoTaskMemFree(mt.pbFormat);
hr = IMediaDet_Release(pM); ok(hr == 0, "IMediaDet_Release returned: %x\n", hr); @@ -235,12 +247,13 @@ static void test_mediadet(void)
ZeroMemory(&mt, sizeof mt); hr = IMediaDet_get_StreamMediaType(pM, &mt); - todo_wine ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n"); + ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n"); flags += (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video) ? 1 : (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio) ? 2 : 0)); + CoTaskMemFree(mt.pbFormat);
hr = IMediaDet_put_CurrentStream(pM, 1); ok(hr == S_OK, "IMediaDet_put_CurrentStream\n"); @@ -252,14 +265,15 @@ static void test_mediadet(void)
ZeroMemory(&mt, sizeof mt); hr = IMediaDet_get_StreamMediaType(pM, &mt); - todo_wine ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n"); + ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n"); flags += (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video) ? 1 : (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio) ? 2 : 0)); + CoTaskMemFree(mt.pbFormat);
- todo_wine ok(flags == 3, "IMediaDet_get_StreamMediaType\n"); + ok(flags == 3, "IMediaDet_get_StreamMediaType\n");
hr = IMediaDet_put_CurrentStream(pM, 2); ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");