From 26a1c2c66358293e445be533893249e1066f72f6 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Thu, 2 Jun 2005 11:12:34 +0000 Subject: [PATCH] gst/elements/gsttypefindelement.c (do_pull_typefind): Query the file size, pass it on to the type find helper. Original commit message from CVS: 2005-06-02 Andy Wingo * 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. --- ChangeLog | 11 +++++ docs/gst/tmpl/gstelement.sgml | 1 - docs/gst/tmpl/gsttypes.sgml | 9 ---- gst/base/gstbasesrc.c | 60 ++++++++++++++------------- gst/elements/gsttypefindelement.c | 6 ++- libs/gst/base/gstbasesrc.c | 60 ++++++++++++++------------- plugins/elements/gsttypefindelement.c | 6 ++- 7 files changed, 85 insertions(+), 68 deletions(-) diff --git a/ChangeLog b/ChangeLog index 52891f75aa..b7270df52e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-06-02 Andy Wingo + + * 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 * gst/base/gstbasesink.c: (gst_basesink_pad_buffer_alloc), diff --git a/docs/gst/tmpl/gstelement.sgml b/docs/gst/tmpl/gstelement.sgml index 9f058d3b26..4211aaef32 100644 --- a/docs/gst/tmpl/gstelement.sgml +++ b/docs/gst/tmpl/gstelement.sgml @@ -78,7 +78,6 @@ and gst_element_set_clock(). You can wait for the clock to reach a given @manager: @bus: @scheduler: -@sched_private: @clock: @base_time: @numpads: diff --git a/docs/gst/tmpl/gsttypes.sgml b/docs/gst/tmpl/gsttypes.sgml index 75548b547c..1631c619af 100644 --- a/docs/gst/tmpl/gsttypes.sgml +++ b/docs/gst/tmpl/gsttypes.sgml @@ -36,15 +36,6 @@ against the GstElementStateReturn value. @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 - - - - - -@GST_RESULT_OK: -@GST_RESULT_NOK: -@GST_RESULT_NOT_IMPL: - Element priority ranks. Defines the order in which the autoplugger (or similar diff --git a/gst/base/gstbasesrc.c b/gst/base/gstbasesrc.c index 36c0a80f88..a6bcf39222 100644 --- a/gst/base/gstbasesrc.c +++ b/gst/base/gstbasesrc.c @@ -280,10 +280,40 @@ gst_basesrc_do_seek (GstBaseSrc * src, GstEvent * event) /* 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; + 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; + case GST_SEEK_METHOD_END: + if (offset > 0) + 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)); @@ -293,31 +323,6 @@ gst_basesrc_do_seek (GstBaseSrc * src, GstEvent * event) /* 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); - 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); - GST_DEBUG_OBJECT (src, "seek cur pending to %" G_GINT64_FORMAT, - src->offset); - break; - case GST_SEEK_METHOD_END: - if (offset > 0) - goto error; - offset = src->size + offset; - src->offset = MAX (0, offset); - GST_DEBUG_OBJECT (src, "seek end pending to %" G_GINT64_FORMAT, - src->offset); - break; - default: - goto error; - } /* send flush end */ gst_pad_push_event (src->srcpad, gst_event_new_flush (TRUE)); @@ -345,7 +350,6 @@ gst_basesrc_do_seek (GstBaseSrc * src, GstEvent * event) error: { GST_DEBUG_OBJECT (src, "seek error"); - GST_STREAM_UNLOCK (src->srcpad); gst_event_unref (event); return FALSE; } diff --git a/gst/elements/gsttypefindelement.c b/gst/elements/gsttypefindelement.c index 8983764b39..1bb130d7c4 100644 --- a/gst/elements/gsttypefindelement.c +++ b/gst/elements/gsttypefindelement.c @@ -758,7 +758,11 @@ do_pull_typefind (GstTypeFindElement * typefind) 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); diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index 36c0a80f88..a6bcf39222 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -280,10 +280,40 @@ gst_basesrc_do_seek (GstBaseSrc * src, GstEvent * event) /* 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; + 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; + case GST_SEEK_METHOD_END: + if (offset > 0) + 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)); @@ -293,31 +323,6 @@ gst_basesrc_do_seek (GstBaseSrc * src, GstEvent * event) /* 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); - 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); - GST_DEBUG_OBJECT (src, "seek cur pending to %" G_GINT64_FORMAT, - src->offset); - break; - case GST_SEEK_METHOD_END: - if (offset > 0) - goto error; - offset = src->size + offset; - src->offset = MAX (0, offset); - GST_DEBUG_OBJECT (src, "seek end pending to %" G_GINT64_FORMAT, - src->offset); - break; - default: - goto error; - } /* send flush end */ gst_pad_push_event (src->srcpad, gst_event_new_flush (TRUE)); @@ -345,7 +350,6 @@ gst_basesrc_do_seek (GstBaseSrc * src, GstEvent * event) error: { GST_DEBUG_OBJECT (src, "seek error"); - GST_STREAM_UNLOCK (src->srcpad); gst_event_unref (event); return FALSE; } diff --git a/plugins/elements/gsttypefindelement.c b/plugins/elements/gsttypefindelement.c index 8983764b39..1bb130d7c4 100644 --- a/plugins/elements/gsttypefindelement.c +++ b/plugins/elements/gsttypefindelement.c @@ -758,7 +758,11 @@ do_pull_typefind (GstTypeFindElement * typefind) 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);