GstSeekFlags flags;
GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type;
gint64 cur, stop;
- gboolean flush, skip;
+ gboolean flush, server_side_trickmode;
gboolean update;
gboolean playing;
GstSegment seeksegment = { 0, };
gst_event_parse_seek (event, &rate, &format, &flags,
&cur_type, &cur, &stop_type, &stop);
- /* no negative rates yet */
- if (rate < 0.0)
- goto negative_rate;
-
/* we need TIME format */
if (format != src->segment.format)
goto no_format;
/* get flush flag */
flush = flags & GST_SEEK_FLAG_FLUSH;
- skip = flags & GST_SEEK_FLAG_SKIP;
+ server_side_trickmode = flags & GST_SEEK_FLAG_TRICKMODE;
/* now we need to make sure the streaming thread is stopped. We do this by
* either sending a FLUSH_START event downstream which will cause the
gst_rtspsrc_get_position (src);
gst_rtspsrc_pause (src, FALSE);
}
- src->skip = skip;
+ src->server_side_trickmode = server_side_trickmode;
src->state = GST_RTSP_STATE_SEEKING;
return TRUE;
/* ERRORS */
-negative_rate:
- {
- GST_DEBUG_OBJECT (src, "negative playback rates are not supported yet.");
- return FALSE;
- }
no_format:
{
GST_DEBUG_OBJECT (src, "unsupported format given, seek aborted.");
/* reset our state */
src->need_range = TRUE;
- src->skip = FALSE;
+ src->server_side_trickmode = FALSE;
src->state = GST_RTSP_STATE_READY;
}
if (segment->rate != 1.0) {
- gchar hval[G_ASCII_DTOSTR_BUF_SIZE];
-
- g_ascii_dtostr (hval, sizeof (hval), segment->rate);
- if (src->skip)
- gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SCALE, hval);
- else
- gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SPEED, hval);
+ gchar scale_val[G_ASCII_DTOSTR_BUF_SIZE];
+ gchar speed_val[G_ASCII_DTOSTR_BUF_SIZE];
+
+ if (src->server_side_trickmode) {
+ g_ascii_dtostr (scale_val, sizeof (scale_val), segment->rate);
+ gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SCALE, scale_val);
+ } else if (segment->rate < 0.0) {
+ g_ascii_dtostr (scale_val, sizeof (scale_val), -1.0);
+ gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SCALE, scale_val);
+
+ if (ABS (segment->rate) != 1.0) {
+ g_ascii_dtostr (speed_val, sizeof (speed_val), ABS (segment->rate));
+ gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SPEED, speed_val);
+ }
+ } else {
+ g_ascii_dtostr (speed_val, sizeof (speed_val), segment->rate);
+ gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SPEED, speed_val);
+ }
}
if (seek_style)