[PATCH v2 4/4] qcap: Enumerate one media type if pin format has been set.
Jeff Smith
whydoubt at gmail.com
Mon Sep 7 14:13:14 CDT 2020
Signed-off-by: Jeff Smith <whydoubt at gmail.com>
---
dlls/qcap/qcap_private.h | 1 +
dlls/qcap/tests/videocapture.c | 6 +-----
dlls/qcap/v4l.c | 16 ++++++++++++++++
dlls/qcap/vfwcapture.c | 13 +------------
4 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/dlls/qcap/qcap_private.h b/dlls/qcap/qcap_private.h
index 70a8c85ad4..a5946ecfd9 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, LONG 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 dcce3a7869..99175c0b3f 100644
--- a/dlls/qcap/tests/videocapture.c
+++ b/dlls/qcap/tests/videocapture.c
@@ -110,7 +110,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;
@@ -201,11 +201,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);
-
- /* Which media types will match varies in wine depending on the attached webcam */
- todo_wine_if(compare_media_types(format, format2) == FALSE)
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 89b57def87..e64db880f3 100644
--- a/dlls/qcap/v4l.c
+++ b/dlls/qcap/v4l.c
@@ -258,6 +258,21 @@ static HRESULT v4l_device_get_format(struct video_capture_device *iface, AM_MEDI
return CopyMediaType(mt, &device->caps[0].media_type);
}
+static HRESULT v4l_device_get_media_type(struct video_capture_device *iface, LONG index,
+ AM_MEDIA_TYPE *mt)
+{
+ struct v4l_device *device = v4l_device(iface);
+ LONG 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)
@@ -552,6 +567,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 17e56a7ee9..e5a1d6d1fc 100644
--- a/dlls/qcap/vfwcapture.c
+++ b/dlls/qcap/vfwcapture.c
@@ -526,18 +526,7 @@ static HRESULT source_get_media_type(struct strmbase_pin *pin,
unsigned int index, AM_MEDIA_TYPE *pmt)
{
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, pmt);
}
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
--
2.23.0
More information about the wine-devel
mailing list