* Copyright (C) 2005 the VideoLAN team
* $Id$
*
- * Authors: Clément Stenac <zorglub@videolan.org>
+ * Authors: Clément Stenac <zorglub@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
-#include <libvlc_internal.h>
+#include "libvlc_internal.h"
#include <vlc/libvlc.h>
-
-#include <vlc/intf.h>
+#include <vlc_demux.h>
+#include <vlc_input.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;
+
+ 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 );
+}
- return val.i_time / 1000;
+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;
+
+ p_input_thread = libvlc_get_input_thread ( p_input, p_e);
+ if ( libvlc_exception_raised( p_e ) )
+ return;
+
+ 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_exception )
+ libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
vlc_value_t val;
- if( !p_input )
+ 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;
+}
+
+float libvlc_input_get_fps( libvlc_input_t *p_input,
+ libvlc_exception_t *p_e)
+{
+ double f_fps;
+ input_thread_t *p_input_thread;
+
+ p_input_thread = libvlc_get_input_thread ( p_input, p_e );
+ if ( libvlc_exception_raised( p_e ) )
+ return 0.0;
+
+ if( demux2_Control( input_GetItem(p_input_thread), DEMUX_GET_FPS, &f_fps )
+ || f_fps < 0.1 )
{
- libvlc_exception_raise( p_exception, "Input is NULL" );
- return -1;
+ vlc_object_release( p_input_thread );
+ return 0.0;
+ }
+ else
+ {
+ vlc_object_release( p_input_thread );
+ return( f_fps );
}
+}
- p_input_thread = (input_thread_t*)vlc_object_get(
- p_input->p_instance->p_vlc,
- p_input->i_input_id );
- if( !p_input_thread )
+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 )
{
- libvlc_exception_raise( p_exception, "Input does not exist" );
- return -1.0;
+ vlc_object_release( p_input_thread );
+ return VLC_TRUE;
}
- var_Get( p_input_thread, "position", &val );
vlc_object_release( p_input_thread );
+ return VLC_FALSE;
+}
- return val.f_float;
+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;
+}
+