summaryrefslogtreecommitdiffstats
path: root/gst-libs/gst/app/gstappsrc.c
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2008-12-15 12:02:26 +0000
committerWim Taymans <wim.taymans@gmail.com>2008-12-15 12:02:26 +0000
commit16aa82d6e7f18ffef6087186d88ee97773b6e703 (patch)
tree048475654004f098c94d61ec1155200b01b02bc2 /gst-libs/gst/app/gstappsrc.c
parentb26ad06d3477844fd1c3d71511d0f12bc0226b3b (diff)
downloadgst-plugins-bad-16aa82d6e7f18ffef6087186d88ee97773b6e703.tar.gz
gst-plugins-bad-16aa82d6e7f18ffef6087186d88ee97773b6e703.tar.bz2
gst-plugins-bad-16aa82d6e7f18ffef6087186d88ee97773b6e703.zip
examples/app/: Fix example to unref after emiting the push-buffer action.
Original commit message from CVS: * examples/app/appsrc-ra.c: (feed_data): * examples/app/appsrc-seekable.c: (feed_data): * examples/app/appsrc-stream.c: (read_data): * examples/app/appsrc-stream2.c: (feed_data): Fix example to unref after emiting the push-buffer action. * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init), (gst_app_src_push_buffer_full), (gst_app_src_push_buffer), (gst_app_src_push_buffer_action): Don't take the ref on the buffer in push-buffer action because it's too awkward for bindings. Fixes #564482.
Diffstat (limited to 'gst-libs/gst/app/gstappsrc.c')
-rw-r--r--gst-libs/gst/app/gstappsrc.c58
1 files changed, 40 insertions, 18 deletions
diff --git a/gst-libs/gst/app/gstappsrc.c b/gst-libs/gst/app/gstappsrc.c
index 3bec52f2..27848080 100644
--- a/gst-libs/gst/app/gstappsrc.c
+++ b/gst-libs/gst/app/gstappsrc.c
@@ -127,6 +127,8 @@ static gboolean gst_app_src_do_seek (GstBaseSrc * src, GstSegment * segment);
static gboolean gst_app_src_is_seekable (GstBaseSrc * src);
static gboolean gst_app_src_check_get_range (GstBaseSrc * src);
static gboolean gst_app_src_do_get_size (GstBaseSrc * src, guint64 * size);
+static GstFlowReturn gst_app_src_push_buffer_action (GstAppSrc * appsrc,
+ GstBuffer * buffer);
static guint gst_app_src_signals[LAST_SIGNAL] = { 0 };
@@ -302,7 +304,8 @@ gst_app_src_class_init (GstAppSrcClass * klass)
* @buffer: a buffer to push
*
* Adds a buffer to the queue of buffers that the appsrc element will
- * push to its source pad. This function will take ownership of @buffer.
+ * push to its source pad. This function does not take ownership of the
+ * buffer so the buffer needs to be unreffed after calling this function.
*
* When the block property is TRUE, this function can block until free space
* becomes available in the queue.
@@ -335,7 +338,7 @@ gst_app_src_class_init (GstAppSrcClass * klass)
basesrc_class->check_get_range = gst_app_src_check_get_range;
basesrc_class->get_size = gst_app_src_do_get_size;
- klass->push_buffer = gst_app_src_push_buffer;
+ klass->push_buffer = gst_app_src_push_buffer_action;
klass->end_of_stream = gst_app_src_end_of_stream;
}
@@ -916,20 +919,9 @@ gst_app_src_get_max_bytes (GstAppSrc * appsrc)
return result;
}
-/**
- * gst_app_src_push_buffer:
- * @appsrc: a #GstAppSrc
- * @buffer: a #GstBuffer to push
- *
- * Adds a buffer to the queue of buffers that the appsrc element will
- * push to its source pad. This function takes ownership of the buffer.
- *
- * Returns: #GST_FLOW_OK when the buffer was successfuly queued.
- * #GST_FLOW_WRONG_STATE when @appsrc is not PAUSED or PLAYING.
- * #GST_FLOW_UNEXPECTED when EOS occured.
- */
-GstFlowReturn
-gst_app_src_push_buffer (GstAppSrc * appsrc, GstBuffer * buffer)
+static GstFlowReturn
+gst_app_src_push_buffer_full (GstAppSrc * appsrc, GstBuffer * buffer,
+ gboolean steal_ref)
{
gboolean first = TRUE;
@@ -979,6 +971,8 @@ gst_app_src_push_buffer (GstAppSrc * appsrc, GstBuffer * buffer)
}
GST_DEBUG_OBJECT (appsrc, "queueing buffer %p", buffer);
+ if (!steal_ref)
+ gst_buffer_ref (buffer);
g_queue_push_tail (appsrc->queue, buffer);
appsrc->queued_bytes += GST_BUFFER_SIZE (buffer);
g_cond_broadcast (appsrc->cond);
@@ -990,20 +984,48 @@ gst_app_src_push_buffer (GstAppSrc * appsrc, GstBuffer * buffer)
flushing:
{
GST_DEBUG_OBJECT (appsrc, "refuse buffer %p, we are flushing", buffer);
- gst_buffer_unref (buffer);
+ if (steal_ref)
+ gst_buffer_unref (buffer);
g_mutex_unlock (appsrc->mutex);
return GST_FLOW_WRONG_STATE;
}
eos:
{
GST_DEBUG_OBJECT (appsrc, "refuse buffer %p, we are EOS", buffer);
- gst_buffer_unref (buffer);
+ if (steal_ref)
+ gst_buffer_unref (buffer);
g_mutex_unlock (appsrc->mutex);
return GST_FLOW_UNEXPECTED;
}
}
/**
+ * gst_app_src_push_buffer:
+ * @appsrc: a #GstAppSrc
+ * @buffer: a #GstBuffer to push
+ *
+ * Adds a buffer to the queue of buffers that the appsrc element will
+ * push to its source pad. This function takes ownership of the buffer.
+ *
+ * Returns: #GST_FLOW_OK when the buffer was successfuly queued.
+ * #GST_FLOW_WRONG_STATE when @appsrc is not PAUSED or PLAYING.
+ * #GST_FLOW_UNEXPECTED when EOS occured.
+ */
+GstFlowReturn
+gst_app_src_push_buffer (GstAppSrc * appsrc, GstBuffer * buffer)
+{
+ return gst_app_src_push_buffer_full (appsrc, buffer, TRUE);
+}
+
+/* push a buffer without stealing the ref of the buffer. This is used for the
+ * action signal. */
+static GstFlowReturn
+gst_app_src_push_buffer_action (GstAppSrc * appsrc, GstBuffer * buffer)
+{
+ return gst_app_src_push_buffer_full (appsrc, buffer, FALSE);
+}
+
+/**
* gst_app_src_end_of_stream:
* @appsrc: a #GstAppSrc
*