[PATCH 0/2] MR1049: winegstreamer: More factoring for MF transforms.
From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/winegstreamer/color_convert.c | 12 ++++++------ dlls/winegstreamer/h264_decoder.c | 6 +++--- dlls/winegstreamer/resampler.c | 15 +++++++-------- dlls/winegstreamer/video_processor.c | 11 ++++++----- dlls/winegstreamer/wma_decoder.c | 13 ++++++------- 5 files changed, 28 insertions(+), 29 deletions(-) diff --git a/dlls/winegstreamer/color_convert.c b/dlls/winegstreamer/color_convert.c index 7ffe29de907..4b985338778 100644 --- a/dlls/winegstreamer/color_convert.c +++ b/dlls/winegstreamer/color_convert.c @@ -553,15 +553,15 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, if (count != 1) return E_INVALIDARG; - if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) - return hr; - if (!impl->wg_transform) return MF_E_TRANSFORM_TYPE_NOT_SET; - *status = 0; - samples[0].dwStatus = 0; - if (!samples[0].pSample) return E_INVALIDARG; + *status = samples->dwStatus = 0; + if (!samples->pSample) + return E_INVALIDARG; + + if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) + return hr; if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) return hr; diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c index cf4a79303ab..bddb83e160a 100644 --- a/dlls/winegstreamer/h264_decoder.c +++ b/dlls/winegstreamer/h264_decoder.c @@ -607,9 +607,9 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, if (!decoder->wg_transform) return MF_E_TRANSFORM_TYPE_NOT_SET; - *status = 0; - samples[0].dwStatus = 0; - if (!samples[0].pSample) return E_INVALIDARG; + *status = samples->dwStatus = 0; + if (!samples->pSample) + return E_INVALIDARG; if (FAILED(hr = IMFMediaType_GetGUID(decoder->output_type, &MF_MT_SUBTYPE, &subtype))) return hr; diff --git a/dlls/winegstreamer/resampler.c b/dlls/winegstreamer/resampler.c index 7dd50da1c2d..e2052ff44a5 100644 --- a/dlls/winegstreamer/resampler.c +++ b/dlls/winegstreamer/resampler.c @@ -531,23 +531,22 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, TRACE("iface %p, flags %#lx, count %lu, samples %p, status %p.\n", iface, flags, count, samples, status); - if (count > 1) + if (count != 1) return E_INVALIDARG; if (!impl->wg_transform) return MF_E_TRANSFORM_TYPE_NOT_SET; - if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) - return hr; - - *status = 0; - samples[0].dwStatus = 0; - if (!samples[0].pSample) + *status = samples->dwStatus = 0; + if (!samples->pSample) { - samples[0].dwStatus = MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; + samples->dwStatus = MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; return MF_E_TRANSFORM_NEED_MORE_INPUT; } + if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) + return hr; + if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) return hr; diff --git a/dlls/winegstreamer/video_processor.c b/dlls/winegstreamer/video_processor.c index a0f1c52f356..3cad80550d1 100644 --- a/dlls/winegstreamer/video_processor.c +++ b/dlls/winegstreamer/video_processor.c @@ -534,14 +534,15 @@ static HRESULT WINAPI video_processor_ProcessOutput(IMFTransform *iface, DWORD f if (count != 1) return E_INVALIDARG; - if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) - return hr; - if (!impl->wg_transform) return MF_E_TRANSFORM_TYPE_NOT_SET; - samples[0].dwStatus = 0; - if (!samples[0].pSample) return E_INVALIDARG; + samples->dwStatus = 0; + if (!samples->pSample) + return E_INVALIDARG; + + if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) + return hr; if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) return hr; diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c index a68d5c0f607..80167db40ce 100644 --- a/dlls/winegstreamer/wma_decoder.c +++ b/dlls/winegstreamer/wma_decoder.c @@ -553,23 +553,22 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, TRACE("iface %p, flags %#lx, count %lu, samples %p, status %p.\n", iface, flags, count, samples, status); - if (count > 1) + if (count != 1) return E_INVALIDARG; if (!decoder->wg_transform) return MF_E_TRANSFORM_TYPE_NOT_SET; - if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) - return hr; - - *status = 0; - samples[0].dwStatus = 0; - if (!samples[0].pSample) + *status = samples->dwStatus = 0; + if (!samples->pSample) { samples[0].dwStatus = MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; return MF_E_TRANSFORM_NEED_MORE_INPUT; } + if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) + return hr; + if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) return hr; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1049
From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/winegstreamer/color_convert.c | 16 ++---------- dlls/winegstreamer/gst_private.h | 4 +-- dlls/winegstreamer/h264_decoder.c | 16 ++---------- dlls/winegstreamer/resampler.c | 17 ++----------- dlls/winegstreamer/video_processor.c | 16 ++---------- dlls/winegstreamer/wg_sample.c | 38 ++++++++++++++++++++-------- dlls/winegstreamer/wma_decoder.c | 17 ++----------- 7 files changed, 39 insertions(+), 85 deletions(-) diff --git a/dlls/winegstreamer/color_convert.c b/dlls/winegstreamer/color_convert.c index 4b985338778..0eaddc687ee 100644 --- a/dlls/winegstreamer/color_convert.c +++ b/dlls/winegstreamer/color_convert.c @@ -545,7 +545,6 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, { struct color_convert *impl = impl_from_IMFTransform(iface); MFT_OUTPUT_STREAM_INFO info; - struct wg_sample *wg_sample; HRESULT hr; TRACE("iface %p, flags %#lx, count %lu, samples %p, status %p.\n", iface, flags, count, samples, status); @@ -563,21 +562,10 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) return hr; - if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) - return hr; - - if (wg_sample->max_size < info.cbSize) - { - wg_sample_release(wg_sample); - return MF_E_BUFFERTOOSMALL; - } - - if (SUCCEEDED(hr = wg_transform_read_mf(impl->wg_transform, wg_sample, NULL, - &samples[0].dwStatus))) + if (SUCCEEDED(hr = wg_transform_read_mf(impl->wg_transform, samples->pSample, + info.cbSize, NULL, &samples->dwStatus))) wg_sample_queue_flush(impl->wg_sample_queue, false); - wg_sample_release(wg_sample); - return hr; } diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index fed5766d3a4..0206e9bc0c0 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -134,8 +134,8 @@ HRESULT wg_transform_push_mf(struct wg_transform *transform, IMFSample *sample, struct wg_sample_queue *queue); HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sample *sample, struct wg_sample_queue *queue); -HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *sample, - struct wg_format *format, DWORD *flags); +HRESULT wg_transform_read_mf(struct wg_transform *transform, IMFSample *sample, + DWORD sample_size, struct wg_format *format, DWORD *flags); HRESULT wg_transform_read_quartz(struct wg_transform *transform, struct wg_sample *sample); HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj); diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c index bddb83e160a..ead00e20840 100644 --- a/dlls/winegstreamer/h264_decoder.c +++ b/dlls/winegstreamer/h264_decoder.c @@ -592,7 +592,6 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); - struct wg_sample *wg_sample; struct wg_format wg_format; UINT32 sample_size; UINT64 frame_rate; @@ -617,21 +616,10 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, decoder->wg_format.u.video.height, &sample_size))) return hr; - if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) - return hr; - - if (wg_sample->max_size < sample_size) - { - wg_sample_release(wg_sample); - return MF_E_BUFFERTOOSMALL; - } - - if (SUCCEEDED(hr = wg_transform_read_mf(decoder->wg_transform, wg_sample, &wg_format, - &samples[0].dwStatus))) + if (SUCCEEDED(hr = wg_transform_read_mf(decoder->wg_transform, samples->pSample, + sample_size, &wg_format, &samples->dwStatus))) wg_sample_queue_flush(decoder->wg_sample_queue, false); - wg_sample_release(wg_sample); - if (hr == MF_E_TRANSFORM_STREAM_CHANGE) { decoder->wg_format = wg_format; diff --git a/dlls/winegstreamer/resampler.c b/dlls/winegstreamer/resampler.c index e2052ff44a5..88e9727ff21 100644 --- a/dlls/winegstreamer/resampler.c +++ b/dlls/winegstreamer/resampler.c @@ -526,7 +526,6 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, { struct resampler *impl = impl_from_IMFTransform(iface); MFT_OUTPUT_STREAM_INFO info; - struct wg_sample *wg_sample; HRESULT hr; TRACE("iface %p, flags %#lx, count %lu, samples %p, status %p.\n", iface, flags, count, samples, status); @@ -547,22 +546,10 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) return hr; - if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) - return hr; - - wg_sample->size = 0; - if (wg_sample->max_size < info.cbSize) - { - wg_sample_release(wg_sample); - return MF_E_BUFFERTOOSMALL; - } - - if (SUCCEEDED(hr = wg_transform_read_mf(impl->wg_transform, wg_sample, NULL, - &samples[0].dwStatus))) + if (SUCCEEDED(hr = wg_transform_read_mf(impl->wg_transform, samples->pSample, + info.cbSize, NULL, &samples->dwStatus))) wg_sample_queue_flush(impl->wg_sample_queue, false); - wg_sample_release(wg_sample); - return hr; } diff --git a/dlls/winegstreamer/video_processor.c b/dlls/winegstreamer/video_processor.c index 3cad80550d1..21bc46b0bb3 100644 --- a/dlls/winegstreamer/video_processor.c +++ b/dlls/winegstreamer/video_processor.c @@ -526,7 +526,6 @@ static HRESULT WINAPI video_processor_ProcessOutput(IMFTransform *iface, DWORD f { struct video_processor *impl = impl_from_IMFTransform(iface); MFT_OUTPUT_STREAM_INFO info; - struct wg_sample *wg_sample; HRESULT hr; TRACE("iface %p, flags %#lx, count %lu, samples %p, status %p.\n", iface, flags, count, samples, status); @@ -544,21 +543,10 @@ static HRESULT WINAPI video_processor_ProcessOutput(IMFTransform *iface, DWORD f if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) return hr; - if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) - return hr; - - if (wg_sample->max_size < info.cbSize) - { - wg_sample_release(wg_sample); - return MF_E_BUFFERTOOSMALL; - } - - if (SUCCEEDED(hr = wg_transform_read_mf(impl->wg_transform, wg_sample, NULL, - &samples[0].dwStatus))) + if (SUCCEEDED(hr = wg_transform_read_mf(impl->wg_transform, samples->pSample, + info.cbSize, NULL, &samples->dwStatus))) wg_sample_queue_flush(impl->wg_sample_queue, false); - wg_sample_release(wg_sample); - return hr; } diff --git a/dlls/winegstreamer/wg_sample.c b/dlls/winegstreamer/wg_sample.c index 4dcac74348e..f48639a6822 100644 --- a/dlls/winegstreamer/wg_sample.c +++ b/dlls/winegstreamer/wg_sample.c @@ -285,34 +285,50 @@ HRESULT wg_transform_push_mf(struct wg_transform *transform, IMFSample *sample, return hr; } -HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *wg_sample, - struct wg_format *format, DWORD *flags) +HRESULT wg_transform_read_mf(struct wg_transform *transform, IMFSample *sample, + DWORD sample_size, struct wg_format *format, DWORD *flags) { - struct sample *sample = unsafe_mf_from_wg_sample(wg_sample); + struct wg_sample *wg_sample; + IMFMediaBuffer *buffer; HRESULT hr; - TRACE_(mfplat)("transform %p, wg_sample %p, format %p, flags %p.\n", transform, wg_sample, format, flags); + TRACE_(mfplat)("transform %p, sample %p, format %p, flags %p.\n", transform, sample, format, flags); + + if (FAILED(hr = wg_sample_create_mf(sample, &wg_sample))) + return hr; + + wg_sample->size = 0; + if (wg_sample->max_size < sample_size) + { + wg_sample_release(wg_sample); + return MF_E_BUFFERTOOSMALL; + } if (FAILED(hr = wg_transform_read_data(transform, wg_sample, format))) { if (hr == MF_E_TRANSFORM_STREAM_CHANGE && !format) FIXME("Unexpected stream format change!\n"); + wg_sample_release(wg_sample); return hr; } - if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(sample->u.mf.buffer, wg_sample->size))) - return hr; - if (wg_sample->flags & WG_SAMPLE_FLAG_INCOMPLETE) *flags |= MFT_OUTPUT_DATA_BUFFER_INCOMPLETE; if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_PTS) - IMFSample_SetSampleTime(sample->u.mf.sample, wg_sample->pts); + IMFSample_SetSampleTime(sample, wg_sample->pts); if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_DURATION) - IMFSample_SetSampleDuration(sample->u.mf.sample, wg_sample->duration); + IMFSample_SetSampleDuration(sample, wg_sample->duration); if (wg_sample->flags & WG_SAMPLE_FLAG_SYNC_POINT) - IMFSample_SetUINT32(sample->u.mf.sample, &MFSampleExtension_CleanPoint, 1); + IMFSample_SetUINT32(sample, &MFSampleExtension_CleanPoint, 1); - return S_OK; + if (SUCCEEDED(hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer))) + { + hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_sample->size); + IMFMediaBuffer_Release(buffer); + } + + wg_sample_release(wg_sample); + return hr; } HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sample *wg_sample, diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c index 80167db40ce..4a0d5f2592e 100644 --- a/dlls/winegstreamer/wma_decoder.c +++ b/dlls/winegstreamer/wma_decoder.c @@ -548,7 +548,6 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, { struct wma_decoder *decoder = impl_from_IMFTransform(iface); MFT_OUTPUT_STREAM_INFO info; - struct wg_sample *wg_sample; HRESULT hr; TRACE("iface %p, flags %#lx, count %lu, samples %p, status %p.\n", iface, flags, count, samples, status); @@ -569,22 +568,10 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) return hr; - if (FAILED(hr = wg_sample_create_mf(samples[0].pSample, &wg_sample))) - return hr; - - wg_sample->size = 0; - if (wg_sample->max_size < info.cbSize) - { - wg_sample_release(wg_sample); - return MF_E_BUFFERTOOSMALL; - } - - if (SUCCEEDED(hr = wg_transform_read_mf(decoder->wg_transform, wg_sample, NULL, - &samples[0].dwStatus))) + if (SUCCEEDED(hr = wg_transform_read_mf(decoder->wg_transform, samples->pSample, + info.cbSize, NULL, &samples->dwStatus))) wg_sample_queue_flush(decoder->wg_sample_queue, false); - wg_sample_release(wg_sample); - return hr; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1049
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=124943 Your paranoid android. === build (build log) === error: patch failed: dlls/winegstreamer/color_convert.c:563 error: patch failed: dlls/winegstreamer/resampler.c:547 error: patch failed: dlls/winegstreamer/video_processor.c:544 error: patch failed: dlls/winegstreamer/wma_decoder.c:569 Task: Patch failed to apply === debian11 (build log) === error: patch failed: dlls/winegstreamer/color_convert.c:563 error: patch failed: dlls/winegstreamer/resampler.c:547 error: patch failed: dlls/winegstreamer/video_processor.c:544 error: patch failed: dlls/winegstreamer/wma_decoder.c:569 Task: Patch failed to apply === debian11 (build log) === error: patch failed: dlls/winegstreamer/color_convert.c:563 error: patch failed: dlls/winegstreamer/resampler.c:547 error: patch failed: dlls/winegstreamer/video_processor.c:544 error: patch failed: dlls/winegstreamer/wma_decoder.c:569 Task: Patch failed to apply
This merge request was approved by Zebediah Figura. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/1049
participants (3)
-
Marvin -
Rémi Bernon -
Zebediah Figura (@zfigura)