Rémi Bernon : winegstreamer: Support the MFSampleExtension_CleanPoint sample attribute.

Alexandre Julliard julliard at winehq.org
Fri May 6 15:38:39 CDT 2022


Module: wine
Branch: master
Commit: 7144bf27b9d1cffb22ab22782114ff2e5057cc20
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7144bf27b9d1cffb22ab22782114ff2e5057cc20

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Sun Apr  3 19:13:22 2022 +0200

winegstreamer: Support the MFSampleExtension_CleanPoint sample attribute.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45988
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47084
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49715
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52183
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mf/tests/mf.c                | 2 --
 dlls/winegstreamer/mfplat.c       | 5 +++++
 dlls/winegstreamer/unixlib.h      | 1 +
 dlls/winegstreamer/wg_transform.c | 4 ++++
 4 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 5abf910ad71..a32005863d3 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -6488,9 +6488,7 @@ static void test_wma_decoder(void)
         ok(status == 0, "got status %#lx\n", status);
         value = 0xdeadbeef;
         hr = IMFSample_GetUINT32(sample, &MFSampleExtension_CleanPoint, &value);
-        todo_wine
         ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr);
-        todo_wine
         ok(value == 1, "got MFSampleExtension_CleanPoint %u\n", value);
         hr = IMFSample_GetTotalLength(sample, &length);
         ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr);
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c
index 9dcfc558963..ee3a1f5e024 100644
--- a/dlls/winegstreamer/mfplat.c
+++ b/dlls/winegstreamer/mfplat.c
@@ -904,6 +904,7 @@ 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;
 
@@ -924,6 +925,8 @@ HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out)
         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;
@@ -953,6 +956,8 @@ void mf_destroy_wg_sample(struct wg_sample *wg_sample)
         IMFSample_SetSampleTime(mf_sample->sample, wg_sample->pts);
     if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_DURATION)
         IMFSample_SetSampleDuration(mf_sample->sample, wg_sample->duration);
+    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);
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h
index 32e5b068187..b8dd2194bbe 100644
--- a/dlls/winegstreamer/unixlib.h
+++ b/dlls/winegstreamer/unixlib.h
@@ -116,6 +116,7 @@ enum wg_sample_flag
     WG_SAMPLE_FLAG_INCOMPLETE = 1,
     WG_SAMPLE_FLAG_HAS_PTS = 2,
     WG_SAMPLE_FLAG_HAS_DURATION = 4,
+    WG_SAMPLE_FLAG_SYNC_POINT = 8,
 };
 
 struct wg_sample
diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c
index afee8478b9b..02f93bd95c0 100644
--- a/dlls/winegstreamer/wg_transform.c
+++ b/dlls/winegstreamer/wg_transform.c
@@ -369,6 +369,8 @@ NTSTATUS wg_transform_push_data(void *args)
         GST_BUFFER_PTS(buffer) = sample->pts * 100;
     if (sample->flags & WG_SAMPLE_FLAG_HAS_DURATION)
         GST_BUFFER_DURATION(buffer) = sample->duration * 100;
+    if (!(sample->flags & WG_SAMPLE_FLAG_SYNC_POINT))
+        GST_BUFFER_FLAG_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT);
     gst_buffer_list_insert(transform->input, -1, buffer);
 
     GST_INFO("Copied %u bytes from sample %p to input buffer list", sample->size, sample);
@@ -415,6 +417,8 @@ static NTSTATUS read_transform_output_data(GstBuffer *buffer, struct wg_sample *
         sample->flags |= WG_SAMPLE_FLAG_HAS_DURATION;
         sample->duration = duration;
     }
+    if (!GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT))
+        sample->flags |= WG_SAMPLE_FLAG_SYNC_POINT;
 
     GST_INFO("Copied %u bytes, sample %p, flags %#x", sample->size, sample, sample->flags);
     return STATUS_SUCCESS;




More information about the wine-cvs mailing list