Rémi Bernon : winegstreamer: Introduce new wg_transform_(push|read)_mf helpers.
Alexandre Julliard
julliard at winehq.org
Thu Jun 9 16:28:32 CDT 2022
Module: wine
Branch: master
Commit: 240aff382def741f306783227d4d46d67e931a36
URL: https://source.winehq.org/git/wine.git/?a=commit;h=240aff382def741f306783227d4d46d67e931a36
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Mon Jun 6 17:06:32 2022 +0200
winegstreamer: Introduce new wg_transform_(push|read)_mf helpers.
To read MF sample properties before pushing, and update them after
sucessfully reading a sample.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/winegstreamer/gst_private.h | 4 +++
dlls/winegstreamer/h264_decoder.c | 6 ++---
dlls/winegstreamer/mfplat.c | 55 ++++++++++++++++++++++++++-------------
dlls/winegstreamer/wma_decoder.c | 4 +--
4 files changed, 45 insertions(+), 24 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 159143d7e54..ca7396ad5cd 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -123,6 +123,10 @@ void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format);
HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out);
void mf_destroy_wg_sample(struct wg_sample *wg_sample);
+HRESULT wg_transform_push_mf(struct wg_transform *transform, struct wg_sample *sample);
+HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *sample,
+ struct wg_format *format);
+
HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj);
HRESULT h264_decoder_create(REFIID riid, void **ret);
diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c
index 19a36a9a77a..0ee9084e12e 100644
--- a/dlls/winegstreamer/h264_decoder.c
+++ b/dlls/winegstreamer/h264_decoder.c
@@ -543,8 +543,7 @@ static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFS
if (FAILED(hr = mf_create_wg_sample(sample, &wg_sample)))
return hr;
- hr = wg_transform_push_data(decoder->wg_transform, wg_sample);
-
+ hr = wg_transform_push_mf(decoder->wg_transform, wg_sample);
mf_destroy_wg_sample(wg_sample);
return hr;
}
@@ -583,8 +582,7 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags,
return MF_E_BUFFERTOOSMALL;
}
- hr = wg_transform_read_data(decoder->wg_transform, wg_sample,
- &wg_format);
+ hr = wg_transform_read_mf(decoder->wg_transform, wg_sample, &wg_format);
mf_destroy_wg_sample(wg_sample);
if (hr == MF_E_TRANSFORM_STREAM_CHANGE)
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c
index 0226e7a2e45..026237bdf5d 100644
--- a/dlls/winegstreamer/mfplat.c
+++ b/dlls/winegstreamer/mfplat.c
@@ -969,8 +969,6 @@ HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out)
{
DWORD current_length, max_length;
struct mf_sample *mf_sample;
- LONGLONG time, duration;
- UINT32 value;
BYTE *buffer;
HRESULT hr;
@@ -981,19 +979,6 @@ HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out)
if (FAILED(hr = IMFMediaBuffer_Lock(mf_sample->media_buffer, &buffer, &max_length, ¤t_length)))
goto out;
- if (SUCCEEDED(IMFSample_GetSampleTime(sample, &time)))
- {
- mf_sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_PTS;
- mf_sample->wg_sample.pts = time;
- }
- if (SUCCEEDED(IMFSample_GetSampleDuration(sample, &duration)))
- {
- mf_sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_DURATION;
- mf_sample->wg_sample.duration = duration;
- }
- if (SUCCEEDED(IMFSample_GetUINT32(sample, &MFSampleExtension_CleanPoint, &value)) && value)
- mf_sample->wg_sample.flags |= WG_SAMPLE_FLAG_SYNC_POINT;
-
IMFSample_AddRef((mf_sample->sample = sample));
mf_sample->wg_sample.data = buffer;
mf_sample->wg_sample.size = current_length;
@@ -1015,8 +1000,43 @@ void mf_destroy_wg_sample(struct wg_sample *wg_sample)
struct mf_sample *mf_sample = CONTAINING_RECORD(wg_sample, struct mf_sample, wg_sample);
IMFMediaBuffer_Unlock(mf_sample->media_buffer);
- IMFMediaBuffer_SetCurrentLength(mf_sample->media_buffer, wg_sample->size);
IMFMediaBuffer_Release(mf_sample->media_buffer);
+ IMFSample_Release(mf_sample->sample);
+ free(mf_sample);
+}
+
+HRESULT wg_transform_push_mf(struct wg_transform *transform, struct wg_sample *sample)
+{
+ struct mf_sample *mf_sample = CONTAINING_RECORD(sample, struct mf_sample, wg_sample);
+ LONGLONG time, duration;
+ UINT32 value;
+
+ if (SUCCEEDED(IMFSample_GetSampleTime(mf_sample->sample, &time)))
+ {
+ mf_sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_PTS;
+ mf_sample->wg_sample.pts = time;
+ }
+ if (SUCCEEDED(IMFSample_GetSampleDuration(mf_sample->sample, &duration)))
+ {
+ mf_sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_DURATION;
+ mf_sample->wg_sample.duration = duration;
+ }
+ if (SUCCEEDED(IMFSample_GetUINT32(mf_sample->sample, &MFSampleExtension_CleanPoint, &value)) && value)
+ mf_sample->wg_sample.flags |= WG_SAMPLE_FLAG_SYNC_POINT;
+
+ return wg_transform_push_data(transform, sample);
+}
+
+HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *wg_sample,
+ struct wg_format *format)
+{
+ struct mf_sample *mf_sample = CONTAINING_RECORD(wg_sample, struct mf_sample, wg_sample);
+ HRESULT hr;
+
+ if (FAILED(hr = wg_transform_read_data(transform, wg_sample, format)))
+ return hr;
+
+ IMFMediaBuffer_SetCurrentLength(mf_sample->media_buffer, wg_sample->size);
if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_PTS)
IMFSample_SetSampleTime(mf_sample->sample, wg_sample->pts);
@@ -1025,6 +1045,5 @@ void mf_destroy_wg_sample(struct wg_sample *wg_sample)
if (wg_sample->flags & WG_SAMPLE_FLAG_SYNC_POINT)
IMFSample_SetUINT32(mf_sample->sample, &MFSampleExtension_CleanPoint, 1);
- IMFSample_Release(mf_sample->sample);
- free(mf_sample);
+ return S_OK;
}
diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c
index 106d32adce9..fdb68328c3a 100644
--- a/dlls/winegstreamer/wma_decoder.c
+++ b/dlls/winegstreamer/wma_decoder.c
@@ -544,7 +544,7 @@ static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFS
return S_OK;
}
- hr = wg_transform_push_data(decoder->wg_transform, wg_sample);
+ hr = wg_transform_push_mf(decoder->wg_transform, wg_sample);
mf_destroy_wg_sample(wg_sample);
return hr;
}
@@ -586,7 +586,7 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags,
return MF_E_BUFFERTOOSMALL;
}
- if (SUCCEEDED(hr = wg_transform_read_data(decoder->wg_transform, wg_sample, NULL)))
+ if (SUCCEEDED(hr = wg_transform_read_mf(decoder->wg_transform, wg_sample, NULL)))
{
if (wg_sample->flags & WG_SAMPLE_FLAG_INCOMPLETE)
samples[0].dwStatus |= MFT_OUTPUT_DATA_BUFFER_INCOMPLETE;
More information about the wine-cvs
mailing list