qcap: Enumerate one media type if pin format has been set.
Signed-off-by: Jeff Smith <whydoubt@gmail.com> Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3757956e8f
commit
7712a48c89
dlls/qcap
|
@ -51,6 +51,7 @@ struct video_capture_device_ops
|
||||||
HRESULT (*check_format)(struct video_capture_device *device, const AM_MEDIA_TYPE *mt);
|
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 (*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_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);
|
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);
|
LONG (*get_caps_count)(struct video_capture_device *device);
|
||||||
HRESULT (*get_prop_range)(struct video_capture_device *device, VideoProcAmpProperty property,
|
HRESULT (*get_prop_range)(struct video_capture_device *device, VideoProcAmpProperty property,
|
||||||
|
|
|
@ -109,7 +109,7 @@ static void test_stream_config(IPin *pin)
|
||||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||||
DeleteMediaType(format2);
|
DeleteMediaType(format2);
|
||||||
hr = IEnumMediaTypes_Next(enum_media_types, 1, &format2, NULL);
|
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);
|
IEnumMediaTypes_Release(enum_media_types);
|
||||||
|
|
||||||
format->majortype = MEDIATYPE_Audio;
|
format->majortype = MEDIATYPE_Audio;
|
||||||
|
@ -200,10 +200,7 @@ static void test_stream_config(IPin *pin)
|
||||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||||
hr = IEnumMediaTypes_Next(enum_media_types, 1, &format2, NULL);
|
hr = IEnumMediaTypes_Next(enum_media_types, 1, &format2, NULL);
|
||||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||||
|
ok(compare_media_types(format, format2), "Media types didn't match.\n");
|
||||||
todo_wine_if (!compare_media_types(format, format2))
|
|
||||||
ok(compare_media_types(format, format2), "Media types didn't match.\n");
|
|
||||||
|
|
||||||
DeleteMediaType(format2);
|
DeleteMediaType(format2);
|
||||||
IEnumMediaTypes_Release(enum_media_types);
|
IEnumMediaTypes_Release(enum_media_types);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
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)
|
static __u32 v4l2_cid_from_qcap_property(VideoProcAmpProperty property)
|
||||||
{
|
{
|
||||||
switch (property)
|
switch (property)
|
||||||
|
@ -515,6 +530,7 @@ static const struct video_capture_device_ops v4l_device_ops =
|
||||||
.check_format = v4l_device_check_format,
|
.check_format = v4l_device_check_format,
|
||||||
.set_format = v4l_device_set_format,
|
.set_format = v4l_device_set_format,
|
||||||
.get_format = v4l_device_get_format,
|
.get_format = v4l_device_get_format,
|
||||||
|
.get_media_type = v4l_device_get_media_type,
|
||||||
.get_caps = v4l_device_get_caps,
|
.get_caps = v4l_device_get_caps,
|
||||||
.get_caps_count = v4l_device_get_caps_count,
|
.get_caps_count = v4l_device_get_caps_count,
|
||||||
.get_prop_range = v4l_device_get_prop_range,
|
.get_prop_range = v4l_device_get_prop_range,
|
||||||
|
|
|
@ -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,
|
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);
|
VfwCapture *filter = impl_from_strmbase_pin(pin);
|
||||||
AM_MEDIA_TYPE *vfw_pmt;
|
return filter->device->ops->get_media_type(filter->device, index, mt);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
|
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
|
||||||
|
|
Loading…
Reference in New Issue