mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 04:36:20 +00:00
icles: Fix waiting for segment-done if it happens too fast
Sometimes we can get segment-done before we got async-done. If we waited for async-done only, the segment-done would be dropped and we would wait forever for it a few lines below.
This commit is contained in:
parent
aeb4d32363
commit
6611517af5
1 changed files with 27 additions and 12 deletions
|
@ -37,6 +37,7 @@ main (int argc, char **argv)
|
||||||
GstMessage *msg;
|
GstMessage *msg;
|
||||||
gchar *uri;
|
gchar *uri;
|
||||||
gint64 dur, start, stop;
|
gint64 dur, start, stop;
|
||||||
|
gboolean prerolled = FALSE;
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
g_printerr ("Usage: %s FILENAME\n", argv[0]);
|
g_printerr ("Usage: %s FILENAME\n", argv[0]);
|
||||||
|
@ -74,6 +75,7 @@ main (int argc, char **argv)
|
||||||
GST_CLOCK_TIME_NONE, GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR);
|
GST_CLOCK_TIME_NONE, GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR);
|
||||||
|
|
||||||
g_assert (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
|
g_assert (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
|
||||||
|
prerolled = TRUE;
|
||||||
|
|
||||||
gst_message_unref (msg);
|
gst_message_unref (msg);
|
||||||
|
|
||||||
|
@ -86,11 +88,14 @@ main (int argc, char **argv)
|
||||||
do {
|
do {
|
||||||
GstSeekFlags seek_flags;
|
GstSeekFlags seek_flags;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
gboolean segment_done = FALSE;
|
||||||
|
|
||||||
seek_flags = GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_SEGMENT;
|
seek_flags = GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_SEGMENT;
|
||||||
|
|
||||||
if (start == 0)
|
if (start == 0) {
|
||||||
|
prerolled = FALSE;
|
||||||
seek_flags |= GST_SEEK_FLAG_FLUSH;
|
seek_flags |= GST_SEEK_FLAG_FLUSH;
|
||||||
|
}
|
||||||
|
|
||||||
stop = start + SEGMENT_DURATION;
|
stop = start + SEGMENT_DURATION;
|
||||||
|
|
||||||
|
@ -102,24 +107,34 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
g_assert (ret);
|
g_assert (ret);
|
||||||
|
|
||||||
if (start == 0) {
|
if (!prerolled) {
|
||||||
/* wait for preroll again */
|
while (!prerolled) {
|
||||||
msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (playbin),
|
/* wait for preroll again */
|
||||||
GST_CLOCK_TIME_NONE, GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR);
|
msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (playbin),
|
||||||
|
GST_CLOCK_TIME_NONE, GST_MESSAGE_SEGMENT_DONE |
|
||||||
|
GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR);
|
||||||
|
|
||||||
g_assert (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
|
g_assert (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
|
||||||
gst_message_unref (msg);
|
if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_SEGMENT_DONE) {
|
||||||
|
segment_done = TRUE;
|
||||||
|
} else {
|
||||||
|
prerolled = TRUE;
|
||||||
|
}
|
||||||
|
gst_message_unref (msg);
|
||||||
|
}
|
||||||
|
|
||||||
gst_element_set_state (playbin, GST_STATE_PLAYING);
|
gst_element_set_state (playbin, GST_STATE_PLAYING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* wait for end of segment */
|
/* wait for end of segment if we didn't get it above already */
|
||||||
msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (playbin),
|
if (!segment_done) {
|
||||||
GST_CLOCK_TIME_NONE, GST_MESSAGE_SEGMENT_DONE | GST_MESSAGE_ERROR);
|
msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (playbin),
|
||||||
|
GST_CLOCK_TIME_NONE, GST_MESSAGE_SEGMENT_DONE | GST_MESSAGE_ERROR);
|
||||||
|
|
||||||
g_assert (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
|
g_assert (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
|
||||||
|
|
||||||
gst_message_unref (msg);
|
gst_message_unref (msg);
|
||||||
|
}
|
||||||
|
|
||||||
start = stop;
|
start = stop;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue