diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2008-12-15 12:02:26 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2008-12-15 12:02:26 +0000 |
commit | 16aa82d6e7f18ffef6087186d88ee97773b6e703 (patch) | |
tree | 048475654004f098c94d61ec1155200b01b02bc2 /gst-libs/gst | |
parent | b26ad06d3477844fd1c3d71511d0f12bc0226b3b (diff) | |
download | gst-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')
-rw-r--r-- | gst-libs/gst/app/gstappsrc.c | 58 |
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 * |