The test now consistently fails, probably since the docker image update, with x264enc failing to allocate memory. The failure seem to happen only if some tests are run before it, but that seem to come from memory fragmentation rather than leaks. Except for the leaks fixed here, I couldn't find any other through Valgrind or GStreamer leak checkers.
-- v2: mf/tests: Skip memory-hungry H264 encoder tests on 32bit. mf/tests: Avoid leaking D3D resources through IMFTrackedSample. mf/tests: Fix some leaks in transform tests. winegstreamer: Fix some video decoder media type leaks. mp3dmod: Avoid uninitialized variable access. mp3dmod: Fix some media type leaks.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mp3dmod/mp3dmod.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/dlls/mp3dmod/mp3dmod.c b/dlls/mp3dmod/mp3dmod.c index bf518f38f39..383ad9818b8 100644 --- a/dlls/mp3dmod/mp3dmod.c +++ b/dlls/mp3dmod/mp3dmod.c @@ -805,7 +805,9 @@ static HRESULT WINAPI MFTransform_GetInputAvailableType(IMFTransform *iface, DWO if (FAILED(hr = MFCreateMediaType(type))) return hr;
- return MFInitMediaTypeFromAMMediaType(*type, (AM_MEDIA_TYPE*)&pt); + hr = MFInitMediaTypeFromAMMediaType(*type, (AM_MEDIA_TYPE*)&pt); + MoFreeMediaType(&pt); + return hr; }
static HRESULT WINAPI MFTransform_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, @@ -887,6 +889,7 @@ static HRESULT WINAPI MFTransform_SetInputType(IMFTransform *iface, DWORD id, IM return hr;
hr = IMediaObject_SetInputType(&decoder->IMediaObject_iface, id, &mt, flags); + MoFreeMediaType(&mt);
if (hr == S_FALSE) return MF_E_INVALIDMEDIATYPE; @@ -910,6 +913,7 @@ static HRESULT WINAPI MFTransform_SetOutputType(IMFTransform *iface, DWORD id, I return hr;
hr = IMediaObject_SetOutputType(&decoder->IMediaObject_iface, id, &mt, flags); + MoFreeMediaType(&mt);
if (hr == S_FALSE) return MF_E_INVALIDMEDIATYPE; @@ -933,7 +937,9 @@ static HRESULT WINAPI MFTransform_GetInputCurrentType(IMFTransform *iface, DWORD if (FAILED(hr = MFCreateMediaType(out))) return hr;
- return MFInitMediaTypeFromAMMediaType(*out, (AM_MEDIA_TYPE*)&mt); + hr = MFInitMediaTypeFromAMMediaType(*out, (AM_MEDIA_TYPE*)&mt); + MoFreeMediaType(&mt); + return hr; }
static HRESULT WINAPI MFTransform_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **out) @@ -950,7 +956,9 @@ static HRESULT WINAPI MFTransform_GetOutputCurrentType(IMFTransform *iface, DWOR if (FAILED(hr = MFCreateMediaType(out))) return hr;
- return MFInitMediaTypeFromAMMediaType(*out, (AM_MEDIA_TYPE*)&mt); + hr = MFInitMediaTypeFromAMMediaType(*out, (AM_MEDIA_TYPE*)&mt); + MoFreeMediaType(&mt); + return hr; }
static HRESULT WINAPI MFTransform_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags)
From: Rémi Bernon rbernon@codeweavers.com
Tests show that some AM_MEDIA_TYPE fields aren't touched, but MFInitMediaTypeFromAMMediaType may try to access them. --- dlls/mp3dmod/mp3dmod.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/mp3dmod/mp3dmod.c b/dlls/mp3dmod/mp3dmod.c index 383ad9818b8..e542644c7b1 100644 --- a/dlls/mp3dmod/mp3dmod.c +++ b/dlls/mp3dmod/mp3dmod.c @@ -794,7 +794,7 @@ static HRESULT WINAPI MFTransform_GetInputAvailableType(IMFTransform *iface, DWO IMFMediaType **type) { struct mp3_decoder *decoder = impl_from_IMFTransform(iface); - DMO_MEDIA_TYPE pt; + DMO_MEDIA_TYPE pt = {0}; HRESULT hr;
TRACE("iface %p, id %#lx, index %#lx, type %p.\n", iface, id, index, type); @@ -926,7 +926,7 @@ static HRESULT WINAPI MFTransform_SetOutputType(IMFTransform *iface, DWORD id, I static HRESULT WINAPI MFTransform_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **out) { struct mp3_decoder *decoder = impl_from_IMFTransform(iface); - DMO_MEDIA_TYPE mt; + DMO_MEDIA_TYPE mt = {0}; HRESULT hr;
TRACE("iface %p, id %#lx, out %p.\n", iface, id, out); @@ -945,7 +945,7 @@ static HRESULT WINAPI MFTransform_GetInputCurrentType(IMFTransform *iface, DWORD static HRESULT WINAPI MFTransform_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **out) { struct mp3_decoder *decoder = impl_from_IMFTransform(iface); - DMO_MEDIA_TYPE mt; + DMO_MEDIA_TYPE mt = {0}; HRESULT hr;
TRACE("iface %p, id %#lx, out %p.\n", iface, id, out);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/video_decoder.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/winegstreamer/video_decoder.c b/dlls/winegstreamer/video_decoder.c index bee035f1848..d571ef728ee 100644 --- a/dlls/winegstreamer/video_decoder.c +++ b/dlls/winegstreamer/video_decoder.c @@ -176,10 +176,14 @@ static ULONG WINAPI unknown_Release(IUnknown *iface) IMFMediaType_Release(decoder->input_type); if (decoder->output_type) IMFMediaType_Release(decoder->output_type); + if (decoder->stream_type) + IMFMediaType_Release(decoder->stream_type); if (decoder->output_attributes) IMFAttributes_Release(decoder->output_attributes); if (decoder->attributes) IMFAttributes_Release(decoder->attributes); + FreeMediaType(&decoder->dmo_input_type); + FreeMediaType(&decoder->dmo_output_type); wg_sample_queue_destroy(decoder->wg_sample_queue); free(decoder); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 87ce4ded382..9f3c01813b3 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -4057,12 +4057,15 @@ static void test_wma_decoder_dmo_output_type(void) ok(hr == S_OK, "SetInputType returned %#lx.\n", hr); hr = IMediaObject_GetOutputCurrentType(dmo, 0, &type); ok(hr == S_OK, "GetOutputCurrentType returned %#lx.\n", hr); + MoFreeMediaType(input_type); + MoFreeMediaType(&type);
init_dmo_media_type_audio(input_type, input_subtype, channel_count, rate * 2, 32); hr = IMediaObject_SetInputType(dmo, 0, input_type, 0); ok(hr == S_OK, "SetInputType returned %#lx.\n", hr); hr = IMediaObject_GetOutputCurrentType(dmo, 0, &type); todo_wine ok(hr == DMO_E_TYPE_NOT_SET, "GetOutputCurrentType returned %#lx.\n", hr); + if (hr == S_OK) MoFreeMediaType(&type);
/* Cleanup. */ ret = IMediaObject_Release(dmo); @@ -4361,6 +4364,8 @@ static void test_h264_encoder(void) winetest_pop_context(); }
+ IMFMediaType_Release(media_type); + hr = IMFTransform_QueryInterface(transform, &IID_ICodecAPI, (void **)&codec_api); ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr); for (desc = &expect_codec_api_attributes[0]; desc->key; ++desc) @@ -4426,6 +4431,9 @@ static void test_h264_encoder(void) ok(hr == S_OK, "ProcessOutput returned %#lx.\n", hr); if (hr != S_OK) { + ret = IMFTransform_Release(transform); + ok(ret == 0, "Release returned %lu\n", ret); + IMFCollection_Release(output_sample_collection); IMFSample_Release(output_sample); goto failed; } @@ -4444,7 +4452,6 @@ static void test_h264_encoder(void) ok(ret == 0, "Got %lu%% diff\n", ret); IMFCollection_Release(output_sample_collection);
- IMFMediaType_Release(media_type); ret = IMFTransform_Release(transform); ok(ret == 0, "Release returned %lu\n", ret);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 5 ----- 1 file changed, 5 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 9f3c01813b3..c086ae6e7a4 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -10647,7 +10647,6 @@ static void test_video_processor_with_dxgi_manager(void)
/* native wants a dxgi buffer on input */ input_sample = create_d3d_sample(allocator, nv12frame_data, nv12frame_data_len); - hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "got %#lx\n", hr);
@@ -10778,8 +10777,6 @@ static void test_video_processor_with_dxgi_manager(void) nv12frame_data = nv12frame_data + length; ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len);
- input_sample = create_d3d_sample(allocator, nv12frame_data, nv12frame_data_len); - hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "got %#lx\n", hr);
@@ -10845,8 +10842,6 @@ skip_rgb32: nv12frame_data = nv12frame_data + length; ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len);
- input_sample = create_d3d_sample(allocator, nv12frame_data, nv12frame_data_len); - hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "got %#lx\n", hr);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index c086ae6e7a4..ac76f1e7d63 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -4235,12 +4235,20 @@ static void test_h264_encoder(void) const BYTE *nv12frame_data; IMFMediaType *media_type; IMFTransform *transform; + BOOL is_wow64 = FALSE; ICodecAPI *codec_api; DWORD output_status; HRESULT hr; ULONG ret; DWORD i;
+ IsWow64Process(GetCurrentProcess(), &is_wow64); + if (sizeof(void *) == 4 && winetest_platform_is_wine && !is_wow64) + { + skip("Skipping 32bit H264 encoder tests\n"); + return; + } + hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr);