gst/adder/gstadder.*: Remember the start position asked in the incoming seeks, so we can output GST_EVENT_NEW_SEGMENT...

Original commit message from CVS:
* gst/adder/gstadder.c: (forward_event_func),
(gst_adder_src_event), (gst_adder_collected),
(gst_adder_change_state):
* gst/adder/gstadder.h:
Remember the start position asked in the incoming seeks, so we can
output GST_EVENT_NEW_SEGMENT with a correct position value (instead
of assuming it will always be 0).
This commit is contained in:
Edward Hervey 2006-08-31 12:39:17 +00:00
parent 208d02b5e4
commit 814b9a530e
3 changed files with 23 additions and 2 deletions

View file

@ -1,3 +1,13 @@
2006-08-31 Edward Hervey <edward@fluendo.com>
* gst/adder/gstadder.c: (forward_event_func),
(gst_adder_src_event), (gst_adder_collected),
(gst_adder_change_state):
* gst/adder/gstadder.h:
Remember the start position asked in the incoming seeks, so we can
output GST_EVENT_NEW_SEGMENT with a correct position value (instead
of assuming it will always be 0).
2006-08-31 Edward Hervey <edward@fluendo.com> 2006-08-31 Edward Hervey <edward@fluendo.com>
* ext/ogg/gstoggdemux.c: (gst_ogg_demux_init), * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init),

View file

@ -375,6 +375,7 @@ static gboolean
forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) forward_event_func (GstPad * pad, GValue * ret, GstEvent * event)
{ {
gst_event_ref (event); gst_event_ref (event);
GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event));
if (!gst_pad_push_event (pad, event)) { if (!gst_pad_push_event (pad, event)) {
g_value_set_boolean (ret, FALSE); g_value_set_boolean (ret, FALSE);
GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.",
@ -434,9 +435,12 @@ gst_adder_src_event (GstPad * pad, GstEvent * event)
case GST_EVENT_SEEK: case GST_EVENT_SEEK:
{ {
GstSeekFlags flags; GstSeekFlags flags;
GstSeekType curtype;
guint64 cur;
/* parse the flushing flag */ /* parse the flushing flag */
gst_event_parse_seek (event, NULL, NULL, &flags, NULL, NULL, NULL, NULL); gst_event_parse_seek (event, NULL, NULL, &flags, &curtype, &cur, NULL,
NULL);
/* if we are not flushing, just forward */ /* if we are not flushing, just forward */
if (!flags & GST_SEEK_FLAG_FLUSH) if (!flags & GST_SEEK_FLAG_FLUSH)
@ -452,6 +456,10 @@ gst_adder_src_event (GstPad * pad, GstEvent * event)
/* now wait for the collected to be finished and mark a new /* now wait for the collected to be finished and mark a new
* segment */ * segment */
GST_OBJECT_LOCK (adder->collect); GST_OBJECT_LOCK (adder->collect);
if (curtype == GST_SEEK_TYPE_SET)
adder->segment_position = cur;
else
adder->segment_position = 0;
adder->segment_pending = TRUE; adder->segment_pending = TRUE;
GST_OBJECT_UNLOCK (adder->collect); GST_OBJECT_UNLOCK (adder->collect);
@ -741,10 +749,11 @@ gst_adder_collected (GstCollectPads * pads, gpointer user_data)
* match. * match.
*/ */
event = gst_event_new_new_segment_full (FALSE, 1.0, event = gst_event_new_new_segment_full (FALSE, 1.0,
1.0, GST_FORMAT_TIME, adder->timestamp, -1, 0); 1.0, GST_FORMAT_TIME, adder->timestamp, -1, adder->segment_position);
gst_pad_push_event (adder->srcpad, event); gst_pad_push_event (adder->srcpad, event);
adder->segment_pending = FALSE; adder->segment_pending = FALSE;
adder->segment_position = 0;
} }
/* set timestamps on the output buffer */ /* set timestamps on the output buffer */
@ -798,6 +807,7 @@ gst_adder_change_state (GstElement * element, GstStateChange transition)
adder->timestamp = 0; adder->timestamp = 0;
adder->offset = 0; adder->offset = 0;
adder->segment_pending = TRUE; adder->segment_pending = TRUE;
adder->segment_position = 0;
gst_segment_init (&adder->segment, GST_FORMAT_UNDEFINED); gst_segment_init (&adder->segment, GST_FORMAT_UNDEFINED);
gst_collect_pads_start (adder->collect); gst_collect_pads_start (adder->collect);
break; break;

View file

@ -80,6 +80,7 @@ struct _GstAdder {
GstPadEventFunction collect_event; GstPadEventFunction collect_event;
GstSegment segment; GstSegment segment;
gboolean segment_pending; gboolean segment_pending;
guint64 segment_position;
}; };
struct _GstAdderClass { struct _GstAdderClass {