Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/waveparser.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c index 609f192820..2ea3dc0427 100644 --- a/dlls/quartz/waveparser.c +++ b/dlls/quartz/waveparser.c @@ -36,7 +36,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
-static const WCHAR wcsOutputPinName[] = {'o','u','t','p','u','t',' ','p','i','n',0}; +static const WCHAR outputW[] = {'o','u','t','p','u','t',0};
typedef struct WAVEParserImpl { @@ -256,7 +256,7 @@ static HRESULT WAVEParser_InputPin_PreConnect(IPin * iface, IPin * pConnectPin,
piOutput.dir = PINDIR_OUTPUT; piOutput.pFilter = &pWAVEParser->Parser.filter.IBaseFilter_iface; - lstrcpynW(piOutput.achName, wcsOutputPinName, ARRAY_SIZE(piOutput.achName)); + lstrcpynW(piOutput.achName, outputW, ARRAY_SIZE(piOutput.achName));
hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); pos += sizeof(list);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/waveparser.c | 53 ++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c index 377d33be83..e2ee1e8f3b 100644 --- a/dlls/quartz/tests/waveparser.c +++ b/dlls/quartz/tests/waveparser.c @@ -23,6 +23,7 @@ #include "wine/test.h"
static const WCHAR sink_name[] = {'i','n','p','u','t',' ','p','i','n',0}; +static const WCHAR source_name[] = {'o','u','t','p','u','t',0};
static IBaseFilter *create_wave_parser(void) { @@ -276,12 +277,64 @@ todo_wine ok(ret, "Failed to delete file, error %u.\n", GetLastError()); }
+static void test_find_pin(void) +{ + const WCHAR *filename = load_resource(wavefile); + IBaseFilter *filter = create_wave_parser(); + IFilterGraph2 *graph; + IEnumPins *enum_pins; + IPin *pin, *pin2; + HRESULT hr; + ULONG ref; + BOOL ret; + + hr = IBaseFilter_FindPin(filter, sink_name, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + IPin_Release(pin); + + hr = IBaseFilter_FindPin(filter, source_name, &pin); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); + + graph = connect_input(filter, filename); + + hr = IBaseFilter_EnumPins(filter, &enum_pins); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IBaseFilter_FindPin(filter, source_name, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); +todo_wine + ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + IPin_Release(pin); + IPin_Release(pin2); + + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IBaseFilter_FindPin(filter, sink_name, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); +todo_wine + ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); + IPin_Release(pin); + IPin_Release(pin2); + + IEnumPins_Release(enum_pins); + IFilterGraph2_Release(graph); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); +} + START_TEST(waveparser) { CoInitialize(NULL);
test_interfaces(); test_enum_pins(); + test_find_pin();
CoUninitialize(); }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/waveparser.c | 76 ++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+)
diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c index e2ee1e8f3b..90a520941f 100644 --- a/dlls/quartz/tests/waveparser.c +++ b/dlls/quartz/tests/waveparser.c @@ -328,6 +328,81 @@ todo_wine ok(ret, "Failed to delete file, error %u.\n", GetLastError()); }
+static void test_pin_info(void) +{ + const WCHAR *filename = load_resource(wavefile); + IBaseFilter *filter = create_wave_parser(); + ULONG ref, expect_ref; + IFilterGraph2 *graph; + PIN_DIRECTION dir; + PIN_INFO info; + HRESULT hr; + WCHAR *id; + IPin *pin; + BOOL ret; + + graph = connect_input(filter, filename); + + hr = IBaseFilter_FindPin(filter, sink_name, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + expect_ref = get_refcount(filter); + ref = get_refcount(pin); + ok(ref == expect_ref, "Got unexpected refcount %d.\n", ref); + + hr = IPin_QueryPinInfo(pin, &info); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); + ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); + ok(!lstrcmpW(info.achName, sink_name), "Got name %s.\n", wine_dbgstr_w(info.achName)); + ref = get_refcount(filter); + ok(ref == expect_ref + 1, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(pin); +todo_wine + ok(ref == expect_ref + 1, "Got unexpected refcount %d.\n", ref); + IBaseFilter_Release(info.pFilter); + + hr = IPin_QueryDirection(pin, &dir); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); + + hr = IPin_QueryId(pin, &id); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!lstrcmpW(id, sink_name), "Got id %s.\n", wine_dbgstr_w(id)); + CoTaskMemFree(id); + + IPin_Release(pin); + + hr = IBaseFilter_FindPin(filter, source_name, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + check_interface(pin, &IID_IPin, TRUE); + check_interface(pin, &IID_IMediaSeeking, TRUE); + + hr = IPin_QueryPinInfo(pin, &info); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); + ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); + ok(!lstrcmpW(info.achName, source_name), "Got name %s.\n", wine_dbgstr_w(info.achName)); + IBaseFilter_Release(info.pFilter); + + hr = IPin_QueryDirection(pin, &dir); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); + + hr = IPin_QueryId(pin, &id); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!lstrcmpW(id, source_name), "Got id %s.\n", wine_dbgstr_w(id)); + CoTaskMemFree(id); + + IPin_Release(pin); + + IFilterGraph2_Release(graph); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); +} + START_TEST(waveparser) { CoInitialize(NULL); @@ -335,6 +410,7 @@ START_TEST(waveparser) test_interfaces(); test_enum_pins(); test_find_pin(); + test_pin_info();
CoUninitialize(); }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/waveparser.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c index 90a520941f..f9d9fe5a38 100644 --- a/dlls/quartz/tests/waveparser.c +++ b/dlls/quartz/tests/waveparser.c @@ -117,7 +117,10 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO
static void test_interfaces(void) { + const WCHAR *filename = load_resource(wavefile); IBaseFilter *filter = create_wave_parser(); + IFilterGraph2 *graph = connect_input(filter, filename); + IPin *pin;
check_interface(filter, &IID_IBaseFilter, TRUE); check_interface(filter, &IID_IMediaFilter, TRUE); @@ -137,7 +140,33 @@ static void test_interfaces(void) check_interface(filter, &IID_IReferenceClock, FALSE); check_interface(filter, &IID_IVideoWindow, FALSE);
+ IBaseFilter_FindPin(filter, sink_name, &pin); + + check_interface(pin, &IID_IPin, TRUE); + check_interface(pin, &IID_IUnknown, TRUE); + + check_interface(pin, &IID_IKsPropertySet, FALSE); + check_interface(pin, &IID_IMemInputPin, FALSE); + check_interface(pin, &IID_IMediaPosition, FALSE); + todo_wine check_interface(pin, &IID_IMediaSeeking, FALSE); + + IPin_Release(pin); + + IBaseFilter_FindPin(filter, source_name, &pin); + + todo_wine check_interface(pin, &IID_IMediaPosition, TRUE); + check_interface(pin, &IID_IMediaSeeking, TRUE); + check_interface(pin, &IID_IPin, TRUE); + check_interface(pin, &IID_IUnknown, TRUE); + + check_interface(pin, &IID_IAsyncReader, FALSE); + check_interface(pin, &IID_IKsPropertySet, FALSE); + + IPin_Release(pin); + IBaseFilter_Release(filter); + IFilterGraph2_Release(graph); + DeleteFileW(filename); }
static void test_enum_pins(void)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/waveparser.c | 120 +++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+)
diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c index f9d9fe5a38..09770b5cb0 100644 --- a/dlls/quartz/tests/waveparser.c +++ b/dlls/quartz/tests/waveparser.c @@ -432,6 +432,125 @@ todo_wine ok(ret, "Failed to delete file, error %u.\n", GetLastError()); }
+static void test_media_types(void) +{ + static const WAVEFORMATEX expect_wfx = {WAVE_FORMAT_PCM, 1, 44100, 44100, 1, 8, 0}; + + const WCHAR *filename = load_resource(wavefile); + IBaseFilter *filter = create_wave_parser(); + AM_MEDIA_TYPE mt = {0}, *pmt; + IEnumMediaTypes *enummt; + IFilterGraph2 *graph; + HRESULT hr; + ULONG ref; + IPin *pin; + BOOL ret; + + IBaseFilter_FindPin(filter, sink_name, &pin); + + hr = IPin_EnumMediaTypes(pin, &enummt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + IEnumMediaTypes_Release(enummt); + + mt.majortype = MEDIATYPE_Stream; + mt.subtype = MEDIASUBTYPE_WAVE; + hr = IPin_QueryAccept(pin, &mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + mt.bFixedSizeSamples = TRUE; + mt.bTemporalCompression = TRUE; + mt.lSampleSize = 123; + mt.formattype = FORMAT_VideoInfo; + hr = IPin_QueryAccept(pin, &mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + mt.majortype = GUID_NULL; + hr = IPin_QueryAccept(pin, &mt); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + mt.majortype = MEDIATYPE_Stream; + + mt.subtype = GUID_NULL; + hr = IPin_QueryAccept(pin, &mt); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + mt.subtype = MEDIASUBTYPE_WAVE; + + graph = connect_input(filter, filename); + + hr = IPin_EnumMediaTypes(pin, &enummt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + IEnumMediaTypes_Release(enummt); + IPin_Release(pin); + + IBaseFilter_FindPin(filter, source_name, &pin); + + hr = IPin_EnumMediaTypes(pin, &enummt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Audio), "Got major type %s.\n", + wine_dbgstr_guid(&pmt->majortype)); + ok(IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_PCM), "Got subtype %s\n", + wine_dbgstr_guid(&pmt->subtype)); + todo_wine ok(pmt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", pmt->bFixedSizeSamples); + ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression); + todo_wine ok(pmt->lSampleSize == 1, "Got sample size %u.\n", pmt->lSampleSize); + ok(IsEqualGUID(&pmt->formattype, &FORMAT_WaveFormatEx), "Got format type %s.\n", + wine_dbgstr_guid(&pmt->formattype)); + ok(!pmt->pUnk, "Got pUnk %p.\n", pmt->pUnk); + todo_wine ok(pmt->cbFormat == sizeof(WAVEFORMATEX), "Got format size %u.\n", pmt->cbFormat); + ok(!memcmp(pmt->pbFormat, &expect_wfx, sizeof(WAVEFORMATEX)), "Format blocks didn't match.\n"); + + hr = IPin_QueryAccept(pin, pmt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + pmt->bFixedSizeSamples = FALSE; + pmt->bTemporalCompression = TRUE; + pmt->lSampleSize = 123; + hr = IPin_QueryAccept(pin, pmt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + pmt->majortype = GUID_NULL; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + pmt->majortype = MEDIATYPE_Audio; + + pmt->subtype = GUID_NULL; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + pmt->subtype = MEDIASUBTYPE_WAVE; + + pmt->formattype = GUID_NULL; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + pmt->formattype = FORMAT_None; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + CoTaskMemFree(pmt->pbFormat); + CoTaskMemFree(pmt); + + hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + IEnumMediaTypes_Release(enummt); + IPin_Release(pin); + + IFilterGraph2_Release(graph); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); +} + START_TEST(waveparser) { CoInitialize(NULL); @@ -440,6 +559,7 @@ START_TEST(waveparser) test_enum_pins(); test_find_pin(); test_pin_info(); + test_media_types();
CoUninitialize(); }
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=48707
Your paranoid android.
=== debian9 (32 bit report) ===
quartz: waveparser.c:504: Test failed: Got temporal compression 1218784. waveparser.c:510: Test failed: Format blocks didn't match.
=== debian9 (32 bit French report) ===
quartz: waveparser.c:504: Test failed: Got temporal compression 1218992. waveparser.c:510: Test failed: Format blocks didn't match.
=== debian9 (32 bit Japanese:Japan report) ===
quartz: waveparser.c:504: Test failed: Got temporal compression 1219016. waveparser.c:510: Test failed: Format blocks didn't match.
=== debian9 (32 bit Chinese:China report) ===
quartz: waveparser.c:504: Test failed: Got temporal compression 1218144. waveparser.c:510: Test failed: Format blocks didn't match.
=== debian9 (32 bit WoW report) ===
quartz: waveparser.c:504: Test failed: Got temporal compression 1218856. waveparser.c:510: Test failed: Format blocks didn't match.