Signed-off-by: Jeff Smith whydoubt@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)