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 | 28 ++++++++++++++++------------ gst/elements/gsttypefindelement.c | 6 +++++- libs/gst/base/gstbasesrc.c | 28 ++++++++++++++++------------ plugins/elements/gsttypefindelement.c | 6 +++++- 7 files changed, 53 insertions(+), 36 deletions(-) diff --git a/ChangeLog b/ChangeLog index 52891f7..b7270df 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 9f058d3..4211aae 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 75548b5..1631c61 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 36c0a80..a6bcf39 100644 --- a/gst/base/gstbasesrc.c +++ b/gst/base/gstbasesrc.c @@ -280,30 +280,23 @@ 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; - /* 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; @@ -312,12 +305,24 @@ gst_basesrc_do_seek (GstBaseSrc * src, GstEvent * event) 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)); @@ -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 8983764..1bb130d 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 36c0a80..a6bcf39 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -280,30 +280,23 @@ 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; - /* 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; @@ -312,12 +305,24 @@ gst_basesrc_do_seek (GstBaseSrc * src, GstEvent * event) 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)); @@ -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 8983764..1bb130d 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); -- 2.7.4