[PATCH v3 2/5] qcap/filewriter: Implement sample processing.

Zebediah Figura z.figura12 at gmail.com
Thu Apr 23 20:47:05 CDT 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
v3: Really fix test failures.

 dlls/qcap/filewriter.c       | 26 +++++++++++++++
 dlls/qcap/tests/filewriter.c | 65 +++++++++++++++++++++++++++++++++++-
 2 files changed, 90 insertions(+), 1 deletion(-)

diff --git a/dlls/qcap/filewriter.c b/dlls/qcap/filewriter.c
index caec4936cf..2a3c8df4b9 100644
--- a/dlls/qcap/filewriter.c
+++ b/dlls/qcap/filewriter.c
@@ -64,10 +64,36 @@ static HRESULT file_writer_sink_query_accept(struct strmbase_pin *iface, const A
     return S_OK;
 }
 
+static HRESULT WINAPI file_writer_sink_receive(struct strmbase_sink *iface, IMediaSample *sample)
+{
+    struct file_writer *filter = impl_from_strmbase_pin(&iface->pin);
+    REFERENCE_TIME start, stop;
+    LARGE_INTEGER offset;
+    HRESULT hr;
+    DWORD size;
+    BYTE *data;
+
+    if ((hr = IMediaSample_GetTime(sample, &start, &stop)) != S_OK)
+        ERR("Failed to get sample time, hr %#x.\n", hr);
+
+    if ((hr = IMediaSample_GetPointer(sample, &data)) != S_OK)
+        ERR("Failed to get sample pointer, hr %#x.\n", hr);
+
+    offset.QuadPart = start;
+    if (!SetFilePointerEx(filter->file, offset, NULL, FILE_BEGIN)
+            || !WriteFile(filter->file, data, stop - start, &size, NULL))
+        ERR("Failed to write file, error %u.\n", GetLastError());
+    if (size != stop - start)
+        ERR("Short write, %u/%u.\n", size, (DWORD)(stop - start));
+
+    return S_OK;
+}
+
 static const struct strmbase_sink_ops sink_ops =
 {
     .base.pin_query_interface = file_writer_sink_query_interface,
     .base.pin_query_accept = file_writer_sink_query_accept,
+    .pfnReceive = file_writer_sink_receive,
 };
 
 static inline struct file_writer *impl_from_strmbase_filter(struct strmbase_filter *iface)
diff --git a/dlls/qcap/tests/filewriter.c b/dlls/qcap/tests/filewriter.c
index 57bd2ec872..f0c20e660e 100644
--- a/dlls/qcap/tests/filewriter.c
+++ b/dlls/qcap/tests/filewriter.c
@@ -549,7 +549,7 @@ static void test_allocator(IMemInputPin *input, IMemAllocator *allocator)
     ok(hr == E_POINTER, "Got hr %#x.\n", hr);
 
     props.cBuffers = 1;
-    props.cbBuffer = 256;
+    props.cbBuffer = 512;
     props.cbAlign = 512;
     props.cbPrefix = 0;
     hr = IMemAllocator_SetProperties(allocator, &props, &ret_props);
@@ -616,6 +616,68 @@ static void test_filter_state(IMediaControl *control)
     ok(state == State_Stopped, "Got state %u.\n", state);
 }
 
+static void test_sample_processing(IMediaControl *control, IMemInputPin *input,
+        IMemAllocator *allocator, const WCHAR *filename)
+{
+    REFERENCE_TIME start, stop;
+    IMediaSample *sample;
+    BYTE buffer[600];
+    FILE *file;
+    HRESULT hr;
+    BYTE *data;
+    LONG size;
+
+    hr = IMemInputPin_ReceiveCanBlock(input);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaControl_Pause(control);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0);
+    ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr);
+
+    hr = IMemAllocator_Commit(allocator);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaSample_GetPointer(sample, &data);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    size = IMediaSample_GetSize(sample);
+    ok(size == 512, "Got size %d.\n", size);
+    memset(data, 0xcc, size);
+    start = 0;
+    stop = 512;
+    hr = IMediaSample_SetTime(sample, &start, &stop);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    strcpy((char *)data, "abcdefghi");
+    hr = IMediaSample_SetActualDataLength(sample, 9);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    hr = IMemInputPin_Receive(input, sample);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    memset(data, 0xcc, size);
+    strcpy((char *)data, "123456");
+    hr = IMediaSample_SetActualDataLength(sample, 6);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    hr = IMemInputPin_Receive(input, sample);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    file = _wfopen(filename, L"rb");
+    ok(!!file, "Failed to open file: %s.\n", strerror(errno));
+    size = fread(buffer, 1, sizeof(buffer), file);
+    ok(size == 512, "Got size %d.\n", size);
+    ok(!memcmp(buffer, "123456\0\xcc\xcc\xcc", 10), "Got data %s.\n",
+            debugstr_an((char *)buffer, size));
+    fclose(file);
+
+    hr = IMediaControl_Stop(control);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    IMediaSample_Release(sample);
+}
+
 static void test_connect_pin(void)
 {
     AM_MEDIA_TYPE req_mt =
@@ -675,6 +737,7 @@ static void test_connect_pin(void)
 
     test_allocator(meminput, allocator);
     test_filter_state(control);
+    test_sample_processing(control, meminput, allocator, filename);
 
     hr = IFilterGraph2_Disconnect(graph, pin);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
-- 
2.26.2




More information about the wine-devel mailing list