]> git.sesse.net Git - vlc/commitdiff
RTSP rewind and fastforward support (Scale option). Almost entirely rewritten a patch...
authorJean-Paul Saman <jpsaman@videolan.org>
Wed, 12 Jul 2006 18:48:21 +0000 (18:48 +0000)
committerJean-Paul Saman <jpsaman@videolan.org>
Wed, 12 Jul 2006 18:48:21 +0000 (18:48 +0000)
THANKS
include/vlc_vod.h
modules/misc/rtsp.c
src/misc/vlm.c

diff --git a/THANKS b/THANKS
index ada93c3ea8c62244b62eee073fe3ad367e68a84e..e609509962ba20aaf2ba5503364a325f20522204 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -85,6 +85,7 @@ Jonas Larsen <jonas at vrt.dk> - Danish translation
 Julien Blache <jb at technologeek.org> - disc ejection code
 kty0ne - WinAmp 5 skin for VLC
 Kevin H. Patterson <kevpatt at khptech dot com> - Theora framesize calculation patch by Kevin H. Patterson (kevpatt at khptech dot com
+K. Staring <qdk at quickdekay dot net> - RTSP rewind and fast-forward support
 Laurent Jonqueres <laurent_jonqueres at yahoo.fr> - Occitan localization
 Laurent Mutricy <laurent.mutricy at ecl2005 dot ec-lyon dot fr> - HTTP interface fixes
 Lorena Gomes - Catalan translation
index e91c28231b7deaa0b8ed3383113692518acb76d4..ca82e76a2469192940bc31781c17175ef142d8e1 100644 (file)
@@ -63,6 +63,8 @@ enum vod_query_e
     VOD_MEDIA_PAUSE,        /* arg1= double *       res=    */
     VOD_MEDIA_STOP,         /* arg1= double         res=can fail    */
     VOD_MEDIA_SEEK,         /* arg1= double *       res=    */
+    VOD_MEDIA_REWIND,       /* arg1= double *       res=    */
+    VOD_MEDIA_FORWARD,      /* arg1= double *       res=    */
 };
 
 #endif
index c86c576acc9c95942fd7f72d84f5b02e8110fa96..f2ec3417e2cdc576da48c07ea5a5758d8a80e293 100644 (file)
@@ -785,7 +785,7 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
 
         case HTTPD_MSG_PLAY:
         {
-            char *psz_output, *psz_position, ip[NI_MAXNUMERICHOST];
+            char *psz_output, ip[NI_MAXNUMERICHOST];
             int i, i_port_audio = 0, i_port_video = 0;
 
             /* for now only multicast so easy */
@@ -807,14 +807,14 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
             if( p_rtsp->b_playing )
             {
                 char *psz_position = httpd_MsgGet( query, "Range" );
+                char *psz_scale = httpd_MsgGet( query, "Scale" );
                 if( psz_position ) psz_position = strstr( psz_position, "npt=" );
-                if( psz_position )
+                if( psz_position && !psz_scale )
                 {
                     double f_pos;
                     char *end;
 
                     msg_Dbg( p_vod, "seeking request: %s", psz_position );
-
                     psz_position += 4;
                     /* FIXME: npt= is not necessarily formatted as a float */
                     f_pos = us_strtod( psz_position, &end );
@@ -826,6 +826,37 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
                     }
                     break;
                 }
+                if( psz_scale )
+                {
+                    double f_scale = 0.0;
+                    char *end;
+
+                    f_scale = us_strtod( psz_scale, &end );
+                    if( end > psz_scale )
+                    {
+                        f_scale = (f_scale * 30.0);
+                        if( psz_scale[0] == '-' ) /* rewind */
+                        {
+                            msg_Dbg( p_vod, "rewind request: %s", psz_scale );
+                            vod_MediaControl( p_vod, p_media, psz_session,
+                                                VOD_MEDIA_REWIND, f_scale );
+                        }
+                        else if(psz_scale[0] != '1' ) /* fast-forward */
+                        {
+                            msg_Dbg( p_vod, "fastforward request: %s", psz_scale );
+                            vod_MediaControl( p_vod, p_media, psz_session,
+                                                VOD_MEDIA_FORWARD, f_scale );
+                        }
+
+                        if( p_rtsp->b_paused == VLC_TRUE )
+                        {
+                            p_rtsp->b_paused = VLC_FALSE;
+                            vod_MediaControl( p_vod, p_media, psz_session,
+                                                VOD_MEDIA_PAUSE, psz_output );
+                        }
+                    }
+                    break;
+                }
             }
 
             if( p_rtsp->b_playing && p_rtsp->b_paused )
index 19bad42aafb6d726aae0acae7899b82e63455aee..f5798cc9ea66d20da12b949c3803173bf6a0cc7f 100644 (file)
@@ -1276,6 +1276,40 @@ int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, const char *psz_id,
             }
         }
     }
+    else if( !strcmp( psz_command, "rewind" ) )
+    {
+        float f_pos;
+        float f_scale;
+        vlc_value_t val;
+
+        if( psz_args )
+        {
+            f_scale = i18n_atof( psz_args );
+            f_pos = var_GetFloat( p_instance->p_input, "position" );
+            val.f_float = f_pos - (f_scale / 1000.0);
+            if( val.f_float < 0.0 )
+                val.f_float = 0.0;
+            var_Set( p_instance->p_input, "position", val );
+            return VLC_SUCCESS;
+        }
+    }
+    else if( !strcmp( psz_command, "forward" ) )
+    {
+        float f_pos;
+        float f_scale;
+        vlc_value_t val;
+
+        if( psz_args )
+        {
+            f_scale = i18n_atof( psz_args );
+            f_pos = var_GetFloat( p_instance->p_input, "position" );
+            val.f_float = f_pos + (f_scale / 1000.0);
+            if( val.f_float > 1.0 )
+                val.f_float = 1.0;
+            var_Set( p_instance->p_input, "position", val );
+            return VLC_SUCCESS;
+        }
+    }
     else if( !strcmp( psz_command, "stop" ) )
     {
         TAB_REMOVE( media->i_instance, media->instance, p_instance );
@@ -2353,6 +2387,26 @@ int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media,
         break;
     }
 
+    case VOD_MEDIA_REWIND:
+    {
+        double f_scale = (double)va_arg( args, double );
+        char psz_scale[50];
+        lldiv_t div = lldiv( f_scale * 10000000, 10000000 );
+        sprintf( psz_scale, I64Fd".%07u", div.quot, (unsigned int) div.rem );
+        i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "rewind", psz_scale );
+        break;
+    }
+
+    case VOD_MEDIA_FORWARD:
+    {
+        double f_scale = (double)va_arg( args, double );
+        char psz_scale[50];
+        lldiv_t div = lldiv( f_scale * 10000000, 10000000 );
+        sprintf( psz_scale, I64Fd".%07u", div.quot, (unsigned int) div.rem );
+        i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "forward", psz_scale );
+        break;
+    }
+
     default:
         break;
     }
@@ -2362,6 +2416,7 @@ int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media,
     return i_ret;
 }
 
+
 /*****************************************************************************
  * Manage:
  *****************************************************************************/