vcdplayer.c
来自「VLC媒体播放程序」· C语言 代码 · 共 561 行 · 第 1/2 页
C
561 行
p_vcd->pdi); vcdinfo_itemid_t trans_itemid; if (VCDINFO_INVALID_ITEMID == trans_itemid_num) return false; vcdinfo_classify_itemid(trans_itemid_num, &trans_itemid); dbg_print(INPUT_DBG_PBC, " play-item[%d]: %s", p_vcd->pdi, vcdinfo_pin2str (trans_itemid_num)); return VLC_SUCCESS == VCDPlay( p_input, trans_itemid ); }}/*! Play item assocated with the "default" selection. Return false if there was some problem.*/boolvcdplayer_play_default( input_thread_t * p_input ){ thread_vcd_data_t *p_vcd= (thread_vcd_data_t *)p_input->p_access_data; vcdinfo_itemid_t itemid; dbg_print( (INPUT_DBG_CALL|INPUT_DBG_PBC), "current: %d" , p_vcd->play_item.num); itemid.type = p_vcd->play_item.type; if (vcdplayer_pbc_is_on(p_vcd)) { lid_t lid=vcdinfo_get_multi_default_lid(p_vcd->vcd, p_vcd->cur_lid, itemid.num); if (VCDINFO_INVALID_LID != lid) { itemid.num = lid; itemid.type = VCDINFO_ITEM_TYPE_LID; dbg_print(INPUT_DBG_PBC, "DEFAULT to %d\n", itemid.num); } else { dbg_print(INPUT_DBG_PBC, "no DEFAULT for LID %d\n", p_vcd->cur_lid); } } else { /* PBC is not on. "default" selection beginning of current selection . */ p_vcd->play_item.num = p_vcd->play_item.num; } /** ??? p_vcd->update_title(); ***/ return VLC_SUCCESS == VCDPlay( p_input, itemid );}/*! Play item assocated with the "next" selection. Return false if there was some problem.*/boolvcdplayer_play_next( input_thread_t * p_input ){ thread_vcd_data_t *p_vcd= (thread_vcd_data_t *)p_input->p_access_data; vcdinfo_obj_t *obj; vcdinfo_itemid_t itemid; if (!p_vcd) return false; dbg_print( (INPUT_DBG_CALL|INPUT_DBG_PBC), "current: %d" , p_vcd->play_item.num); obj = p_vcd->vcd; itemid.type = p_vcd->play_item.type; if (vcdplayer_pbc_is_on(p_vcd)) { vcdinfo_lid_get_pxd(obj, &(p_vcd->pxd), p_vcd->cur_lid); switch (p_vcd->pxd.descriptor_type) { case PSD_TYPE_SELECTION_LIST: case PSD_TYPE_EXT_SELECTION_LIST: if (p_vcd->pxd.psd == NULL) return false; vcdplayer_update_entry( p_input, vcdinf_psd_get_next_offset(p_vcd->pxd.psd), &itemid.num, "next"); itemid.type = VCDINFO_ITEM_TYPE_LID; break; case PSD_TYPE_PLAY_LIST: if (p_vcd->pxd.pld == NULL) return false; vcdplayer_update_entry( p_input, vcdinf_pld_get_next_offset(p_vcd->pxd.pld), &itemid.num, "next"); itemid.type = VCDINFO_ITEM_TYPE_LID; break; case PSD_TYPE_END_LIST: case PSD_TYPE_COMMAND_LIST: LOG_WARN( "There is no PBC 'next' selection here" ); return false; } } else { /* PBC is not on. "Next" selection is play_item.num+1 if possible. */ int max_entry = 0; switch (p_vcd->play_item.type) { case VCDINFO_ITEM_TYPE_ENTRY: case VCDINFO_ITEM_TYPE_SEGMENT: case VCDINFO_ITEM_TYPE_TRACK: switch (p_vcd->play_item.type) { case VCDINFO_ITEM_TYPE_ENTRY: max_entry = p_vcd->num_entries; break; case VCDINFO_ITEM_TYPE_SEGMENT: max_entry = p_vcd->num_segments; break; case VCDINFO_ITEM_TYPE_TRACK: max_entry = p_vcd->num_tracks; break; default: ; /* Handle exceptional cases below */ } if (p_vcd->play_item.num+1 < max_entry) { itemid.num = p_vcd->play_item.num+1; } else { LOG_WARN( "At the end - non-PBC 'next' not possible here" ); return false; } break; case VCDINFO_ITEM_TYPE_LID: { /* Should have handled above. */ LOG_WARN( "Internal inconsistency - should not have gotten here." ); return false; } default: return false; } } /** ??? p_vcd->update_title(); ***/ return VLC_SUCCESS == VCDPlay( p_input, itemid );}/*! Play item assocated with the "prev" selection. Return false if there was some problem.*/boolvcdplayer_play_prev( input_thread_t * p_input ){ thread_vcd_data_t *p_vcd= (thread_vcd_data_t *)p_input->p_access_data; vcdinfo_obj_t *obj = p_vcd->vcd; vcdinfo_itemid_t itemid; dbg_print( (INPUT_DBG_CALL|INPUT_DBG_PBC), "current: %d" , p_vcd->play_item.num); itemid.type = p_vcd->play_item.type; if (vcdplayer_pbc_is_on(p_vcd)) { vcdinfo_lid_get_pxd(obj, &(p_vcd->pxd), p_vcd->cur_lid); switch (p_vcd->pxd.descriptor_type) { case PSD_TYPE_SELECTION_LIST: case PSD_TYPE_EXT_SELECTION_LIST: if (p_vcd->pxd.psd == NULL) return false; vcdplayer_update_entry( p_input, vcdinf_psd_get_prev_offset(p_vcd->pxd.psd), &itemid.num, "prev"); itemid.type = VCDINFO_ITEM_TYPE_LID; break; case PSD_TYPE_PLAY_LIST: if (p_vcd->pxd.pld == NULL) return false; vcdplayer_update_entry( p_input, vcdinf_pld_get_prev_offset(p_vcd->pxd.pld), &itemid.num, "prev"); itemid.type = VCDINFO_ITEM_TYPE_LID; break; case PSD_TYPE_END_LIST: case PSD_TYPE_COMMAND_LIST: LOG_WARN( "There is no PBC 'prev' selection here" ); return false; } } else { /* PBC is not on. "Prev" selection is play_item.num-1 if possible. */ int min_entry = (VCDINFO_ITEM_TYPE_ENTRY == p_vcd->play_item.type) ? 0 : 1; if (p_vcd->play_item.num > min_entry) { itemid.num = p_vcd->play_item.num-1; } else { LOG_WARN( "At the beginning - non-PBC 'prev' not possible here" ); return false; } } /** ??? p_vcd->update_title(); ***/ return VLC_SUCCESS == VCDPlay( p_input, itemid );}/*! Play item assocated with the "return" selection. Return false if there was some problem.*/boolvcdplayer_play_return( input_thread_t * p_input ){ thread_vcd_data_t *p_vcd= (thread_vcd_data_t *)p_input->p_access_data; vcdinfo_obj_t *obj = p_vcd->vcd; vcdinfo_itemid_t itemid; dbg_print( (INPUT_DBG_CALL|INPUT_DBG_PBC), "current: %d" , p_vcd->play_item.num); itemid.type = p_vcd->play_item.type; if (vcdplayer_pbc_is_on(p_vcd)) { vcdinfo_lid_get_pxd(obj, &(p_vcd->pxd), p_vcd->cur_lid); switch (p_vcd->pxd.descriptor_type) { case PSD_TYPE_SELECTION_LIST: case PSD_TYPE_EXT_SELECTION_LIST: if (p_vcd->pxd.psd == NULL) return false; vcdplayer_update_entry( p_input, vcdinf_psd_get_return_offset(p_vcd->pxd.psd), &itemid.num, "return"); itemid.type = VCDINFO_ITEM_TYPE_LID; break; case PSD_TYPE_PLAY_LIST: if (p_vcd->pxd.pld == NULL) return false; vcdplayer_update_entry( p_input, vcdinf_pld_get_return_offset(p_vcd->pxd.pld), &itemid.num, "return"); itemid.type = VCDINFO_ITEM_TYPE_LID; break; case PSD_TYPE_END_LIST: case PSD_TYPE_COMMAND_LIST: LOG_WARN( "There is no PBC 'return' selection here" ); return false; } } else { /* PBC is not on. "Return" selection is min_entry if possible. */ p_vcd->play_item.num = (VCDINFO_ITEM_TYPE_ENTRY == p_vcd->play_item.type) ? 0 : 1; } /** ??? p_vcd->update_title(); ***/ return VLC_SUCCESS == VCDPlay( p_input, itemid );}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?