mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
pipewiresrc: fix refcounting of buffers
This commit is contained in:
parent
17cc9d2039
commit
21a79241ed
1 changed files with 17 additions and 10 deletions
|
|
@ -215,6 +215,7 @@ gst_pipewire_src_finalize (GObject * object)
|
||||||
gst_object_unref (pwsrc->clock);
|
gst_object_unref (pwsrc->clock);
|
||||||
g_free (pwsrc->path);
|
g_free (pwsrc->path);
|
||||||
g_free (pwsrc->client_name);
|
g_free (pwsrc->client_name);
|
||||||
|
g_object_unref(pwsrc->pool);
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
@ -372,7 +373,7 @@ on_remove_buffer (void *_data, struct pw_buffer *b)
|
||||||
GstBuffer *buf = data->buf;
|
GstBuffer *buf = data->buf;
|
||||||
GList *walk;
|
GList *walk;
|
||||||
|
|
||||||
GST_LOG_OBJECT (pwsrc, "remove buffer");
|
GST_LOG_OBJECT (pwsrc, "remove buffer %p", buf);
|
||||||
|
|
||||||
GST_MINI_OBJECT_CAST (buf)->dispose = NULL;
|
GST_MINI_OBJECT_CAST (buf)->dispose = NULL;
|
||||||
|
|
||||||
|
|
@ -386,6 +387,7 @@ on_remove_buffer (void *_data, struct pw_buffer *b)
|
||||||
}
|
}
|
||||||
walk = next;
|
walk = next;
|
||||||
}
|
}
|
||||||
|
gst_buffer_unref (buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -426,11 +428,8 @@ on_process (void *_data)
|
||||||
mem->offset += data->offset;
|
mem->offset += data->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pwsrc->always_copy)
|
|
||||||
buf = gst_buffer_copy_deep (buf);
|
|
||||||
else
|
|
||||||
gst_buffer_ref (buf);
|
|
||||||
|
|
||||||
|
gst_buffer_ref (buf);
|
||||||
g_queue_push_tail (&pwsrc->queue, buf);
|
g_queue_push_tail (&pwsrc->queue, buf);
|
||||||
|
|
||||||
pw_thread_loop_signal (pwsrc->main_loop, FALSE);
|
pw_thread_loop_signal (pwsrc->main_loop, FALSE);
|
||||||
|
|
@ -831,6 +830,7 @@ gst_pipewire_src_create (GstPushSrc * psrc, GstBuffer ** buffer)
|
||||||
GstPipeWireSrc *pwsrc;
|
GstPipeWireSrc *pwsrc;
|
||||||
GstClockTime pts, dts, base_time;
|
GstClockTime pts, dts, base_time;
|
||||||
const char *error = NULL;
|
const char *error = NULL;
|
||||||
|
GstBuffer *buf;
|
||||||
|
|
||||||
pwsrc = GST_PIPEWIRE_SRC (psrc);
|
pwsrc = GST_PIPEWIRE_SRC (psrc);
|
||||||
|
|
||||||
|
|
@ -854,15 +854,24 @@ gst_pipewire_src_create (GstPushSrc * psrc, GstBuffer ** buffer)
|
||||||
if (state != PW_STREAM_STATE_STREAMING)
|
if (state != PW_STREAM_STATE_STREAMING)
|
||||||
goto streaming_stopped;
|
goto streaming_stopped;
|
||||||
|
|
||||||
*buffer = g_queue_pop_head (&pwsrc->queue);
|
buf = g_queue_pop_head (&pwsrc->queue);
|
||||||
GST_DEBUG ("popped buffer %p", *buffer);
|
GST_DEBUG ("popped buffer %p", buf);
|
||||||
if (*buffer != NULL)
|
if (buf != NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
pw_thread_loop_wait (pwsrc->main_loop);
|
pw_thread_loop_wait (pwsrc->main_loop);
|
||||||
}
|
}
|
||||||
pw_thread_loop_unlock (pwsrc->main_loop);
|
pw_thread_loop_unlock (pwsrc->main_loop);
|
||||||
|
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
|
||||||
|
if (pwsrc->always_copy) {
|
||||||
|
*buffer = gst_buffer_copy_deep (buf);
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*buffer = buf;
|
||||||
|
|
||||||
if (pwsrc->is_live)
|
if (pwsrc->is_live)
|
||||||
base_time = GST_ELEMENT_CAST (psrc)->base_time;
|
base_time = GST_ELEMENT_CAST (psrc)->base_time;
|
||||||
else
|
else
|
||||||
|
|
@ -884,8 +893,6 @@ gst_pipewire_src_create (GstPushSrc * psrc, GstBuffer ** buffer)
|
||||||
GST_BUFFER_PTS (*buffer) = pts;
|
GST_BUFFER_PTS (*buffer) = pts;
|
||||||
GST_BUFFER_DTS (*buffer) = dts;
|
GST_BUFFER_DTS (*buffer) = dts;
|
||||||
|
|
||||||
buffer_recycle (GST_MINI_OBJECT_CAST (*buffer));
|
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
||||||
not_negotiated:
|
not_negotiated:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue