[2/3] qedit: Implement IMediaDet_get_FrameRate.

Dan Hipschman dsh at linux.ucla.edu
Wed Apr 9 18:02:02 CDT 2008


---
 dlls/qedit/mediadet.c       |   26 +++++++++++++++-
 dlls/qedit/tests/mediadet.c |   68 +++++++++++++++++++++++-------------------
 2 files changed, 61 insertions(+), 33 deletions(-)

diff --git a/dlls/qedit/mediadet.c b/dlls/qedit/mediadet.c
index 16b2a85..0dab032 100644
--- a/dlls/qedit/mediadet.c
+++ b/dlls/qedit/mediadet.c
@@ -524,8 +524,30 @@ static HRESULT WINAPI MediaDet_GetSampleGrabber(IMediaDet* iface,
 static HRESULT WINAPI MediaDet_get_FrameRate(IMediaDet* iface, double *pVal)
 {
     MediaDetImpl *This = (MediaDetImpl *)iface;
-    FIXME("(%p)->(%p): not implemented!\n", This, pVal);
-    return E_NOTIMPL;
+    AM_MEDIA_TYPE mt;
+    VIDEOINFOHEADER *vh;
+    HRESULT hr;
+
+    TRACE("(%p)\n", This);
+
+    if (!pVal)
+        return E_POINTER;
+
+    hr = MediaDet_get_StreamMediaType(iface, &mt);
+    if (FAILED(hr))
+        return hr;
+
+    if (!IsEqualGUID(&mt.majortype, &MEDIATYPE_Video))
+    {
+        CoTaskMemFree(mt.pbFormat);
+        return VFW_E_INVALIDMEDIATYPE;
+    }
+
+    vh = (VIDEOINFOHEADER *) mt.pbFormat;
+    *pVal = 1.0e7 / (double) vh->AvgTimePerFrame;
+
+    CoTaskMemFree(mt.pbFormat);
+    return S_OK;
 }
 
 static HRESULT WINAPI MediaDet_EnterBitmapGrabMode(IMediaDet* iface,
diff --git a/dlls/qedit/tests/mediadet.c b/dlls/qedit/tests/mediadet.c
index c97ccc2..235133c 100644
--- a/dlls/qedit/tests/mediadet.c
+++ b/dlls/qedit/tests/mediadet.c
@@ -23,6 +23,7 @@
 #define COBJMACROS
 
 #include "ole2.h"
+#include "vfwmsgs.h"
 #include "uuids.h"
 #include "wine/test.h"
 #include "qedit.h"
@@ -95,7 +96,9 @@ static void test_mediadet(void)
     long nstrms = 0;
     long strm;
     AM_MEDIA_TYPE mt;
+    double fps;
     int flags;
+    int i;
 
     /* test.avi has one video stream.  */
     hr = CoCreateInstance(&CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER,
@@ -211,6 +214,13 @@ static void test_mediadet(void)
                  "IMediaDet_get_StreamMediaType\n");
     CoTaskMemFree(mt.pbFormat);
 
+    hr = IMediaDet_get_FrameRate(pM, NULL);
+    ok(hr == E_POINTER, "IMediaDet_get_FrameRate\n");
+
+    hr = IMediaDet_get_FrameRate(pM, &fps);
+    ok(hr == S_OK, "IMediaDet_get_FrameRate\n");
+    ok(fps == 10.0, "IMediaDet_get_FrameRate\n");
+
     hr = IMediaDet_Release(pM);
     ok(hr == 0, "IMediaDet_Release returned: %x\n", hr);
 
@@ -242,37 +252,33 @@ static void test_mediadet(void)
        for both an audio and video stream.  */
     flags = 0;
 
-    hr = IMediaDet_put_CurrentStream(pM, 0);
-    ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
-
-    ZeroMemory(&mt, sizeof mt);
-    hr = IMediaDet_get_StreamMediaType(pM, &mt);
-    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");
-
-    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);
-    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);
-
+    for (i = 0; i < 2; ++i)
+    {
+        hr = IMediaDet_put_CurrentStream(pM, i);
+        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 == i, "IMediaDet_get_CurrentStream\n");
+
+        ZeroMemory(&mt, sizeof mt);
+        hr = IMediaDet_get_StreamMediaType(pM, &mt);
+        ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
+        flags += (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video)
+                  ? 1
+                  : (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio)
+                     ? 2
+                     : 0));
+
+        if (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio))
+        {
+            hr = IMediaDet_get_FrameRate(pM, &fps);
+            ok(hr == VFW_E_INVALIDMEDIATYPE, "IMediaDet_get_FrameRate\n");
+        }
+
+        CoTaskMemFree(mt.pbFormat);
+    }
     ok(flags == 3, "IMediaDet_get_StreamMediaType\n");
 
     hr = IMediaDet_put_CurrentStream(pM, 2);



More information about the wine-patches mailing list