📄 access.c
字号:
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 + -