Dan Hipschman : qedit: Implement IMediaDet_(put|get)_CurrentStream.
Alexandre Julliard
julliard at winehq.org
Wed Apr 9 05:31:34 CDT 2008
Module: wine
Branch: master
Commit: 33f270afc07541293c0f7a142473a66201547ba5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=33f270afc07541293c0f7a142473a66201547ba5
Author: Dan Hipschman <dsh at linux.ucla.edu>
Date: Tue Apr 8 16:55:37 2008 -0700
qedit: Implement IMediaDet_(put|get)_CurrentStream.
---
dlls/qedit/mediadet.c | 41 +++++++++++++++++++++++--
dlls/qedit/tests/mediadet.c | 69 +++++++++++++++++++++++++++++++++++++++---
2 files changed, 101 insertions(+), 9 deletions(-)
diff --git a/dlls/qedit/mediadet.c b/dlls/qedit/mediadet.c
index 3a7cc1b..abccca9 100644
--- a/dlls/qedit/mediadet.c
+++ b/dlls/qedit/mediadet.c
@@ -37,6 +37,8 @@ typedef struct MediaDetImpl {
IGraphBuilder *graph;
IBaseFilter *source;
IBaseFilter *splitter;
+ long num_streams;
+ long cur_stream;
} MediaDetImpl;
static void MD_cleanup(MediaDetImpl *This)
@@ -47,6 +49,8 @@ static void MD_cleanup(MediaDetImpl *This)
This->splitter = NULL;
if (This->graph) IGraphBuilder_Release(This->graph);
This->graph = NULL;
+ This->num_streams = -1;
+ This->cur_stream = 0;
}
static ULONG WINAPI MediaDet_AddRef(IMediaDet* iface)
@@ -116,6 +120,12 @@ static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, long *pVal)
if (!This->splitter)
return E_INVALIDARG;
+ if (This->num_streams != -1)
+ {
+ *pVal = This->num_streams;
+ return S_OK;
+ }
+
*pVal = 0;
hr = IBaseFilter_EnumPins(This->splitter, &pins);
@@ -138,21 +148,42 @@ static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, long *pVal)
}
IEnumPins_Release(pins);
+ This->num_streams = *pVal;
return S_OK;
}
static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, long *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
- FIXME("(%p)->(%p): not implemented!\n", This, pVal);
- return E_NOTIMPL;
+ TRACE("(%p)\n", This);
+
+ if (!pVal)
+ return E_POINTER;
+
+ *pVal = This->cur_stream;
+ return S_OK;
}
static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
- FIXME("(%p)->(%ld): not implemented!\n", This, newVal);
- return E_NOTIMPL;
+ HRESULT hr;
+
+ TRACE("(%p)->(%ld)\n", This, newVal);
+
+ if (This->num_streams == -1)
+ {
+ long n;
+ hr = MediaDet_get_OutputStreams(iface, &n);
+ if (FAILED(hr))
+ return hr;
+ }
+
+ if (newVal < 0 || This->num_streams <= newVal)
+ return E_INVALIDARG;
+
+ This->cur_stream = newVal;
+ return S_OK;
}
static HRESULT WINAPI MediaDet_get_StreamType(IMediaDet* iface, GUID *pVal)
@@ -469,6 +500,8 @@ HRESULT MediaDet_create(IUnknown * pUnkOuter, LPVOID * ppv) {
obj->graph = NULL;
obj->source = NULL;
obj->splitter = NULL;
+ obj->num_streams = -1;
+ obj->cur_stream = 0;
*ppv = obj;
return S_OK;
diff --git a/dlls/qedit/tests/mediadet.c b/dlls/qedit/tests/mediadet.c
index 237dfb9..422554d 100644
--- a/dlls/qedit/tests/mediadet.c
+++ b/dlls/qedit/tests/mediadet.c
@@ -120,11 +120,37 @@ static void test_mediadet(void)
ok(hr == E_INVALIDARG, "IMediaDet_get_OutputStreams\n");
ok(nstrms == -1, "IMediaDet_get_OutputStreams\n");
+ strm = -1;
+ /* The stream defaults to 0, even without a file! */
+ hr = IMediaDet_get_CurrentStream(pM, &strm);
+ ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
+ ok(strm == 0, "IMediaDet_get_CurrentStream\n");
+
+ hr = IMediaDet_get_CurrentStream(pM, NULL);
+ ok(hr == E_POINTER, "IMediaDet_get_CurrentStream\n");
+
+ /* But put_CurrentStream doesn't. */
+ hr = IMediaDet_put_CurrentStream(pM, 0);
+ ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
+
+ hr = IMediaDet_put_CurrentStream(pM, -1);
+ ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
+
filename = SysAllocString(test_avi_filename);
hr = IMediaDet_put_Filename(pM, filename);
ok(hr == S_OK, "IMediaDet_put_Filename -> %x\n", hr);
SysFreeString(filename);
+ strm = -1;
+ /* The stream defaults to 0. */
+ hr = IMediaDet_get_CurrentStream(pM, &strm);
+ ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
+ ok(strm == 0, "IMediaDet_get_CurrentStream\n");
+
+ /* Even before get_OutputStreams. */
+ hr = IMediaDet_put_CurrentStream(pM, 1);
+ ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
+
hr = IMediaDet_get_OutputStreams(pM, &nstrms);
ok(hr == S_OK, "IMediaDet_get_OutputStreams\n");
ok(nstrms == 1, "IMediaDet_get_OutputStreams\n");
@@ -139,13 +165,33 @@ static void test_mediadet(void)
hr = IMediaDet_get_Filename(pM, NULL);
ok(hr == E_POINTER, "IMediaDet_get_Filename\n");
+ strm = -1;
+ hr = IMediaDet_get_CurrentStream(pM, &strm);
+ ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
+ ok(strm == 0, "IMediaDet_get_CurrentStream\n");
+
+ hr = IMediaDet_get_CurrentStream(pM, NULL);
+ ok(hr == E_POINTER, "IMediaDet_get_CurrentStream\n");
+
+ hr = IMediaDet_put_CurrentStream(pM, -1);
+ ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
+
+ hr = IMediaDet_put_CurrentStream(pM, 1);
+ ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
+
+ /* Try again. */
+ strm = -1;
+ hr = IMediaDet_get_CurrentStream(pM, &strm);
+ ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
+ ok(strm == 0, "IMediaDet_get_CurrentStream\n");
+
hr = IMediaDet_put_CurrentStream(pM, 0);
- todo_wine ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
+ ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
strm = -1;
hr = IMediaDet_get_CurrentStream(pM, &strm);
- todo_wine ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
- todo_wine ok(strm == 0, "IMediaDet_get_CurrentStream\n");
+ 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);
@@ -185,7 +231,7 @@ static void test_mediadet(void)
flags = 0;
hr = IMediaDet_put_CurrentStream(pM, 0);
- todo_wine ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
+ ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
ZeroMemory(&mt, sizeof mt);
hr = IMediaDet_get_StreamMediaType(pM, &mt);
@@ -197,7 +243,12 @@ static void test_mediadet(void)
: 0));
hr = IMediaDet_put_CurrentStream(pM, 1);
- todo_wine ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
+ ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
+
+ strm = -1;
+ hr = IMediaDet_get_CurrentStream(pM, &strm);
+ ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
+ ok(strm == 1, "IMediaDet_get_CurrentStream\n");
ZeroMemory(&mt, sizeof mt);
hr = IMediaDet_get_StreamMediaType(pM, &mt);
@@ -210,6 +261,14 @@ static void test_mediadet(void)
todo_wine ok(flags == 3, "IMediaDet_get_StreamMediaType\n");
+ hr = IMediaDet_put_CurrentStream(pM, 2);
+ ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
+
+ strm = -1;
+ hr = IMediaDet_get_CurrentStream(pM, &strm);
+ ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
+ ok(strm == 1, "IMediaDet_get_CurrentStream\n");
+
hr = IMediaDet_Release(pM);
ok(hr == 0, "IMediaDet_Release returned: %x\n", hr);
More information about the wine-cvs
mailing list