X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Fdummy%2Finput.c;h=03de41627d53299ab3be191771e586d6b5525ec3;hb=588723d7c65ccdb0fa5cc39b3cae132176637300;hp=7fbf41912371447002b2645ca777f99f74729c79;hpb=0e282e7763a07cb18a694f34f5eb2365e8b3b283;p=vlc diff --git a/modules/misc/dummy/input.c b/modules/misc/dummy/input.c index 7fbf419123..03de41627d 100644 --- a/modules/misc/dummy/input.c +++ b/modules/misc/dummy/input.c @@ -1,8 +1,8 @@ /***************************************************************************** - * input_dummy.c: dummy input plugin, to manage "vlc:***" special options + * input_dummy.c: dummy input plugin, to manage "vlc://***" special options ***************************************************************************** - * Copyright (C) 2001, 2002 VideoLAN - * $Id: input.c,v 1.6 2003/12/16 12:54:29 gbazin Exp $ + * Copyright (C) 2001, 2002 the VideoLAN team + * $Id$ * * Authors: Samuel Hocevar * @@ -10,7 +10,7 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -18,26 +18,103 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include "dummy.h" /***************************************************************************** - * Local prototypes + * Access functions. *****************************************************************************/ -static int Demux ( input_thread_t * ); +static ssize_t AccessRead( access_t *p_access, uint8_t *p, size_t i_size ) +{ + VLC_UNUSED(p_access); + memset( p, 0, i_size ); + return i_size; +} +static int AccessControl( access_t *p_access, int i_query, va_list args ) +{ + bool *pb_bool; + int *pi_int; + int64_t *pi_64; + + switch( i_query ) + { + /* */ + case ACCESS_CAN_SEEK: + case ACCESS_CAN_FASTSEEK: + case ACCESS_CAN_PAUSE: + case ACCESS_CAN_CONTROL_PACE: + pb_bool = (bool*)va_arg( args, bool* ); + *pb_bool = false; + break; + + /* */ + case ACCESS_GET_MTU: + pi_int = (int*)va_arg( args, int * ); + *pi_int = 0; + break; + + case ACCESS_GET_PTS_DELAY: + pi_64 = (int64_t*)va_arg( args, int64_t * ); + *pi_64 = DEFAULT_PTS_DELAY * 1000; + break; + + /* */ + case ACCESS_SET_PAUSE_STATE: + case ACCESS_GET_TITLE_INFO: + case ACCESS_GET_META: + case ACCESS_SET_TITLE: + case ACCESS_SET_SEEKPOINT: + return VLC_EGENERIC; + + default: + msg_Err( p_access, "unimplemented query in control" ); + return VLC_EGENERIC; + } + return VLC_SUCCESS; +} + +int OpenAccess( vlc_object_t *p_this ) +{ + access_t *p_access = (access_t*)p_this; + + /* Init p_access */ + p_access->pf_read = AccessRead; + p_access->pf_block = NULL; + p_access->pf_seek = NULL; + p_access->pf_control = AccessControl; + p_access->info.i_update = 0; + p_access->info.i_size = 0; + p_access->info.i_pos = 0; + p_access->info.b_eof = false; + p_access->info.i_title = 0; + p_access->info.i_seekpoint = 0; + p_access->p_sys = NULL; + + /* Force dummy demux plug-in */ + free( p_access->psz_demux ); + p_access->psz_demux = strdup( "vlc" ); + + return VLC_SUCCESS; +} + /***************************************************************************** - * access_sys_t: private input data + * Demux *****************************************************************************/ struct demux_sys_t { @@ -46,152 +123,113 @@ struct demux_sys_t /* Used for the pause command */ mtime_t expiration; + + /* The command to run */ + char* psz_command; }; - -#define COMMAND_NOP 0 -#define COMMAND_QUIT 1 -#define COMMAND_LOOP 2 -#define COMMAND_PAUSE 3 - -/***************************************************************************** - * OpenAccess: open the target, ie. do nothing - *****************************************************************************/ -int E_(OpenAccess) ( vlc_object_t *p_this ) +enum { - input_thread_t *p_input = (input_thread_t *)p_this; - - p_input->stream.i_method = INPUT_METHOD_NONE; + COMMAND_NOP = 0, + COMMAND_QUIT = 1, + COMMAND_PAUSE= 3, +}; - /* Force dummy demux plug-in */ - p_input->psz_demux = "vlc,none"; +static int Demux( demux_t * ); +static int DemuxControl( demux_t *, int, va_list ); - return VLC_SUCCESS; -} /***************************************************************************** * OpenDemux: initialize the target, ie. parse the command *****************************************************************************/ -int E_(OpenDemux) ( vlc_object_t *p_this ) +int OpenDemux ( vlc_object_t *p_this ) { - input_thread_t *p_input = (input_thread_t *)p_this; - char * psz_name = p_input->psz_name; + demux_t *p_demux = (demux_t*)p_this; + char * psz_name = p_demux->psz_path; + int i_len = strlen( psz_name ); - struct demux_sys_t * p_method; + demux_sys_t *p_sys; int i_arg; - p_input->stream.b_seekable = 0; - p_input->pf_demux = Demux; - p_input->pf_rewind = NULL; - p_input->pf_demux_control = demux_vaControlDefault; + p_demux->pf_demux = Demux; + p_demux->pf_control = DemuxControl; + p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); - p_method = malloc( sizeof( struct demux_sys_t ) ); - if( p_method == NULL ) - { - msg_Err( p_input, "out of memory" ); - return VLC_EGENERIC; - } - - p_input->p_demux_data = p_method; - p_input->stream.p_demux_data = NULL; - - /* Check for a "vlc:nop" command */ + /* Check for a "vlc://nop" command */ if( i_len == 3 && !strncasecmp( psz_name, "nop", 3 ) ) { - msg_Info( p_input, "command `nop'" ); - p_method->i_command = COMMAND_NOP; + msg_Info( p_demux, "command `nop'" ); + p_sys->i_command = COMMAND_NOP; return VLC_SUCCESS; } - /* Check for a "vlc:quit" command */ + /* Check for a "vlc://quit" command */ if( i_len == 4 && !strncasecmp( psz_name, "quit", 4 ) ) { - msg_Info( p_input, "command `quit'" ); - p_method->i_command = COMMAND_QUIT; + msg_Info( p_demux, "command `quit'" ); + p_sys->i_command = COMMAND_QUIT; return VLC_SUCCESS; } - /* Check for a "vlc:loop" command */ - if( i_len == 4 && !strncasecmp( psz_name, "loop", 4 ) ) - { - msg_Info( p_input, "command `loop'" ); - p_method->i_command = COMMAND_LOOP; - return VLC_SUCCESS; - } - - /* Check for a "vlc:pause:***" command */ + /* Check for a "vlc://pause:***" command */ if( i_len > 6 && !strncasecmp( psz_name, "pause:", 6 ) ) { i_arg = atoi( psz_name + 6 ); - msg_Info( p_input, "command `pause %i'", i_arg ); - p_method->i_command = COMMAND_PAUSE; - p_method->expiration = mdate() + (mtime_t)i_arg * (mtime_t)1000000; + msg_Info( p_demux, "command `pause %i'", i_arg ); + p_sys->i_command = COMMAND_PAUSE; + p_sys->expiration = mdate() + (mtime_t)i_arg * (mtime_t)1000000; return VLC_SUCCESS; } + + msg_Err( p_demux, "unknown command `%s'", psz_name ); - msg_Err( p_input, "unknown command `%s'", psz_name ); - free( p_input->p_demux_data ); - p_input->b_error = 1; - + free( p_sys ); return VLC_EGENERIC; } /***************************************************************************** * CloseDemux: initialize the target, ie. parse the command *****************************************************************************/ -void E_(CloseDemux) ( vlc_object_t *p_this ) +void CloseDemux ( vlc_object_t *p_this ) { - input_thread_t *p_input = (input_thread_t *)p_this; + demux_t *p_demux = (demux_t*)p_this; - free( p_input->p_demux_data ); + free( p_demux->p_sys ); } /***************************************************************************** * Demux: do what the command says *****************************************************************************/ -static int Demux( input_thread_t *p_input ) +static int Demux( demux_t *p_demux ) { - struct demux_sys_t * p_method = p_input->p_demux_data; - playlist_t *p_playlist; + demux_sys_t *p_sys = p_demux->p_sys; + bool b_eof = false; - p_playlist = vlc_object_find( p_input, VLC_OBJECT_PLAYLIST, FIND_PARENT ); - - if( p_playlist == NULL ) - { - msg_Err( p_input, "we are not attached to a playlist" ); - p_input->b_error = 1; - return 1; - } - - switch( p_method->i_command ) + switch( p_sys->i_command ) { case COMMAND_QUIT: - p_input->p_vlc->b_die = 1; - p_input->b_eof = 1; - break; - - case COMMAND_LOOP: - playlist_Goto( p_playlist, 0 ); + b_eof = true; + vlc_object_kill( p_demux->p_libvlc ); break; case COMMAND_PAUSE: - if( mdate() < p_method->expiration ) - { - msleep( 10000 ); - } + if( mdate() >= p_sys->expiration ) + b_eof = true; else - { - p_input->b_eof = 1; - } + msleep( 10000 ); break; - + case COMMAND_NOP: default: - p_input->b_eof = 1; + b_eof = true; break; } - vlc_object_release( p_playlist ); - - return 1; + return b_eof ? 0 : 1; } +static int DemuxControl( demux_t *p_demux, int i_query, va_list args ) +{ + return demux_vaControlHelper( p_demux->s, + 0, 0, 0, 1, + i_query, args ); +}