+2005-06-02 Andy Wingo <wingo@pobox.com>
+
+ * gst/elements/gsttypefindelement.c (do_pull_typefind): Query the
+ file size, pass it on to the type find helper.
+
+ * gst/base/gstbasesrc.c (gst_basesrc_do_seek): Set the
+ segment_start and segment_end properly according to the seek
+ method. Segment_end is still a bit flaky because offset can be
+ negative for CUR and END cases, but it takes -1 as an "unset"
+ value.
+
2005-06-02 Wim Taymans <wim@fluendo.com>
* gst/base/gstbasesink.c: (gst_basesink_pad_buffer_alloc),
@manager:
@bus:
@scheduler:
-@sched_private:
@clock:
@base_time:
@numpads:
@GST_STATE_SUCCESS: the state of the element has already be changed
@GST_STATE_ASYNC: the state of the element will change in the near future
-<!-- ##### ENUM GstResult ##### -->
-<para>
-
-</para>
-
-@GST_RESULT_OK:
-@GST_RESULT_NOK:
-@GST_RESULT_NOT_IMPL:
-
<!-- ##### ENUM GstRank ##### -->
<para>
Element priority ranks. Defines the order in which the autoplugger (or similar
/* get seek positions */
offset = GST_EVENT_SEEK_OFFSET (event);
- src->segment_start = offset;
- src->segment_end = GST_EVENT_SEEK_ENDOFFSET (event);
src->segment_loop = GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_SEGMENT_LOOP;
- /* send flush start */
- gst_pad_push_event (src->srcpad, gst_event_new_flush (FALSE));
-
- /* unblock streaming thread */
- gst_basesrc_unlock (src);
-
- /* grab streaming lock */
- GST_STREAM_LOCK (src->srcpad);
-
switch (GST_EVENT_SEEK_METHOD (event)) {
case GST_SEEK_METHOD_SET:
if (offset < 0)
goto error;
src->offset = MIN (offset, src->size);
+ src->segment_start = src->offset;
+ src->segment_end = MIN (GST_EVENT_SEEK_ENDOFFSET (event), src->size);
GST_DEBUG_OBJECT (src, "seek set pending to %" G_GINT64_FORMAT,
src->offset);
break;
case GST_SEEK_METHOD_CUR:
offset += src->offset;
src->offset = CLAMP (offset, 0, src->size);
+ src->segment_start = src->offset;
+ src->segment_end = GST_EVENT_SEEK_ENDOFFSET (event);
GST_DEBUG_OBJECT (src, "seek cur pending to %" G_GINT64_FORMAT,
src->offset);
break;
goto error;
offset = src->size + offset;
src->offset = MAX (0, offset);
+ src->segment_start = src->offset;
+ src->segment_end = GST_EVENT_SEEK_ENDOFFSET (event);
GST_DEBUG_OBJECT (src, "seek end pending to %" G_GINT64_FORMAT,
src->offset);
break;
default:
goto error;
}
+
+ /* send flush start */
+ gst_pad_push_event (src->srcpad, gst_event_new_flush (FALSE));
+
+ /* unblock streaming thread */
+ gst_basesrc_unlock (src);
+
+ /* grab streaming lock */
+ GST_STREAM_LOCK (src->srcpad);
+
/* send flush end */
gst_pad_push_event (src->srcpad, gst_event_new_flush (TRUE));
error:
{
GST_DEBUG_OBJECT (src, "seek error");
- GST_STREAM_UNLOCK (src->srcpad);
gst_event_unref (event);
return FALSE;
}
peer = gst_pad_get_peer (typefind->sink);
if (peer) {
if (gst_pad_peer_set_active (typefind->sink, GST_ACTIVATE_PULL)) {
- caps = gst_type_find_helper (peer, 0);
+ gint64 size;
+ GstFormat format = GST_FORMAT_BYTES;
+
+ gst_pad_query_position (peer, &format, NULL, &size);
+ caps = gst_type_find_helper (peer, (guint64) size);
if (caps) {
g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE],
0, 100, caps);
/* get seek positions */
offset = GST_EVENT_SEEK_OFFSET (event);
- src->segment_start = offset;
- src->segment_end = GST_EVENT_SEEK_ENDOFFSET (event);
src->segment_loop = GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_SEGMENT_LOOP;
- /* send flush start */
- gst_pad_push_event (src->srcpad, gst_event_new_flush (FALSE));
-
- /* unblock streaming thread */
- gst_basesrc_unlock (src);
-
- /* grab streaming lock */
- GST_STREAM_LOCK (src->srcpad);
-
switch (GST_EVENT_SEEK_METHOD (event)) {
case GST_SEEK_METHOD_SET:
if (offset < 0)
goto error;
src->offset = MIN (offset, src->size);
+ src->segment_start = src->offset;
+ src->segment_end = MIN (GST_EVENT_SEEK_ENDOFFSET (event), src->size);
GST_DEBUG_OBJECT (src, "seek set pending to %" G_GINT64_FORMAT,
src->offset);
break;
case GST_SEEK_METHOD_CUR:
offset += src->offset;
src->offset = CLAMP (offset, 0, src->size);
+ src->segment_start = src->offset;
+ src->segment_end = GST_EVENT_SEEK_ENDOFFSET (event);
GST_DEBUG_OBJECT (src, "seek cur pending to %" G_GINT64_FORMAT,
src->offset);
break;
goto error;
offset = src->size + offset;
src->offset = MAX (0, offset);
+ src->segment_start = src->offset;
+ src->segment_end = GST_EVENT_SEEK_ENDOFFSET (event);
GST_DEBUG_OBJECT (src, "seek end pending to %" G_GINT64_FORMAT,
src->offset);
break;
default:
goto error;
}
+
+ /* send flush start */
+ gst_pad_push_event (src->srcpad, gst_event_new_flush (FALSE));
+
+ /* unblock streaming thread */
+ gst_basesrc_unlock (src);
+
+ /* grab streaming lock */
+ GST_STREAM_LOCK (src->srcpad);
+
/* send flush end */
gst_pad_push_event (src->srcpad, gst_event_new_flush (TRUE));
error:
{
GST_DEBUG_OBJECT (src, "seek error");
- GST_STREAM_UNLOCK (src->srcpad);
gst_event_unref (event);
return FALSE;
}
peer = gst_pad_get_peer (typefind->sink);
if (peer) {
if (gst_pad_peer_set_active (typefind->sink, GST_ACTIVATE_PULL)) {
- caps = gst_type_find_helper (peer, 0);
+ gint64 size;
+ GstFormat format = GST_FORMAT_BYTES;
+
+ gst_pad_query_position (peer, &format, NULL, &size);
+ caps = gst_type_find_helper (peer, (guint64) size);
if (caps) {
g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE],
0, 100, caps);