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