From 92720fa0480e82276f0609af3ee874c503abfcfa Mon Sep 17 00:00:00 2001 From: Guillaume Emont Date: Fri, 26 Mar 2010 13:51:58 +0100 Subject: [PATCH] navseek: add basic support to change playback rate The following keys will now be interpreted by navseek: 'f' means fast forward: the stream gets played at rate 2.0 'r' means rewind: the stream gets played at rate -2.0 'n' means normal: the stream gets played at rate 1.0 Fixes #631516. --- gst/debugutils/gstnavseek.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/gst/debugutils/gstnavseek.c b/gst/debugutils/gstnavseek.c index 2adac13..c7b674d 100644 --- a/gst/debugutils/gstnavseek.c +++ b/gst/debugutils/gstnavseek.c @@ -149,6 +149,39 @@ gst_navseek_seek (GstNavSeek * navseek, gint64 offset) } static void +gst_navseek_change_playback_rate (GstNavSeek * navseek, gdouble rate) +{ + GstFormat peer_format = GST_FORMAT_TIME; + gboolean ret; + GstPad *peer_pad; + gint64 current_position; + + peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); + ret = gst_pad_query_position (peer_pad, &peer_format, ¤t_position); + + if (ret && peer_format == GST_FORMAT_TIME) { + GstEvent *event; + gint64 start; + gint64 stop; + + if (rate > 0.0) { + start = current_position; + stop = -1; + } else { + /* negative rate: we play from stop to start */ + start = 0; + stop = current_position; + } + + event = gst_event_new_seek (rate, GST_FORMAT_TIME, + GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SKIP, + GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop); + + gst_pad_send_event (peer_pad, event); + } +} + +static void gst_navseek_segseek (GstNavSeek * navseek) { GstEvent *event; @@ -221,6 +254,15 @@ gst_navseek_handle_src_event (GstPad * pad, GstEvent * event) /* Toggle the loop flag. If we have both start and end segment times send a seek */ navseek->loop = !navseek->loop; gst_navseek_segseek (navseek); + } else if (strcmp (key, "f") == 0) { + /* fast forward */ + gst_navseek_change_playback_rate (navseek, 2.0); + } else if (strcmp (key, "r") == 0) { + /* rewind */ + gst_navseek_change_playback_rate (navseek, -2.0); + } else if (strcmp (key, "n") == 0) { + /* normal speed */ + gst_navseek_change_playback_rate (navseek, 1.0); } } else { break; -- 2.7.4