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

📄 file.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
            psz_name = psz_parser;            if( psz_name ) psz_name++;        }    }    free( psz );    return VLC_SUCCESS;}/***************************************************************************** * Close: close the target *****************************************************************************/static void Close( vlc_object_t * p_this ){    access_t     *p_access = (access_t*)p_this;    access_sys_t *p_sys = p_access->p_sys;    int i;    close( p_sys->fd );    for( i = 0; i < p_sys->i_file; i++ )    {        free( p_sys->file[i]->psz_name );        free( p_sys->file[i] );    }    free( p_sys->file );    free( p_sys );}/***************************************************************************** * Read: standard read on a file descriptor. *****************************************************************************/static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ){    access_sys_t *p_sys = p_access->p_sys;    int i_ret;#if !defined(WIN32) && !defined(UNDER_CE)    if( !p_sys->b_pace_control )    {        if( !p_sys->b_kfir )        {            /* Find if some data is available. This won't work under Windows. */            do            {                struct pollfd ufd;                if( p_access->b_die )                    return 0;                memset (&ufd, 0, sizeof (ufd));                ufd.fd = p_sys->fd;                ufd.events = POLLIN;                i_ret = poll( &ufd, 1, 500 );                if( i_ret == -1 )                {                    if( errno != EINTR )                    {                        msg_Err( p_access, "poll error: %s",                                 strerror( errno ) );                        return -1;                    }                    i_ret = 0;                }            }            while( i_ret == 0 );            i_ret = read( p_sys->fd, p_buffer, i_len );        }        else        {            /* b_kfir ; work around a buggy poll() driver implementation */            while ( (i_ret = read( p_sys->fd, p_buffer, i_len )) == 0 &&                    !p_access->b_die )            {                msleep( INPUT_ERROR_SLEEP );            }        }    }    else#endif /* WIN32 || UNDER_CE */    {        /* b_pace_control || WIN32 */        i_ret = read( p_sys->fd, p_buffer, i_len );    }    if( i_ret < 0 )    {        if( errno != EINTR && errno != EAGAIN )            msg_Err( p_access, "read failed (%s)", strerror(errno) );        /* Delay a bit to avoid consuming all the CPU. This is particularly         * useful when reading from an unconnected FIFO. */        msleep( INPUT_ERROR_SLEEP );    }    p_sys->i_nb_reads++;#ifdef HAVE_SYS_STAT_H    if( p_access->info.i_size != 0 &&        (p_sys->i_nb_reads % INPUT_FSTAT_NB_READS) == 0 )    {        struct stat stat_info;        int i_file = p_sys->i_index;        if ( fstat( p_sys->fd, &stat_info ) == -1 )        {            msg_Warn( p_access, "couldn't stat again the file (%s)", strerror(errno) );        }        else if ( p_sys->file[i_file]->i_size != stat_info.st_size )        {            p_access->info.i_size += (stat_info.st_size - p_sys->file[i_file]->i_size );            p_sys->file[i_file]->i_size = stat_info.st_size;            p_access->info.i_update |= INPUT_UPDATE_SIZE;        }    }#endif    /* If we reached an EOF then switch to the next file in the list */    if ( i_ret == 0 && p_sys->i_index + 1 < p_sys->i_file )    {        char *psz_name = p_sys->file[++p_sys->i_index]->psz_name;        p_sys->fd_backup = p_sys->fd;        msg_Dbg( p_access, "opening file `%s'", psz_name );        if ( _OpenFile( p_access, psz_name ) )        {            p_sys->fd = p_sys->fd_backup;            return 0;        }        close( p_sys->fd_backup );        /* We have to read some data */        return Read( p_access, p_buffer, i_len );    }    if( i_ret > 0 )        p_access->info.i_pos += i_ret;    else if( i_ret == 0 )        p_access->info.b_eof = VLC_TRUE;    return i_ret;}/***************************************************************************** * Seek: seek to a specific location in a file *****************************************************************************/static int Seek( access_t *p_access, int64_t i_pos ){    access_sys_t *p_sys = p_access->p_sys;    int64_t i_size = 0;    /* Check which file we need to access */    if( p_sys->i_file > 1 )    {        int i;        char *psz_name;        p_sys->fd_backup = p_sys->fd;        for( i = 0; i < p_sys->i_file - 1; i++ )        {            if( i_pos < p_sys->file[i]->i_size + i_size )                break;            i_size += p_sys->file[i]->i_size;        }        psz_name = p_sys->file[i]->psz_name;        msg_Dbg( p_access, "opening file `%s'", psz_name );        if ( i != p_sys->i_index && !_OpenFile( p_access, psz_name ) )        {            /* Close old file */            close( p_sys->fd_backup );            p_sys->i_index = i;        }        else        {            p_sys->fd = p_sys->fd_backup;        }    }    lseek( p_sys->fd, i_pos - i_size, SEEK_SET );    p_access->info.i_pos = i_pos;    if( p_access->info.i_size < p_access->info.i_pos )    {        msg_Err( p_access, "seeking too far" );        p_access->info.i_pos = p_access->info.i_size;    }    else if( p_access->info.i_pos < 0 )    {        msg_Err( p_access, "seeking too early" );        p_access->info.i_pos = 0;    }    /* Reset eof */    p_access->info.b_eof = VLC_FALSE;    /* FIXME */    return VLC_SUCCESS;}/***************************************************************************** * Control: *****************************************************************************/static int Control( access_t *p_access, int i_query, va_list args ){    access_sys_t *p_sys = p_access->p_sys;    vlc_bool_t   *pb_bool;    int          *pi_int;    int64_t      *pi_64;    switch( i_query )    {        /* */        case ACCESS_CAN_SEEK:        case ACCESS_CAN_FASTSEEK:            pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t* );            *pb_bool = p_sys->b_seekable;            break;        case ACCESS_CAN_PAUSE:        case ACCESS_CAN_CONTROL_PACE:            pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t* );            *pb_bool = p_sys->b_pace_control;            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 = var_GetInteger( p_access, "file-caching" ) * I64C(1000);            break;        /* */        case ACCESS_SET_PAUSE_STATE:            /* Nothing to do */            break;        case ACCESS_GET_TITLE_INFO:        case ACCESS_SET_TITLE:        case ACCESS_SET_SEEKPOINT:        case ACCESS_SET_PRIVATE_ID_STATE:        case ACCESS_GET_META:            return VLC_EGENERIC;        default:            msg_Warn( p_access, "unimplemented query in control" );            return VLC_EGENERIC;    }    return VLC_SUCCESS;}/***************************************************************************** * OpenFile: Opens a specific file *****************************************************************************/static int _OpenFile( access_t * p_access, const char * psz_name ){    access_sys_t *p_sys = p_access->p_sys;#ifdef UNDER_CE    p_sys->fd = utf8_fopen( psz_name, "rb" );    if ( !p_sys->fd )    {        msg_Err( p_access, "cannot open file %s", psz_name );        return VLC_EGENERIC;    }    fseek( p_sys->fd, 0, SEEK_END );    p_access->info.i_size = ftell( p_sys->fd );    p_access->info.i_update |= INPUT_UPDATE_SIZE;    fseek( p_sys->fd, 0, SEEK_SET );#else#if defined (WIN32)    if( GetVersion() < 0x80000000 )    {        /* for Windows NT and above */        wchar_t wpath[MAX_PATH + 1];        if( !MultiByteToWideChar( CP_UTF8, 0, psz_name, -1, wpath, MAX_PATH ) )        {            msg_Err( p_access, "incorrect file name %s", psz_name );            return VLC_EGENERIC;        }        wpath[MAX_PATH] = L'\0';        p_sys->fd = _wopen( wpath, O_NONBLOCK );        goto opencont;    }#endif    const char *psz_localname = ToLocale( psz_name );    if( psz_localname == NULL )    {        msg_Err( p_access, "incorrect file name %s", psz_name );        return VLC_EGENERIC;    }    p_sys->fd = open( psz_localname, O_NONBLOCK /*| O_LARGEFILE*/ );    LocaleFree( psz_localname );opencont:    if ( p_sys->fd == -1 )    {        msg_Err( p_access, "cannot open file %s (%s)", psz_name,                 strerror(errno) );        return VLC_EGENERIC;    }#if defined(HAVE_FCNTL_H) && defined(F_FDAHEAD) && defined(F_NOCACHE)    /* We'd rather use any available memory for reading ahead     * than for caching what we've already seen/heard */    fcntl(p_sys->fd, F_RDAHEAD, 1);    fcntl(p_sys->fd, F_NOCACHE, 1);#endif#endif    return VLC_SUCCESS;}

⌨️ 快捷键说明

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