[PATCH v2 2/6] winegstreamer: Read samples synchronously in push_data().

Zebediah Figura z.figura12 at gmail.com
Wed Feb 12 09:34:16 CST 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/winegstreamer/gst_cbs.c  |  9 ----
 dlls/winegstreamer/gst_cbs.h  |  5 ---
 dlls/winegstreamer/gstdemux.c | 81 ++++++++++-------------------------
 3 files changed, 23 insertions(+), 72 deletions(-)

diff --git a/dlls/winegstreamer/gst_cbs.c b/dlls/winegstreamer/gst_cbs.c
index e7a4b41d55f..679d87c52f5 100644
--- a/dlls/winegstreamer/gst_cbs.c
+++ b/dlls/winegstreamer/gst_cbs.c
@@ -227,15 +227,6 @@ void unknown_type_wrapper(GstElement *bin, GstPad *pad, GstCaps *caps, gpointer
     call_cb(&cbdata);
 }
 
-void release_sample_wrapper(gpointer data)
-{
-    struct cb_data cbdata = { RELEASE_SAMPLE };
-
-    cbdata.u.release_sample_data.data = data;
-
-    call_cb(&cbdata);
-}
-
 gboolean query_sink_wrapper(GstPad *pad, GstObject *parent, GstQuery *query)
 {
     struct cb_data cbdata = { QUERY_SINK };
diff --git a/dlls/winegstreamer/gst_cbs.h b/dlls/winegstreamer/gst_cbs.h
index 46f8add57c4..a425671da76 100644
--- a/dlls/winegstreamer/gst_cbs.h
+++ b/dlls/winegstreamer/gst_cbs.h
@@ -42,7 +42,6 @@ enum CB_TYPE {
     REMOVED_DECODED_PAD,
     AUTOPLUG_BLACKLIST,
     UNKNOWN_TYPE,
-    RELEASE_SAMPLE,
     QUERY_SINK
 };
 
@@ -122,9 +121,6 @@ struct cb_data {
             GstCaps *caps;
             gpointer user;
         } unknown_type_data;
-        struct release_sample_data {
-            gpointer data;
-        } release_sample_data;
         struct query_sink_data {
             GstPad *pad;
             GstObject *parent;
@@ -159,7 +155,6 @@ GstFlowReturn got_data_wrapper(GstPad *pad, GstObject *parent, GstBuffer *buf) D
 void removed_decoded_pad_wrapper(GstElement *bin, GstPad *pad, gpointer user) DECLSPEC_HIDDEN;
 GstAutoplugSelectResult autoplug_blacklist_wrapper(GstElement *bin, GstPad *pad, GstCaps *caps, GstElementFactory *fact, gpointer user) DECLSPEC_HIDDEN;
 void unknown_type_wrapper(GstElement *bin, GstPad *pad, GstCaps *caps, gpointer user) DECLSPEC_HIDDEN;
-void release_sample_wrapper(gpointer data) DECLSPEC_HIDDEN;
 void Gstreamer_transform_pad_added_wrapper(GstElement *filter, GstPad *pad, gpointer user) DECLSPEC_HIDDEN;
 gboolean query_sink_wrapper(GstPad *pad, GstObject *parent, GstQuery *query) DECLSPEC_HIDDEN;
 
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 0b5fee30273..b62f44b6a13 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -97,8 +97,6 @@ static inline struct gstdemux *impl_from_strmbase_filter(struct strmbase_filter
     return CONTAINING_RECORD(iface, struct gstdemux, filter);
 }
 
-static const char *media_quark_string = "media-sample";
-
 static const WCHAR wcsInputPinName[] = {'i','n','p','u','t',' ','p','i','n',0};
 static const IMediaSeekingVtbl GST_Seeking_Vtbl;
 static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl;
@@ -744,21 +742,20 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
     }
 }
 
-static void release_sample(void *data)
-{
-    ULONG ret;
-    ret = IMediaSample_Release((IMediaSample *)data);
-    TRACE("Releasing %p returns %u\n", data, ret);
-}
-
 static DWORD CALLBACK push_data(LPVOID iface)
 {
     LONGLONG maxlen, curlen;
     struct gstdemux *This = iface;
-    IMediaSample *buf;
-    DWORD_PTR user;
+    GstMapInfo mapping;
+    GstBuffer *buffer;
     HRESULT hr;
 
+    if (!(buffer = gst_buffer_new_allocate(NULL, 16384, NULL)))
+    {
+        ERR("Failed to allocate memory.\n");
+        return 0;
+    }
+
     IBaseFilter_AddRef(&This->filter.IBaseFilter_iface);
 
     if (!This->stop)
@@ -768,51 +765,30 @@ static DWORD CALLBACK push_data(LPVOID iface)
 
     TRACE("Starting..\n");
     for (;;) {
-        REFERENCE_TIME tStart, tStop;
         ULONG len;
-        GstBuffer *gstbuf;
-        gsize bufsize;
-        BYTE *data;
         int ret;
 
-        hr = IMemAllocator_GetBuffer(This->alloc, &buf, NULL, NULL, 0);
-        if (FAILED(hr))
-            break;
-
         if (This->nextofs >= maxlen)
             break;
-        len = IMediaSample_GetSize(buf);
-        if (This->nextofs + len > maxlen)
-            len = maxlen - This->nextofs;
-
-        tStart = MEDIATIME_FROM_BYTES(This->nextofs);
-        tStop = tStart + MEDIATIME_FROM_BYTES(len);
-        IMediaSample_SetTime(buf, &tStart, &tStop);
+        len = min(16384, maxlen - This->nextofs);
 
-        hr = IAsyncReader_Request(This->reader, buf, 0);
-        if (FAILED(hr)) {
-            IMediaSample_Release(buf);
+        if (!gst_buffer_map_range(buffer, -1, len, &mapping, GST_MAP_WRITE))
+        {
+            ERR("Failed to map buffer.\n");
             break;
         }
-        This->nextofs += len;
-        hr = IAsyncReader_WaitForNext(This->reader, -1, &buf, &user);
-        if (FAILED(hr) || !buf) {
-            if (buf)
-                IMediaSample_Release(buf);
+        hr = IAsyncReader_SyncRead(This->reader, This->nextofs, len, mapping.data);
+        gst_buffer_unmap(buffer, &mapping);
+        if (hr != S_OK)
+        {
+            ERR("Failed to read data, hr %#x.\n", hr);
             break;
         }
 
-        IMediaSample_GetPointer(buf, &data);
-        bufsize = IMediaSample_GetActualDataLength(buf);
-        gstbuf = gst_buffer_new_wrapped_full(0, data, bufsize, 0, bufsize, buf, release_sample_wrapper);
-        IMediaSample_AddRef(buf);
-        gst_mini_object_set_qdata(GST_MINI_OBJECT(gstbuf), g_quark_from_static_string(media_quark_string), buf, release_sample_wrapper);
-        if (!gstbuf) {
-            IMediaSample_Release(buf);
-            break;
-        }
-        gstbuf->duration = gstbuf->pts = -1;
-        ret = gst_pad_push(This->my_src, gstbuf);
+        This->nextofs += len;
+
+        buffer->duration = buffer->pts = -1;
+        ret = gst_pad_push(This->my_src, buffer);
         if (ret >= 0)
             hr = S_OK;
         else
@@ -825,14 +801,9 @@ static DWORD CALLBACK push_data(LPVOID iface)
             break;
     }
 
-    gst_pad_push_event(This->my_src, gst_event_new_eos());
+    gst_buffer_unref(buffer);
 
-    TRACE("Almost stopping.. %08x\n", hr);
-    do {
-        IAsyncReader_WaitForNext(This->reader, 0, &buf, &user);
-        if (buf)
-            IMediaSample_Release(buf);
-    } while (buf);
+    gst_pad_push_event(This->my_src, gst_event_new_eos());
 
     TRACE("Stopping.. %08x\n", hr);
 
@@ -2332,12 +2303,6 @@ void CALLBACK perform_cb(TP_CALLBACK_INSTANCE *instance, void *user)
             unknown_type(data->bin, data->pad, data->caps, data->user);
             break;
         }
-    case RELEASE_SAMPLE:
-        {
-            struct release_sample_data *data = &cbdata->u.release_sample_data;
-            release_sample(data->data);
-            break;
-        }
     case QUERY_SINK:
         {
             struct query_sink_data *data = &cbdata->u.query_sink_data;
-- 
2.25.0




More information about the wine-devel mailing list