]> git.sesse.net Git - vlc/blobdiff - src/control/input.c
Mark subtitles_Filter as static
[vlc] / src / control / input.c
index d2b46b26a11f790d0732b9077eba4e455c13e3b3..825c828a9b9d00e82a37aa25a79e1fcce0767bd6 100644 (file)
  *****************************************************************************/
 
 #include <libvlc_internal.h>
+#include <vlc_demux.h>
 #include <vlc/libvlc.h>
 
 #include <vlc/intf.h>
 
 void libvlc_input_free( libvlc_input_t *p_input )
 {
-    if( p_input )
-        free( p_input );
+    if( p_input ) free( p_input );
 }
 
+/*
+ * Retrieve the input thread. Be sure to release the object
+ * once you are done with it.
+ */
+input_thread_t *libvlc_get_input_thread( libvlc_input_t *p_input,
+                                         libvlc_exception_t *p_e ) 
+{
+    input_thread_t *p_input_thread;
+
+    if( !p_input )
+        RAISENULL( "Input is NULL" );
+
+    p_input_thread = (input_thread_t*)vlc_object_get(
+                                             p_input->p_instance->p_libvlc_int,
+                                             p_input->i_input_id );
+    if( !p_input_thread )
+        RAISENULL( "Input does not exist" );
+
+    return p_input_thread;
+}
+
+
 /**************************************************************************
  * Getters for stream information
  **************************************************************************/
 vlc_int64_t libvlc_input_get_length( libvlc_input_t *p_input,
-                             libvlc_exception_t *p_exception )
+                             libvlc_exception_t *p_e )
 {
     input_thread_t *p_input_thread;
     vlc_value_t val;
 
-    if( !p_input )
-    {
-        libvlc_exception_raise( p_exception, "Input is NULL" );
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e);
+    if( libvlc_exception_raised( p_e ) )
         return -1;
-    }
 
-    p_input_thread = (input_thread_t*)vlc_object_get(
-                                 p_input->p_instance->p_vlc,
-                                 p_input->i_input_id );
-    if( !p_input_thread )
-    {
-        libvlc_exception_raise( p_exception, "Input does not exist" );
-        return -1;
-    }
     var_Get( p_input_thread, "length", &val );
     vlc_object_release( p_input_thread );
 
-    return val.i_time / 1000;
+    return (val.i_time+500LL)/1000LL;
 }
 
 vlc_int64_t libvlc_input_get_time( libvlc_input_t *p_input,
-                           libvlc_exception_t *p_exception )
+                                   libvlc_exception_t *p_e )
 {
     input_thread_t *p_input_thread;
     vlc_value_t val;
 
-    if( !p_input )
-    {
-        libvlc_exception_raise( p_exception, "Input is NULL" );
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e );
+    if( libvlc_exception_raised( p_e ) )
         return -1;
-    }
 
-    p_input_thread = (input_thread_t*)vlc_object_get(
-                                 p_input->p_instance->p_vlc,
-                                 p_input->i_input_id );
-    if( !p_input_thread )
-    {
-        libvlc_exception_raise( p_exception, "Input does not exist" );
-        return -1;
-    }
     var_Get( p_input_thread , "time", &val );
     vlc_object_release( p_input_thread );
+    return (val.i_time+500LL)/1000LL;
+}
+
+void libvlc_input_set_time( libvlc_input_t *p_input, vlc_int64_t time,
+                            libvlc_exception_t *p_e )
+{
+    input_thread_t *p_input_thread;
+    vlc_value_t value;
 
-    return val.i_time / 1000;
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e );
+    if( libvlc_exception_raised( p_e ) )
+        return;
+
+    value.i_time = time*1000LL;
+    var_Set( p_input_thread, "time", value );
+    vlc_object_release( p_input_thread );
 }
 
-float libvlc_input_get_position( libvlc_input_t *p_input,
-                                 libvlc_exception_t *p_exception )
+void libvlc_input_set_position( libvlc_input_t *p_input, float position,
+                                libvlc_exception_t *p_e ) 
 {
     input_thread_t *p_input_thread;
     vlc_value_t val;
+    val.f_float = position;
 
-    if( !p_input )
-    {
-        libvlc_exception_raise( p_exception, "Input is NULL" );
-        return -1;
-    }
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e);
+    if ( libvlc_exception_raised( p_e ) )
+        return;
 
-    p_input_thread = (input_thread_t*)vlc_object_get(
-                            p_input->p_instance->p_vlc,
-                            p_input->i_input_id );
-    if( !p_input_thread )
-    {
-        libvlc_exception_raise( p_exception, "Input does not exist" );
+    var_Set( p_input_thread, "position", val );
+    vlc_object_release( p_input_thread );
+}
+
+float libvlc_input_get_position( libvlc_input_t *p_input,
+                                 libvlc_exception_t *p_e )
+{
+    input_thread_t *p_input_thread;
+    vlc_value_t val;
+
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e);
+    if ( libvlc_exception_raised( p_e ) )
         return -1.0;
-    }
+
     var_Get( p_input_thread, "position", &val );
     vlc_object_release( p_input_thread );
 
     return val.f_float;
 }
 
-vlc_bool_t libvlc_input_will_play( libvlc_input_t *p_input,
-                                   libvlc_exception_t *p_exception
+float libvlc_input_get_fps( libvlc_input_t *p_input,
+                            libvlc_exception_t *p_e
 {
+    double f_fps;
     input_thread_t *p_input_thread;
 
-    if( !p_input )
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e );
+    if ( libvlc_exception_raised( p_e ) )
+        return 0.0;
+
+    if( demux2_Control( p_input_thread->input.p_demux, DEMUX_GET_FPS, &f_fps )
+        || f_fps < 0.1 ) 
     {
-        libvlc_exception_raise( p_exception, "Input is NULL" );
-        return VLC_FALSE;
+        vlc_object_release( p_input_thread );
+        return 0.0;
     }
-
-    p_input_thread = (input_thread_t*)vlc_object_get(
-                            p_input->p_instance->p_vlc,
-                            p_input->i_input_id );
-
-    if( !p_input_thread )
+    else
     {
-        libvlc_exception_raise( p_exception, "Input does not exist" );
-        return VLC_FALSE;
+        vlc_object_release( p_input_thread );
+        return( f_fps );
     }
+}
+
+vlc_bool_t libvlc_input_will_play( libvlc_input_t *p_input,
+                                   libvlc_exception_t *p_e) 
+{
+    input_thread_t *p_input_thread =
+                            libvlc_get_input_thread ( p_input, p_e);
+    if ( libvlc_exception_raised( p_e ) )
+        return VLC_FALSE;
 
     if ( !p_input_thread->b_die && !p_input_thread->b_dead ) 
     {
         vlc_object_release( p_input_thread );
         return VLC_TRUE;
     }
-    
     vlc_object_release( p_input_thread );
     return VLC_FALSE;
 }
+
+void libvlc_input_set_rate( libvlc_input_t *p_input, float rate,
+                                libvlc_exception_t *p_e ) 
+{
+    input_thread_t *p_input_thread;
+    vlc_value_t val;
+
+    if( rate <= 0 )
+        RAISEVOID( "Rate value is invalid" );
+
+    val.i_int = 1000.0f/rate;
+
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e);
+    if ( libvlc_exception_raised( p_e ) )
+        return;
+
+    var_Set( p_input_thread, "rate", val );
+    vlc_object_release( p_input_thread );
+}
+
+float libvlc_input_get_rate( libvlc_input_t *p_input,
+                                 libvlc_exception_t *p_e )
+{
+    input_thread_t *p_input_thread;
+    vlc_value_t val;
+
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e);
+    if ( libvlc_exception_raised( p_e ) )
+        return -1.0;
+
+    var_Get( p_input_thread, "rate", &val );
+    vlc_object_release( p_input_thread );
+
+    return (float)1000.0f/val.i_int;
+}
+
+int libvlc_input_get_state( libvlc_input_t *p_input,
+                                 libvlc_exception_t *p_e )
+{
+    input_thread_t *p_input_thread;
+    vlc_value_t val;
+
+    p_input_thread = libvlc_get_input_thread ( p_input, p_e );
+    if ( libvlc_exception_raised( p_e ) )
+        return 6; /* Return ERROR_S (see include/vlc_input.c) */
+
+    var_Get( p_input_thread, "state", &val );
+    vlc_object_release( p_input_thread );
+
+    return val.i_int;
+}
+