summaryrefslogtreecommitdiffstats
path: root/ext/dv
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2006-08-18 13:25:06 +0000
committerEdward Hervey <bilboed@bilboed.com>2006-08-18 13:25:06 +0000
commitab9b853b84a3a2f382e326cd43863594cd61ebf9 (patch)
tree4afe6ba485041e841247975691f32bb2d9b58beb /ext/dv
parent52c986d8765bf1247991786f62ee73fb1d053f5e (diff)
ext/dv/gstdvdemux.*: When handling seek requests, don't send the newsegment event from the calling thread. Instead sa...
Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_pull_seek), (gst_dvdemux_loop), (gst_dvdemux_change_state): * ext/dv/gstdvdemux.h: When handling seek requests, don't send the newsegment event from the calling thread. Instead save it so it can be sent from the streaming thread.
Diffstat (limited to 'ext/dv')
-rw-r--r--ext/dv/gstdvdemux.c30
-rw-r--r--ext/dv/gstdvdemux.h1
2 files changed, 23 insertions, 8 deletions
diff --git a/ext/dv/gstdvdemux.c b/ext/dv/gstdvdemux.c
index e8d70415..7d25c249 100644
--- a/ext/dv/gstdvdemux.c
+++ b/ext/dv/gstdvdemux.c
@@ -1071,15 +1071,15 @@ gst_dvdemux_handle_pull_seek (GstDVDemux * demux, GstPad * pad,
if ((stop = demux->time_segment.stop) == -1)
stop = demux->time_segment.duration;
- /* now send the newsegment */
- GST_DEBUG_OBJECT (demux, "Sending newsegment from %" GST_TIME_FORMAT
- " to %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->time_segment.start),
- GST_TIME_ARGS (stop));
+ GST_INFO_OBJECT (demux,
+ "Saving newsegment event to be sent in streaming thread");
- gst_dvdemux_push_event (demux,
- gst_event_new_new_segment (FALSE,
- demux->time_segment.rate, demux->time_segment.format,
- demux->time_segment.last_stop, stop, demux->time_segment.time));
+ if (demux->pending_segment)
+ gst_event_unref (demux->pending_segment);
+
+ demux->pending_segment = gst_event_new_new_segment (FALSE,
+ demux->time_segment.rate, demux->time_segment.format,
+ demux->time_segment.last_stop, stop, demux->time_segment.time);
demux->need_segment = FALSE;
}
@@ -1610,6 +1610,17 @@ gst_dvdemux_loop (GstPad * pad)
}
}
}
+
+
+ if (G_UNLIKELY (dvdemux->pending_segment)) {
+
+ /* now send the newsegment */
+ GST_DEBUG_OBJECT (dvdemux, "Sending newsegment from");
+
+ gst_dvdemux_push_event (dvdemux, dvdemux->pending_segment);
+ dvdemux->pending_segment = NULL;
+ }
+
if (G_LIKELY (buffer == NULL)) {
GST_DEBUG_OBJECT (dvdemux, "pulling buffer at offset %" G_GINT64_FORMAT,
dvdemux->byte_segment.last_stop);
@@ -1770,6 +1781,9 @@ gst_dvdemux_change_state (GstElement * element, GstStateChange transition)
event_p = &dvdemux->seek_event;
gst_event_replace (event_p, NULL);
+ if (dvdemux->pending_segment)
+ gst_event_unref (dvdemux->pending_segment);
+ dvdemux->pending_segment = NULL;
break;
}
default:
diff --git a/ext/dv/gstdvdemux.h b/ext/dv/gstdvdemux.h
index 6cc228bf..e7dd0c6d 100644
--- a/ext/dv/gstdvdemux.h
+++ b/ext/dv/gstdvdemux.h
@@ -83,6 +83,7 @@ struct _GstDVDemux {
gint found_header; /* ATOMIC */
GstEvent *seek_event;
+ GstEvent *pending_segment;
gint16 *audio_buffers[4];
};