[PATCH 2/6] winegstreamer: Map wg_parser_stream buffer only when needed.

Rémi Bernon wine at gitlab.winehq.org
Fri Jun 3 04:17:11 CDT 2022


From: Rémi Bernon <rbernon at codeweavers.com>

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/winegstreamer/wg_parser.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index 7d55897aa0a..6b1a98c0e7d 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -103,7 +103,6 @@ struct wg_parser_stream
 
     pthread_cond_t event_cond, event_empty_cond;
     GstBuffer *buffer;
-    GstMapInfo map_info;
 
     bool flushing, eos, enabled, has_caps;
 
@@ -306,6 +305,7 @@ static NTSTATUS wg_parser_stream_copy_buffer(void *args)
     struct wg_parser *parser = stream->parser;
     uint32_t offset = params->offset;
     uint32_t size = params->size;
+    GstMapInfo map_info;
 
     pthread_mutex_lock(&parser->mutex);
 
@@ -315,9 +315,18 @@ static NTSTATUS wg_parser_stream_copy_buffer(void *args)
         return VFW_E_WRONG_STATE;
     }
 
-    assert(offset < stream->map_info.size);
-    assert(offset + size <= stream->map_info.size);
-    memcpy(params->data, stream->map_info.data + offset, size);
+    if (!gst_buffer_map(stream->buffer, &map_info, GST_MAP_READ))
+    {
+        pthread_mutex_unlock(&parser->mutex);
+        GST_ERROR("Failed to map buffer.\n");
+        return E_FAIL;
+    }
+
+    assert(offset < map_info.size);
+    assert(offset + size <= map_info.size);
+    memcpy(params->data, map_info.data + offset, size);
+
+    gst_buffer_unmap(stream->buffer, &map_info);
 
     pthread_mutex_unlock(&parser->mutex);
     return S_OK;
@@ -332,7 +341,6 @@ static NTSTATUS wg_parser_stream_release_buffer(void *args)
 
     assert(stream->buffer);
 
-    gst_buffer_unmap(stream->buffer, &stream->map_info);
     gst_buffer_unref(stream->buffer);
     stream->buffer = NULL;
 
@@ -486,7 +494,6 @@ static gboolean sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event)
 
                 if (stream->buffer)
                 {
-                    gst_buffer_unmap(stream->buffer, &stream->map_info);
                     gst_buffer_unref(stream->buffer);
                     stream->buffer = NULL;
                 }
@@ -564,14 +571,6 @@ static GstFlowReturn sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *bu
         return GST_FLOW_FLUSHING;
     }
 
-    if (!gst_buffer_map(buffer, &stream->map_info, GST_MAP_READ))
-    {
-        pthread_mutex_unlock(&parser->mutex);
-        GST_ERROR("Failed to map buffer.\n");
-        gst_buffer_unref(buffer);
-        return GST_FLOW_ERROR;
-    }
-
     stream->buffer = buffer;
 
     pthread_mutex_unlock(&parser->mutex);
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/179



More information about the wine-devel mailing list