[PATCH v4 3/3] qcap: Enumerate one media type if pin format has been set.

Zebediah Figura z.figura12 at gmail.com
Tue Sep 8 11:15:10 CDT 2020


From: Jeff Smith <whydoubt at gmail.com>

Signed-off-by: Jeff Smith <whydoubt at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
v4: Minor spacing changes; change a couple types to unsigned.

 dlls/qcap/qcap_private.h       |  1 +
 dlls/qcap/tests/videocapture.c |  7 ++-----
 dlls/qcap/v4l.c                | 16 ++++++++++++++++
 dlls/qcap/vfwcapture.c         | 15 ++-------------
 4 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/dlls/qcap/qcap_private.h b/dlls/qcap/qcap_private.h
index 70a8c85ad47..bbbe2ef43ec 100644
--- a/dlls/qcap/qcap_private.h
+++ b/dlls/qcap/qcap_private.h
@@ -51,6 +51,7 @@ struct video_capture_device_ops
     HRESULT (*check_format)(struct video_capture_device *device, const AM_MEDIA_TYPE *mt);
     HRESULT (*set_format)(struct video_capture_device *device, const AM_MEDIA_TYPE *mt);
     HRESULT (*get_format)(struct video_capture_device *device, AM_MEDIA_TYPE *mt);
+    HRESULT (*get_media_type)(struct video_capture_device *device, unsigned int index, AM_MEDIA_TYPE *mt);
     HRESULT (*get_caps)(struct video_capture_device *device, LONG index, AM_MEDIA_TYPE **mt, VIDEO_STREAM_CONFIG_CAPS *caps);
     LONG (*get_caps_count)(struct video_capture_device *device);
     HRESULT (*get_prop_range)(struct video_capture_device *device, VideoProcAmpProperty property,
diff --git a/dlls/qcap/tests/videocapture.c b/dlls/qcap/tests/videocapture.c
index 8bda036e1d9..e8175f5df9a 100644
--- a/dlls/qcap/tests/videocapture.c
+++ b/dlls/qcap/tests/videocapture.c
@@ -109,7 +109,7 @@ static void test_stream_config(IPin *pin)
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     DeleteMediaType(format2);
     hr = IEnumMediaTypes_Next(enum_media_types, 1, &format2, NULL);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     IEnumMediaTypes_Release(enum_media_types);
 
     format->majortype = MEDIATYPE_Audio;
@@ -200,10 +200,7 @@ static void test_stream_config(IPin *pin)
         ok(hr == S_OK, "Got hr %#x.\n", hr);
         hr = IEnumMediaTypes_Next(enum_media_types, 1, &format2, NULL);
         ok(hr == S_OK, "Got hr %#x.\n", hr);
-
-        todo_wine_if (!compare_media_types(format, format2))
-            ok(compare_media_types(format, format2), "Media types didn't match.\n");
-
+        ok(compare_media_types(format, format2), "Media types didn't match.\n");
         DeleteMediaType(format2);
         IEnumMediaTypes_Release(enum_media_types);
 
diff --git a/dlls/qcap/v4l.c b/dlls/qcap/v4l.c
index 94fe6b7dd0d..b1d7e68d426 100644
--- a/dlls/qcap/v4l.c
+++ b/dlls/qcap/v4l.c
@@ -227,6 +227,21 @@ static HRESULT v4l_device_get_format(struct video_capture_device *iface, AM_MEDI
     return CopyMediaType(mt, &device->current_caps->media_type);
 }
 
+static HRESULT v4l_device_get_media_type(struct video_capture_device *iface,
+        unsigned int index, AM_MEDIA_TYPE *mt)
+{
+    struct v4l_device *device = v4l_device(iface);
+    unsigned int caps_count = (device->current_caps) ? 1 : device->caps_count;
+
+    if (index >= caps_count)
+        return VFW_S_NO_MORE_ITEMS;
+
+    if (device->current_caps)
+        return CopyMediaType(mt, &device->current_caps->media_type);
+
+    return CopyMediaType(mt, &device->caps[index].media_type);
+}
+
 static __u32 v4l2_cid_from_qcap_property(VideoProcAmpProperty property)
 {
     switch (property)
@@ -515,6 +530,7 @@ static const struct video_capture_device_ops v4l_device_ops =
     .check_format = v4l_device_check_format,
     .set_format = v4l_device_set_format,
     .get_format = v4l_device_get_format,
+    .get_media_type = v4l_device_get_media_type,
     .get_caps = v4l_device_get_caps,
     .get_caps_count = v4l_device_get_caps_count,
     .get_prop_range = v4l_device_get_prop_range,
diff --git a/dlls/qcap/vfwcapture.c b/dlls/qcap/vfwcapture.c
index 910be107b0b..c4df4cb1c81 100644
--- a/dlls/qcap/vfwcapture.c
+++ b/dlls/qcap/vfwcapture.c
@@ -521,21 +521,10 @@ static HRESULT source_query_accept(struct strmbase_pin *pin, const AM_MEDIA_TYPE
 }
 
 static HRESULT source_get_media_type(struct strmbase_pin *pin,
-        unsigned int index, AM_MEDIA_TYPE *pmt)
+        unsigned int index, AM_MEDIA_TYPE *mt)
 {
     VfwCapture *filter = impl_from_strmbase_pin(pin);
-    AM_MEDIA_TYPE *vfw_pmt;
-    HRESULT hr;
-
-    if (index >= filter->device->ops->get_caps_count(filter->device))
-        return VFW_S_NO_MORE_ITEMS;
-
-    if (SUCCEEDED(hr = filter->device->ops->get_caps(filter->device, index, &vfw_pmt, NULL)))
-    {
-        CopyMediaType(pmt, vfw_pmt);
-        DeleteMediaType(vfw_pmt);
-    }
-    return hr;
+    return filter->device->ops->get_media_type(filter->device, index, mt);
 }
 
 static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
-- 
2.28.0




More information about the wine-devel mailing list