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.
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
--- dlls/mp3dmod/mp3dmod.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/dlls/mp3dmod/mp3dmod.c b/dlls/mp3dmod/mp3dmod.c index 383ad9818b8..6f96d07231d 100644 --- a/dlls/mp3dmod/mp3dmod.c +++ b/dlls/mp3dmod/mp3dmod.c @@ -185,12 +185,9 @@ static HRESULT WINAPI MediaObject_GetInputType(IMediaObject *iface, DWORD index, if (type_index) return DMO_E_NO_MORE_ITEMS;
+ memset(type, 0, sizeof(*type)); type->majortype = WMMEDIATYPE_Audio; type->subtype = WMMEDIASUBTYPE_MP3; - type->formattype = GUID_NULL; - type->pUnk = NULL; - type->cbFormat = 0; - type->pbFormat = NULL;
return S_OK; } @@ -214,10 +211,10 @@ static HRESULT WINAPI MediaObject_GetOutputType(IMediaObject *iface, DWORD index if (type_index >= (2 * input_format->nChannels)) return DMO_E_NO_MORE_ITEMS;
+ memset(type, 0, sizeof(*type)); type->majortype = WMMEDIATYPE_Audio; type->subtype = WMMEDIASUBTYPE_PCM; type->formattype = WMFORMAT_WaveFormatEx; - type->pUnk = NULL; type->cbFormat = sizeof(WAVEFORMATEX); if (!(type->pbFormat = CoTaskMemAlloc(sizeof(WAVEFORMATEX)))) return E_OUTOFMEMORY; @@ -228,7 +225,6 @@ static HRESULT WINAPI MediaObject_GetOutputType(IMediaObject *iface, DWORD index format->wBitsPerSample = (type_index % 2) ? 8 : 16; format->nBlockAlign = format->nChannels * format->wBitsPerSample / 8; format->nAvgBytesPerSec = format->nSamplesPerSec * format->nBlockAlign; - format->cbSize = 0;
return S_OK; }
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..e26252a58dd 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -4237,10 +4237,18 @@ static void test_h264_encoder(void) IMFTransform *transform; ICodecAPI *codec_api; DWORD output_status; + BOOL is_wow64; HRESULT hr; ULONG ret; DWORD i;
+ if (sizeof(void *) == 4 && winetest_platform_is_wine && + IsWow64Process(GetCurrentProcess(), &is_wow64) && !is_wow64) + { + skip("Skipping 32bit H264 encoder tests\n"); + return; + } + hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr);