Zebediah Figura : winegstreamer: Implement INSSBuffer::SetLength().

Alexandre Julliard julliard at winehq.org
Tue Nov 9 15:55:05 CST 2021


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

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Mon Nov  8 15:24:31 2021 -0600

winegstreamer: Implement INSSBuffer::SetLength().

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winegstreamer/wm_reader.c | 17 ++++++++++++-----
 dlls/wmvcore/tests/wmvcore.c   | 22 ++++++++++++++++++++++
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c
index 2c0f89e29a9..b9e1a1b3d03 100644
--- a/dlls/winegstreamer/wm_reader.c
+++ b/dlls/winegstreamer/wm_reader.c
@@ -172,7 +172,7 @@ struct buffer
     INSSBuffer INSSBuffer_iface;
     LONG refcount;
 
-    DWORD size;
+    DWORD size, capacity;
     BYTE data[1];
 };
 
@@ -231,8 +231,15 @@ static HRESULT WINAPI buffer_GetLength(INSSBuffer *iface, DWORD *size)
 
 static HRESULT WINAPI buffer_SetLength(INSSBuffer *iface, DWORD size)
 {
-    FIXME("iface %p, size %u, stub!\n", iface, size);
-    return E_NOTIMPL;
+    struct buffer *buffer = impl_from_INSSBuffer(iface);
+
+    TRACE("iface %p, size %u.\n", buffer, size);
+
+    if (size > buffer->capacity)
+        return E_INVALIDARG;
+
+    buffer->size = size;
+    return S_OK;
 }
 
 static HRESULT WINAPI buffer_GetMaxLength(INSSBuffer *iface, DWORD *size)
@@ -241,7 +248,7 @@ static HRESULT WINAPI buffer_GetMaxLength(INSSBuffer *iface, DWORD *size)
 
     TRACE("buffer %p, size %p.\n", buffer, size);
 
-    *size = buffer->size;
+    *size = buffer->capacity;
     return S_OK;
 }
 
@@ -1754,7 +1761,7 @@ HRESULT wm_reader_get_stream_sample(struct wm_stream *stream,
 
                 object->INSSBuffer_iface.lpVtbl = &buffer_vtbl;
                 object->refcount = 1;
-                object->size = event.u.buffer.size;
+                object->capacity = object->size = event.u.buffer.size;
 
                 if (!wg_parser_stream_copy_buffer(wg_stream, object->data, 0, object->size))
                 {
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index 0347195ba10..f8962b784ac 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -686,6 +686,17 @@ static void test_sync_reader_streaming(void)
                 ok(hr == S_OK, "Got hr %#x.\n", hr);
                 ok(size <= capacity, "Size %u exceeds capacity %u.\n", size, capacity);
 
+                hr = INSSBuffer_SetLength(sample, capacity + 1);
+                ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+                hr = INSSBuffer_SetLength(sample, capacity - 1);
+                ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+                hr = INSSBuffer_GetBufferAndLength(sample, &data2, &size);
+                ok(hr == S_OK, "Got hr %#x.\n", hr);
+                ok(data2 == data, "Data pointers didn't match.\n");
+                ok(size == capacity - 1, "Expected size %u, got %u.\n", capacity - 1, size);
+
                 ref = INSSBuffer_Release(sample);
                 ok(!ref, "Got outstanding refcount %d.\n", ref);
 
@@ -1222,6 +1233,17 @@ static HRESULT WINAPI callback_OnSample(IWMReaderCallback *iface, DWORD output,
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     ok(size <= capacity, "Size %u exceeds capacity %u.\n", size, capacity);
 
+    hr = INSSBuffer_SetLength(sample, capacity + 1);
+    ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+    hr = INSSBuffer_SetLength(sample, capacity - 1);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = INSSBuffer_GetBufferAndLength(sample, &data2, &size);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(data2 == data, "Data pointers didn't match.\n");
+    ok(size == capacity - 1, "Expected size %u, got %u.\n", capacity - 1, size);
+
     ok(callback->got_started > 0, "Got %u WMT_STARTED callbacks.\n", callback->got_started);
     ok(!callback->got_eof, "Got %u WMT_EOF callbacks.\n", callback->got_eof);
     ++callback->got_sample;




More information about the wine-cvs mailing list