📄 targetposition.cc
字号:
{ PGC pgc = getPGC(); if (!pgc) { Log::fatal("dvd::vm::TargetPosition::enterLastProgram: cannot enter last program in invalid PGC\n"); return false; } else if (pgc.isEmpty()) { Log::fatal("dvd::vm::TargetPosition::enterLastProgram: Cannot enter last program in empty PGC\n"); return false; } else { return enterProgram(pgc.getNumberOfPrograms()); }}//------------------------------------------------------------------------------bool TargetPosition::enterCell(unsigned cellNo){ PGC pgc = getPGC(); if (!pgc) { Log::fatal("dvd::vm::TargetPosition::enterCell: cannot enter cell %u in invalid PGC\n", cellNo); return false; } else { return enterBaseCell(pgc, pgc.findPreviousBaseCell(cellNo)); }}//------------------------------------------------------------------------------bool TargetPosition::repeatCell(){ return enterCell(getCellNumber());}//------------------------------------------------------------------------------bool TargetPosition::enterNextCell(){ PGC pgc = getPGC(); unsigned cellNo = getCellNumber(); if (!pgc) { Log::fatal("dvd::vm::TargetPosition::enterNextCell: cannot enter next cell in invalid PGC\n"); return false; } else if (cellNo>=1 && cellNo<=pgc.getNumberOfCells()) { return enterBaseCell(pgc, pgc.findNextBaseCell(cellNo+1)); } else { Log::error("dvd::vm::TargetPosition::enterNextCell: cannot enter next cell from cell %u\n", cellNo); return false; }}//------------------------------------------------------------------------------bool TargetPosition::enterLastCell(){ PGC pgc = getPGC(); if (!pgc) { Log::fatal("dvd::vm::TargetPosition::enterLastCell: cannot enter last cell in invalid PGC\n"); return false; } else if (pgc.isEmpty()) { Log::error("dvd::vm::TargetPosition::enterLastCell: cannot enter last cell in empty PGC\n"); return false; } else { unsigned cellNo = pgc.getNumberOfCells(); return enterBaseCell(pgc, pgc.findPreviousBaseCell(cellNo)); }}//------------------------------------------------------------------------------bool TargetPosition::enterLastVOBU(){ PGC pgc = getPGC(); unsigned cellNo = getCellNumber(); if (!pgc) { Log::fatal("dvd::vm::TargetPosition::enterLastVOBU: PGC is invalid\n"); return false; } else if (cellNo<1 || cellNo>pgc.getNumberOfCells()) { Log::fatal("dvd::vm::TargetPosition::enterLastVOBU: cell number is invalid\n"); return false; } else { setSectorNumber(pgc.getCellPlaybackInfo(cellNo).getLastVOBUFirstSector()); return true; }}//------------------------------------------------------------------------------bool TargetPosition::enterPreviousCell(){ PGC pgc = getPGC(); unsigned cellNo = getCellNumber(); if (!pgc) { Log::fatal("dvd::vm::TargetPosition::enterPreviousCell: cannot enter previous cell in invalid PGC\n"); return false; } else if (cellNo>=1 && cellNo<=pgc.getNumberOfCells()) { unsigned baseCellNumber = pgc.findPreviousBaseCell(getCellNumber()); return enterBaseCell(pgc, pgc.findPreviousBaseCell(baseCellNumber-1)); } else { Log::error("dvd::vm::TargetPosition::enterPreviousCell: cannot enter cell preceding cell %u\n", cellNo); return false; }}//------------------------------------------------------------------------------bool TargetPosition::enterTT(unsigned titleNo){ if (!isInVideoManager()) { Log::error("dvd::vm::TargetPosition::enterTT: trying to enter title outside of the video manager!\n"); return false; } TitleInfoTable titleInfoTable = getVMG()->getTitleInfoTable(); if (!titleInfoTable || titleNo<1 || titleNo>titleInfoTable.getNumberOfTitles()) { Log::error("dvd::vm::TargetPosition::enterTT: title table is missing or title number %u is out of range!\n", titleNo); return false; } // FIXME: we may need it somewhere //setSPRValue(SPRM::volumeTitleNumber, titleNo); TitleInfo titleInfo = titleInfoTable.getTitleInfo(titleNo); return enterVTS(titleInfo.getVTSNumber(), titleInfo.getVTSTitleNumber());}//------------------------------------------------------------------------------bool TargetPosition::enterVTS(unsigned vtsNo, unsigned vtsTitleNo){ // FIXME: check vtsNo setVTSNumber(vtsNo); return enterVTSTitle(vtsTitleNo);}//------------------------------------------------------------------------------bool TargetPosition::enterVTSTitle(unsigned vtsTitleNo, unsigned pttNo){ clearInMenu(); if (isInVideoManager()) { Log::error("dvd::vm::TargetPosition::enterVTSTitle: trying to enter VTS title while in the video manager!\n"); return false; } const VTS* vts = findVTS(); if (vts==0) { Log::fatal("dvd::vm::TargetPosition::enterVTSTitle: cannot enter VTS title because VTS is 0\n"); return false; } TitleTable titleTable = vts->getTitleTable(); if (!titleTable || vtsTitleNo<1 || vtsTitleNo>titleTable.getNumberOfTitles()) { Log::error("dvd::vm::TargetPosition::enterVTSTitle: invalid VTS title number: %u\n", vtsTitleNo); return false; } // FIXME: we may need it somewhere //setSPRValue(SPRM::vtsTitleNumber, vtsTitleNo); return enterPTT(vtsTitleNo, pttNo);}//------------------------------------------------------------------------------bool TargetPosition::enterPTT(unsigned vtsTitleNo, unsigned pttNo){ if (isInVideoManager()) { Log::error("dvd::vm::TargetPosition::enterPTT: cannot enter a PTT of the video manager!\n"); return false; } if (isInMenu()) { Log::error("dvd::vm::TargetPosition::enterPTT: cannot enter a PTT of a menu!\n"); return false; } const VTS* vts = findVTS(); if (vts==0) { Log::fatal("dvd::vm::TargetPosition::enterPTT: cannot enter PTT because VTS is 0\n"); return false; } TitleTable titleTable = vts->getTitleTable(); if (vtsTitleNo<1 || vtsTitleNo>titleTable.getNumberOfTitles()) { Log::error("dvd::vm::TargetPosition::enterPTT: cannot enter to VTS title %u\n", vtsTitleNo); return false; } Title title = titleTable.getTitle(vtsTitleNo); if (pttNo<1 || pttNo>title.getNumberOfParts()) { Log::error("dvd::vm::TargetPosition::enterPTT: invalid part of title number: %u\n", pttNo); return false; } if (!enterPGC(title.getPart(pttNo).getPGCNumber())) return false; else return enterProgram(title.getPart(pttNo).getProgramNumber());}//------------------------------------------------------------------------------bool TargetPosition::enterBaseCell(PGC pgc, unsigned cellNo){ if (pgc.isEmpty()) { setCellNumber(0); setSectorNumber(0); return true; } if (cellNo<1 || cellNo>pgc.getNumberOfCells()) { Log::error("dvd::vm::TargetPosition::enterBaseCell: invalid cell number: %u\n", cellNo); return false; } CellPlaybackInfo cellPlaybackInfo = pgc.getCellPlaybackInfo(cellNo); if (cellPlaybackInfo.isInAngleBlock()) { cellNo += state.getSPRValue(SPRM::angleNumber) - 1; if (cellNo > pgc.getNumberOfCells()) { Log::error("dvd::vm::TargetPosition::enterBaseCell: invalid cell number for angle: %u\n", cellNo); return false; } else { cellPlaybackInfo = pgc.getCellPlaybackInfo(cellNo); } } setCellNumber(cellNo); setSectorNumber(cellPlaybackInfo.getFirstSector()); return true;}//------------------------------------------------------------------------------//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -