X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Finput.c;h=4187394fd18b8120d91166f5aaec75b87dd3ff29;hb=d3fe7f28797d4dba65ffcdd60bf932e758a48a9e;hp=b6c5ee8cb4916ac6990223655afc14730cbec2d1;hpb=2cb472dba008f7d877ffe6bae9c5575253365282;p=vlc diff --git a/src/control/input.c b/src/control/input.c index b6c5ee8cb4..4187394fd1 100644 --- a/src/control/input.c +++ b/src/control/input.c @@ -4,7 +4,7 @@ * Copyright (C) 2005 the VideoLAN team * $Id$ * - * Authors: Clément Stenac + * Authors: Clément Stenac * * 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 @@ -21,94 +21,206 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +#include "libvlc_internal.h" #include - -#include +#include +#include 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; +} +