appsrc: Update basesrc segment duration and post duration messages from the streaming thread

This commit is contained in:
Sebastian Dröge 2010-02-12 14:29:18 +01:00
parent d0f2b5a1cb
commit 8d7304b12c

View file

@ -940,6 +940,22 @@ gst_app_src_create (GstBaseSrc * bsrc, guint64 offset, guint size,
GstAppSrcPrivate *priv = appsrc->priv; GstAppSrcPrivate *priv = appsrc->priv;
GstFlowReturn ret; GstFlowReturn ret;
GST_OBJECT_LOCK (appsrc);
if (G_UNLIKELY (priv->size != bsrc->segment.duration &&
bsrc->segment.format == GST_FORMAT_BYTES)) {
GST_DEBUG_OBJECT (appsrc,
"Size changed from %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT,
bsrc->segment.duration, priv->size);
gst_segment_set_duration (&bsrc->segment, GST_FORMAT_BYTES, priv->size);
GST_OBJECT_UNLOCK (appsrc);
gst_element_post_message (GST_ELEMENT (appsrc),
gst_message_new_duration (GST_OBJECT (appsrc), GST_FORMAT_BYTES,
priv->size));
} else {
GST_OBJECT_UNLOCK (appsrc);
}
g_mutex_lock (priv->mutex); g_mutex_lock (priv->mutex);
/* check flushing first */ /* check flushing first */
if (G_UNLIKELY (priv->flushing)) if (G_UNLIKELY (priv->flushing))
@ -1121,8 +1137,6 @@ gst_app_src_get_caps (GstAppSrc * appsrc)
void void
gst_app_src_set_size (GstAppSrc * appsrc, gint64 size) gst_app_src_set_size (GstAppSrc * appsrc, gint64 size)
{ {
GstSegment *segment;
gboolean bytes_segment;
GstAppSrcPrivate *priv; GstAppSrcPrivate *priv;
g_return_if_fail (GST_IS_APP_SRC (appsrc)); g_return_if_fail (GST_IS_APP_SRC (appsrc));
@ -1132,17 +1146,7 @@ gst_app_src_set_size (GstAppSrc * appsrc, gint64 size)
GST_OBJECT_LOCK (appsrc); GST_OBJECT_LOCK (appsrc);
GST_DEBUG_OBJECT (appsrc, "setting size of %" G_GINT64_FORMAT, size); GST_DEBUG_OBJECT (appsrc, "setting size of %" G_GINT64_FORMAT, size);
priv->size = size; priv->size = size;
segment = &GST_BASE_SRC_CAST (appsrc)->segment;
bytes_segment = (segment->format == GST_FORMAT_BYTES);
if (bytes_segment)
gst_segment_set_duration (segment, GST_FORMAT_BYTES, size);
GST_OBJECT_UNLOCK (appsrc); GST_OBJECT_UNLOCK (appsrc);
if (bytes_segment)
gst_element_post_message (GST_ELEMENT (appsrc),
gst_message_new_duration (GST_OBJECT (appsrc), GST_FORMAT_BYTES, size));
} }
/** /**