Dan Hipschman : qedit: Implement IMediaDet_get_StreamMediaType.
Alexandre Julliard
julliard at winehq.org
Thu Apr 10 04:39:26 CDT 2008
Module: wine
Branch: master
Commit: 3b0d68e4093622cdf7a943cc5e3825e81176be31
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3b0d68e4093622cdf7a943cc5e3825e81176be31
Author: Dan Hipschman <dsh at 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");
More information about the wine-cvs
mailing list