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

📄 access.c

📁 VLC媒体播放程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        dvdNewPGC( p_input );        dvdplay_start( p_dvd->vmg, p_area->i_id );        p_area->i_part = i_chapter;    } /* i_title >= 0 */    else    {        p_area = p_input->stream.p_selected_area;    }    /*     * Chapter selection     */    if( (int)p_area->i_part != dvdplay_chapter_cur( p_dvd->vmg ) )    {        if( ( p_area->i_part > 0 ) &&            ( p_area->i_part <= p_area->i_part_nb ))        {            dvdplay_pg( p_dvd->vmg, p_area->i_part );        }        p_area->i_part = dvdplay_chapter_cur( p_dvd->vmg );    }    /* warn interface that something has changed */    p_area->i_tell =        LB2OFF( dvdplay_position( p_dvd->vmg ) ) - p_area->i_start;    p_input->stream.b_changed = 1;    /* Update the navigation variables without triggering a callback */    val.i_int = p_area->i_part;    var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL );    return 0;}/***************************************************************************** * dvdplay_Read: reads data packets. ***************************************************************************** * Returns -1 in case of error, the number of bytes read if everything went * well. *****************************************************************************/static ssize_t dvdplay_Read( input_thread_t * p_input,                         byte_t * p_buffer, size_t i_count ){    dvd_data_t *    p_dvd;    off_t           i_read;    p_dvd = (dvd_data_t *)p_input->p_access_data;    vlc_mutex_lock( &p_input->stream.stream_lock );    i_read = LB2OFF( dvdplay_read( p_dvd->vmg, p_buffer, OFF2LB( i_count ) ) );    vlc_mutex_unlock( &p_input->stream.stream_lock );        return i_read;}/***************************************************************************** * dvdplay_Seek : Goes to a given position on the stream. ***************************************************************************** * This one is used by the input and translate chronological position from * input to logical position on the device. * The lock should be taken before calling this function. *****************************************************************************/static void dvdplay_Seek( input_thread_t * p_input, off_t i_off ){    dvd_data_t *     p_dvd;    p_dvd = (dvd_data_t *)p_input->p_access_data;    vlc_mutex_lock( &p_input->stream.stream_lock );    dvdplay_seek( p_dvd->vmg, OFF2LB( i_off ) );    p_input->stream.p_selected_area->i_tell  =        LB2OFF( dvdplay_position( p_dvd->vmg ) ) -        p_input->stream.p_selected_area->i_start;    vlc_mutex_unlock( &p_input->stream.stream_lock );    return;}/***************************************************************************** * pf_vmg_callback: called by libdvdplay when some event happens ***************************************************************************** * The stream lock has to be taken before entering here *****************************************************************************/static void pf_vmg_callback( void* p_args, dvdplay_event_t event ){    input_thread_t *    p_input;    dvd_data_t *        p_dvd;    vlc_value_t         val;    unsigned int        i;    p_input = (input_thread_t*)p_args;    p_dvd   = (dvd_data_t*)p_input->p_access_data;    switch( event )    {    case NEW_DOMAIN:        break;    case NEW_VTS:        break;    case NEW_FILE:        break;    case NEW_PGC:        /* prevent intf to try to seek  by default */        p_input->stream.b_seekable = 0;        i = dvdplay_title_cur( p_dvd->vmg );        if( i != p_input->stream.p_selected_area->i_id )        {            /* the title number has changed: update area */            msg_Warn( p_input, "new title %d (%d)", i,                               p_input->stream.p_selected_area->i_id );            dvdNewArea( p_input,                        p_input->stream.pp_areas[i] );        }        /* new pgc in same title: reinit ES */        dvdplay_ES( p_input );        dvdNewPGC( p_input );        p_input->stream.b_changed = 1;        break;    case JUMP:        dvdplay_ES( p_input );        dvdNewPGC( p_input );    case NEW_PG:        /* update current chapter */        p_input->stream.p_selected_area->i_part =            dvdplay_chapter_cur( p_dvd->vmg );        p_input->stream.p_selected_area->i_tell =            LB2OFF( dvdplay_position( p_dvd->vmg ) ) -            p_input->stream.p_selected_area->i_start;        /* warn interface that something has changed */        p_input->stream.b_changed = 1;        /* Update the navigation variables without triggering a callback */        val.i_int = p_input->stream.p_selected_area->i_part;        var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL );        break;    case NEW_CELL:        p_dvd->b_end_of_cell = 0;        break;    case END_OF_CELL:        p_dvd->b_end_of_cell = 1;        break;    case STILL_TIME:        /* we must pause only from demux         * when the data in cache has been decoded */        p_dvd->i_still_time = dvdplay_still_time( p_dvd->vmg );        msg_Dbg( p_input, "still time %d", p_dvd->i_still_time );        break;    case COMPLETE_VIDEO:        break;    case NEW_HIGHLIGHT:        if( var_Get( p_input, "highlight-mutex", &val ) == VLC_SUCCESS )        {            vlc_mutex_t *p_mutex = val.p_address;            vlc_mutex_lock( p_mutex );            /* Retrieve the highlight from dvdplay */            dvdplay_highlight( p_dvd->vmg, &p_dvd->hli );            if( p_dvd->hli.i_x_start || p_dvd->hli.i_y_start ||                p_dvd->hli.i_x_end || p_dvd->hli.i_y_end )            {                /* Fill our internal variables with this data */                val.i_int = p_dvd->hli.i_x_start;                var_Set( p_input, "x-start", val );                val.i_int = p_dvd->hli.i_y_start;                var_Set( p_input, "y-start", val );                val.i_int = p_dvd->hli.i_x_end;                var_Set( p_input, "x-end", val );                val.i_int = p_dvd->hli.i_y_end;                var_Set( p_input, "y-end", val );                val.p_address = (void *)p_dvd->hli.pi_color;                var_Set( p_input, "color", val );                val.p_address = (void *)p_dvd->hli.pi_contrast;                var_Set( p_input, "contrast", val );                /* Tell the SPU decoder that there's a new highlight */                val.b_bool = VLC_TRUE;            }            else            {                /* Turn off the highlight */                val.b_bool = VLC_FALSE;            }            var_Set( p_input, "highlight", val );            vlc_mutex_unlock( p_mutex );        }        break;    default:        msg_Err( p_input, "unknown event from libdvdplay (%d)", event );    }    return;}static int dvdNewArea( input_thread_t * p_input, input_area_t * p_area ){    dvd_data_t *    p_dvd;    int             i_angle_nb, i_angle;    vlc_value_t     val;    int             i;    p_dvd = (dvd_data_t*)p_input->p_access_data;    p_input->stream.p_selected_area = p_area;    /*     * One program for each angle     */    while( p_input->stream.i_pgrm_number )    {        input_DelProgram( p_input, p_input->stream.pp_programs[0] );    }    input_AddProgram( p_input, 1, sizeof( stream_ps_data_t ) );    p_input->stream.p_selected_program = p_input->stream.pp_programs[0];    dvdplay_angle_info( p_dvd->vmg, &i_angle_nb, &i_angle );    for( i = 1 ; i < i_angle_nb ; i++ )    {        input_AddProgram( p_input, i+1, 0 );    }    if( i_angle )        dvdplay_SetProgram( p_input,                            p_input->stream.pp_programs[i_angle-1] );    else        dvdplay_SetProgram( p_input,                            p_input->stream.pp_programs[0] );    /* No PSM to read in DVD mode, we already have all information */    p_input->stream.p_selected_program->b_is_ok = 1;    /* Reinit ES */    dvdplay_ES( p_input );    /* Update the navigation variables without triggering a callback */    val.i_int = p_area->i_id;    var_Change( p_input, "title", VLC_VAR_SETVALUE, &val, NULL );    var_Change( p_input, "chapter", VLC_VAR_CLEARCHOICES, NULL, NULL );    for( i = 1; (unsigned int)i <= p_area->i_part_nb; i++ )    {        val.i_int = i;        var_Change( p_input, "chapter", VLC_VAR_ADDCHOICE, &val, NULL );    }    /* Update the navigation variables without triggering a callback */    val.i_int = p_area->i_part;    var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL );    return 0;}static int dvdNewPGC( input_thread_t * p_input ){    dvd_data_t * p_dvd = (dvd_data_t*)p_input->p_access_data;    p_input->stream.p_selected_area->i_start =        LB2OFF( dvdplay_title_first( p_dvd->vmg ) );    p_input->stream.p_selected_area->i_size  =        LB2OFF( dvdplay_title_end ( p_dvd->vmg ) ) -        p_input->stream.p_selected_area->i_start;    p_input->stream.p_selected_area->i_tell = 0;    if( p_input->stream.p_selected_area->i_size > 0 )    {        p_input->stream.b_seekable = 1;    }    else    {        p_input->stream.b_seekable = 0;    }    return 0;}static int MenusCallback( vlc_object_t *p_this, char const *psz_name,                          vlc_value_t oldval, vlc_value_t newval, void *p_arg ){    input_thread_t *    p_input;    dvd_data_t *        p_dvd;    p_input = (input_thread_t*)p_this;    p_dvd   = (dvd_data_t*)p_input->p_access_data;    vlc_mutex_lock( &p_input->stream.stream_lock );    if( newval.i_int < 99 )        dvdplay_menu( p_dvd->vmg, newval.i_int, 0 );    else        dvdplay_resume( p_dvd->vmg );    vlc_mutex_unlock( &p_input->stream.stream_lock );    if( p_dvd->p_intf ) dvdIntfResetStillTime( p_dvd->p_intf );    return VLC_SUCCESS;}

⌨️ 快捷键说明

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