📄 ifo.cc
字号:
//// Copyright (c) 2003 by Istv醤 V醨adi//// This file is part of dxr3Player, a DVD player written specifically // for the DXR3 (aka Hollywood+) decoder card.// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//------------------------------------------------------------------------------#include "IFO.h"#include "util/Log.h"//------------------------------------------------------------------------------using dvd::VideoStreamAttributes;using dvd::AudioStreamAttributes;using dvd::SPUStreamAttributes;using dvd::IFO;using dvd::VMG;using dvd::VTS;using dvd::PGCTable;//------------------------------------------------------------------------------videoStandard_t VideoStreamAttributes::getStandard() const{ switch(video_attr->video_format) { case 0: return NTSC; break; case 1: default: return PAL; break; }}//------------------------------------------------------------------------------aspectRatio_t VideoStreamAttributes::getDisplayAspectRatio() const{ switch(video_attr->display_aspect_ratio) { case 0: return AR_4_3; case 3: return AR_16_9; default: return AR_16_9; }}//------------------------------------------------------------------------------aspectRatio_t VideoStreamAttributes::getAspectRatio() const{ switch(video_attr->display_aspect_ratio) { case 0: return (video_attr->permitted_df==2) ? AR_16_9 : AR_4_3; case 3: return (video_attr->permitted_df==1) ? AR_4_3 : AR_16_9; default: return AR_16_9; }}//------------------------------------------------------------------------------displayFormat_t VideoStreamAttributes::getDisplayFormat() const{ if (video_attr->permitted_df==1) { // only pan & scan if (video_attr->display_aspect_ratio==3) { // 16:9 return DF_WIDESCREEN; } else { return DF_PANSCAN; } } else if (video_attr->permitted_df==2) { // only letterboxed if (video_attr->display_aspect_ratio==0) { // 4:3 return DF_SMALLSCREEN; } else { return DF_LETTERBOX; } } else if (video_attr->display_aspect_ratio==0) { // 4:3 return DF_SMALLSCREEN; } else { return DF_WIDESCREEN; }}//------------------------------------------------------------------------------//------------------------------------------------------------------------------audioEncoding_t AudioStreamAttributes::getEncoding() const{ switch(audio_attr->audio_format) { case 0: return AC3; case 2: return MPEG1; case 3: return MPEG2; case 4: return LPCM; case 6: return DTS; default: return LPCM; }}//------------------------------------------------------------------------------//------------------------------------------------------------------------------IFO::~IFO(){ reset();}//------------------------------------------------------------------------------void IFO::reset(const ifo_handle_t* ifo){ ifoHandle = ifo;}//------------------------------------------------------------------------------PGCTable IFO::getMenuPGCTable(unsigned languageCode) const{ pgci_ut_t* pgci_ut = ifoHandle->pgci_ut; if (pgci_ut==0) return PGCTable(0); for(unsigned i = 0; i<pgci_ut->nr_of_lus; i++) { if (pgci_ut->lu[i].lang_code==languageCode) return PGCTable(pgci_ut->lu[i].pgcit); } return PGCTable(pgci_ut->lu[0].pgcit);}//------------------------------------------------------------------------------//------------------------------------------------------------------------------unsigned VMG::getTitleNumber(unsigned vtsNo, unsigned vtsTitleNo) const{ TitleInfoTable titleInfoTable = getTitleInfoTable(); for(unsigned i = 1; i<=titleInfoTable.getNumberOfTitles(); ++i) { TitleInfo titleInfo = titleInfoTable.getTitleInfo(i); if (titleInfo.getVTSNumber()==vtsNo && titleInfo.getVTSTitleNumber()==vtsTitleNo) return i; } return 0;}//------------------------------------------------------------------------------VideoStreamAttributes VMG::getVideoStreamAttributes(bool /*inMenu*/) const{ return VideoStreamAttributes(&(ifoHandle->vmgi_mat->vmgm_video_attr));}//------------------------------------------------------------------------------unsigned VMG::getNumberOfAudioStreams(bool /*inMenu*/) const{ return ifoHandle->vmgi_mat->nr_of_vmgm_audio_streams;}//------------------------------------------------------------------------------AudioStreamAttributes VMG::getAudioStreamAttributes(bool /*inMenu*/, unsigned /*streamNo*/) const{ assert( VMG::getNumberOfAudioStreams(false)>0 ); return AudioStreamAttributes(&(ifoHandle->vmgi_mat->vmgm_audio_attr));}//------------------------------------------------------------------------------unsigned VMG::getNumberOfSPUStreams(bool /*inMenu*/) const{ return ifoHandle->vmgi_mat->nr_of_vmgm_subp_streams;}//------------------------------------------------------------------------------SPUStreamAttributes VMG::getSPUStreamAttributes(bool /*inMenu*/, unsigned /*streamNo*/) const{ assert( VMG::getNumberOfSPUStreams(false)>0 ); return SPUStreamAttributes(&(ifoHandle->vmgi_mat->vmgm_subp_attr));}//------------------------------------------------------------------------------//------------------------------------------------------------------------------unsigned VTS::getPartNumber(unsigned pgcNo, unsigned programNo, unsigned& vtsTitleNumber) const{ TitleTable titleTable = getTitleTable(); if (!titleTable) { Log::fatal("dvd::VTS::getPartNumber: missing title/chapter table!\n"); return 0; } unsigned programNoDiff = (unsigned)-1; unsigned partNumber = 0; unsigned numTitles = titleTable.getNumberOfTitles(); for(unsigned titleNo = 1; titleNo<=numTitles && programNoDiff>0; ++titleNo) { Title title = titleTable.getTitle(titleNo); unsigned numParts = title.getNumberOfParts(); for(unsigned partNo = 1; partNo<=numParts && programNoDiff>0; ++partNo) { Part part = title.getPart(partNo); if (part.getPGCNumber()!=pgcNo) continue; unsigned partProgramNo = part.getProgramNumber(); if (programNo>=partProgramNo) { unsigned diff = programNo - partProgramNo; if (diff<programNoDiff) { programNoDiff = diff; vtsTitleNumber = titleNo; partNumber = partNo; } } } } return partNumber;}//------------------------------------------------------------------------------VideoStreamAttributes VTS::getVideoStreamAttributes(bool inMenu) const{ return VideoStreamAttributes(inMenu ? &(ifoHandle->vtsi_mat->vtsm_video_attr) : &(ifoHandle->vtsi_mat->vts_video_attr));}//------------------------------------------------------------------------------unsigned VTS::getNumberOfAudioStreams(bool inMenu) const{ return inMenu ? ifoHandle->vtsi_mat->nr_of_vtsm_audio_streams : ifoHandle->vtsi_mat->nr_of_vts_audio_streams;}//------------------------------------------------------------------------------AudioStreamAttributes VTS::getAudioStreamAttributes(bool inMenu, unsigned streamNo) const{ assert(streamNo<VTS::getNumberOfAudioStreams(inMenu)); return AudioStreamAttributes(inMenu ? &(ifoHandle->vtsi_mat->vtsm_audio_attr) : ifoHandle->vtsi_mat->vts_audio_attr + streamNo);}//------------------------------------------------------------------------------unsigned VTS::getNumberOfSPUStreams(bool inMenu) const{ return inMenu ? ifoHandle->vtsi_mat->nr_of_vtsm_subp_streams : ifoHandle->vtsi_mat->nr_of_vts_subp_streams;}//------------------------------------------------------------------------------SPUStreamAttributes VTS::getSPUStreamAttributes(bool inMenu, unsigned streamNo) const{ assert(streamNo<VTS::getNumberOfSPUStreams(inMenu)); return SPUStreamAttributes(inMenu ? &(ifoHandle->vtsi_mat->vtsm_subp_attr) : ifoHandle->vtsi_mat->vts_subp_attr + streamNo);}//------------------------------------------------------------------------------//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -