]> git.sesse.net Git - vlc/blobdiff - src/misc/vlm.c
RTSP rewind and fastforward support (Scale option). Almost entirely rewritten a patch...
[vlc] / src / misc / vlm.c
index b8864c980b359cf3cb078a4401a7bccd5f1726c0..f5798cc9ea66d20da12b949c3803173bf6a0cc7f 100644 (file)
@@ -672,11 +672,11 @@ static int ExecuteCommand( vlm_t *p_vlm, const char *psz_command,
                 p_message = vlm_MessageNew( "load", NULL );
                 goto success;
             case 2:
-                p_message = vlm_MessageNew( "load", "read file error" );
+                p_message = vlm_MessageNew( "load", "Read file error" );
                 goto error;
             case 3:
                 p_message =
-                    vlm_MessageNew( "load", "error while loading file" );
+                    vlm_MessageNew( "load", "Error while loading file" );
                 goto error;
             default:
                 p_message =
@@ -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:
  *****************************************************************************/