⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * file.c: file input (file: access plug-in) ***************************************************************************** * Copyright (C) 2001-2004 VideoLAN * $Id: file.c 10310 2005-03-11 22:36:40Z anil $ * * Authors: Christophe Massiot <massiot@via.ecp.fr> * * 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 * 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 * GNU General Public License for more details. * * 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. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <vlc/vlc.h>#include <vlc/input.h>#include <stdlib.h>#include <string.h>#include <errno.h>#ifdef HAVE_SYS_TYPES_H#   include <sys/types.h>#endif#ifdef HAVE_SYS_TIME_H#   include <sys/time.h>#endif#ifdef HAVE_SYS_STAT_H#   include <sys/stat.h>#endif#ifdef HAVE_FCNTL_H#   include <fcntl.h>#endif#ifdef HAVE_UNISTD_H#   include <unistd.h>#elif defined( WIN32 ) && !defined( UNDER_CE )#   include <io.h>#endif#if defined( WIN32 ) && !defined( UNDER_CE )/* stat() support for large files on win32 */#   define stat _stati64#   define fstat(a,b) _fstati64(a,b)#   ifdef lseek#      undef lseek#   endif#   define lseek _lseeki64#elif defined( UNDER_CE )#   ifdef read#      undef read#   endif#   define read(a,b,c) fread(b,1,c,a)#   define close(a) fclose(a)#   ifdef lseek#      undef lseek#   endif#   define lseek fseek#endif/***************************************************************************** * Module descriptor *****************************************************************************/static int  Open ( vlc_object_t * );static void Close( vlc_object_t * );#define CACHING_TEXT N_("Caching value in ms")#define CACHING_LONGTEXT N_( \    "Allows you to modify the default caching value for file streams. This " \    "value should be set in millisecond units." )#define CAT_TEXT N_("Concatenate with additional files")#define CAT_LONGTEXT N_( \    "Allows you to play split files as if they were part of a unique file. " \    "Specify a comma-separated list of files." )vlc_module_begin();    set_description( _("Standard filesystem file input") );    set_shortname( _("File") );    set_category( CAT_INPUT );    set_subcategory( SUBCAT_INPUT_ACCESS );    add_integer( "file-caching", DEFAULT_PTS_DELAY / 1000, NULL, CACHING_TEXT, CACHING_LONGTEXT, VLC_TRUE );    add_string( "file-cat", NULL, NULL, CAT_TEXT, CAT_LONGTEXT, VLC_TRUE );    set_capability( "access2", 50 );    add_shortcut( "file" );    add_shortcut( "stream" );    add_shortcut( "kfir" );    set_callbacks( Open, Close );vlc_module_end();/***************************************************************************** * Exported prototypes *****************************************************************************/static int  Seek( access_t *, int64_t );static int  Read( access_t *, uint8_t *, int );static int  Control( access_t *, int, va_list );static int  _OpenFile( access_t *, char * );typedef struct{    char     *psz_name;    int64_t  i_size;} file_entry_t;struct access_sys_t{    unsigned int i_nb_reads;    vlc_bool_t   b_kfir;    /* Files list */    int          i_file;    file_entry_t **file;    /* Current file */    int  i_index;#ifndef UNDER_CE    int  fd;    int  fd_backup;#else    FILE *fd;    FILE *fd_backup;#endif    /* */    vlc_bool_t b_seekable;    vlc_bool_t b_pace_control;};/***************************************************************************** * Open: open the file *****************************************************************************/static int Open( vlc_object_t *p_this ){    access_t     *p_access = (access_t*)p_this;    access_sys_t *p_sys;    char *psz_name = p_access->psz_path;    char *psz;#ifdef HAVE_SYS_STAT_H    int                 i_stat;    struct stat         stat_info;#endif    vlc_bool_t          b_stdin;    file_entry_t *      p_file;    b_stdin = psz_name[0] == '-' && psz_name[1] == '\0';#ifdef HAVE_SYS_STAT_H    if( !b_stdin && (i_stat = stat( psz_name, &stat_info )) == (-1) )    {        msg_Warn( p_access, "cannot stat() file `%s' (%s)",                  psz_name, strerror(errno));        return VLC_EGENERIC;    }#endif    p_access->pf_read = Read;    p_access->pf_block = NULL;    p_access->pf_seek = Seek;    p_access->pf_control = Control;    p_access->info.i_update = 0;    p_access->info.i_size = 0;    p_access->info.i_pos = 0;    p_access->info.b_eof = VLC_FALSE;    p_access->info.i_title = 0;    p_access->info.i_seekpoint = 0;    p_access->p_sys = p_sys = malloc( sizeof( access_sys_t ) );    p_sys->i_nb_reads = 0;    p_sys->b_kfir = VLC_FALSE;    p_sys->file = NULL;    p_sys->i_file = 0;    p_sys->i_index = 0;#ifndef UNDER_CE    p_sys->fd = -1;#endif    if( !strcasecmp( p_access->psz_access, "stream" ) )    {        p_sys->b_seekable = VLC_FALSE;        p_sys->b_pace_control = VLC_FALSE;    }    else if( !strcasecmp( p_access->psz_access, "kfir" ) )    {        p_sys->b_seekable = VLC_FALSE;        p_sys->b_pace_control = VLC_FALSE;        p_sys->b_kfir = VLC_TRUE;    }    else    {        /* file:%s or %s */        p_sys->b_pace_control = VLC_TRUE;        if( b_stdin )        {            p_sys->b_seekable = VLC_FALSE;        }#ifdef UNDER_CE        else if( VLC_TRUE )        {            /* We'll update i_size after it's been opened */            p_sys->b_seekable = VLC_TRUE;        }#elif defined( HAVE_SYS_STAT_H )        else if( S_ISREG(stat_info.st_mode) || S_ISCHR(stat_info.st_mode) ||                 S_ISBLK(stat_info.st_mode) )        {            p_sys->b_seekable = VLC_TRUE;            p_access->info.i_size = stat_info.st_size;        }        else if( S_ISFIFO(stat_info.st_mode)#   if !defined( SYS_BEOS ) && !defined( WIN32 )                  || S_ISSOCK(stat_info.st_mode)#   endif               )        {            p_sys->b_seekable = VLC_FALSE;        }#endif        else        {            msg_Err( p_access, "unknown file type for `%s'", psz_name );            return VLC_EGENERIC;        }    }    msg_Dbg( p_access, "opening file `%s'", psz_name );    if( b_stdin )    {        p_sys->fd = 0;    }    else if( _OpenFile( p_access, psz_name ) )    {        free( p_sys );        return VLC_EGENERIC;    }    if( p_sys->b_seekable && !p_access->info.i_size )    {        /* FIXME that's bad because all others access will be probed */        msg_Err( p_access, "file %s is empty, aborting", psz_name );        free( p_sys );        return VLC_EGENERIC;    }    /* Update default_pts to a suitable value for file access */    var_Create( p_access, "file-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    /*     * Get the additional list of files     */    p_file = malloc( sizeof(file_entry_t) );    p_file->i_size = p_access->info.i_size;    p_file->psz_name = strdup( psz_name );    TAB_APPEND( p_sys->i_file, p_sys->file, p_file );    psz = var_CreateGetString( p_access, "file-cat" );    if( *psz )    {        char *psz_parser = psz_name = psz;        int64_t i_size;        while( psz_name && *psz_name )        {            psz_parser = strchr( psz_name, ',' );            if( psz_parser ) *psz_parser = 0;            psz_name = strdup( psz_name );            if( psz_name )            {                msg_Dbg( p_access, "adding file `%s'", psz_name );                i_size = 0;#ifdef HAVE_SYS_STAT_H                if( !stat( psz_name, &stat_info ) )                {                    p_access->info.i_size += stat_info.st_size;                    i_size = stat_info.st_size;                }                else                {                    msg_Dbg( p_access, "cannot stat() file `%s'", psz_name );                }#endif                p_file = malloc( sizeof(file_entry_t) );                p_file->i_size = i_size;                p_file->psz_name = psz_name;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -