[matroska] r932 - trunk/DvdMenuXtractor
[email protected] Wed, 27 Oct 2004 18:41:52 +0400 (MSD)
Newsgroups
gmane.comp.multimedia.matroska.cvs
Message-ID
<[email protected] >
Author: robux4
Date: 2004-10-27 18:41:51 +0400 (Wed, 27 Oct 2004)
New Revision: 932
Modified:
trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
trunk/DvdMenuXtractor/IFOFile.cpp
trunk/DvdMenuXtractor/IFOFile.h
trunk/DvdMenuXtractor/VobParser.cpp
trunk/DvdMenuXtractor/VobParser.h
Log:
correclty handle all the streams known at the IFO level
Modified: trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
===================================================================
--- trunk/DvdMenuXtractor/DvdMenuXtractor.cpp 2004-10-27 13:28:02 UTC (rev 931)
+++ trunk/DvdMenuXtractor/DvdMenuXtractor.cpp 2004-10-27 14:41:51 UTC (rev 932)
@@ -570,7 +570,8 @@
m_txtDemuxLog->AppendText("Processing " + newFilename + "\n");
Demuxer * _muxer = new VideoDemuxWriter(m2vDirectory+newFilename);
- demuxer.AddDemuxer(0xE0, _muxer);
+ if (!demuxer.AddDemuxer(0xE0, _muxer))
+ delete _muxer;
int _stream;
@@ -584,7 +585,7 @@
audio_attr_t * _attr = _audioTracks.Item(_stream)->GetData();
// get the possible ID for this track for this Cell/PGC
- uint8_t _ID = IfoFile->GetAudioId(_stream, title, aVobParser.GetVobID(), aVobParser.GetCellID(), language);
+ uint8_t _ID = IfoFile->GetAudioId(_stream, title, language);
if (_attr->lang_code == 0)
_langName = wxString::Format("_%d_un", _ID);
else
@@ -593,23 +594,27 @@
{
case 0:
_muxer = new AC3DemuxWriter(audioDirectory+newFilename+_langName, 0x80 + _ID);
- demuxer.AddDemuxer(0x80 + _ID, _muxer);
+ if (!demuxer.AddDemuxer(0x80 + _ID, _muxer))
+ delete _muxer;
break;
case 2:
case 3:
_muxer = new MPADemuxWriter(audioDirectory+newFilename+_langName, 0xC0 + _ID);
- demuxer.AddDemuxer(0xC0 + _ID, _muxer);
+ if (!demuxer.AddDemuxer(0xC0 + _ID, _muxer))
+ delete _muxer;
break;
case 4:
_muxer = new LPCMDemuxWriter(audioDirectory+newFilename+_langName, 0xA0 + _ID);
- demuxer.AddDemuxer(0xA0 + _ID, _muxer);
+ if (!demuxer.AddDemuxer(0xA0 + _ID, _muxer))
+ delete _muxer;
break;
case 6:
_muxer = new DTSDemuxWriter(audioDirectory+newFilename+_langName, 0x88 + _ID);
- demuxer.AddDemuxer(0x88 + _ID, _muxer);
+ if (!demuxer.AddDemuxer(0x88 + _ID, _muxer))
+ delete _muxer;
break;
default:
@@ -626,7 +631,7 @@
for (_stream=0; _stream<_subTracks.GetCount();_stream++)
{
// get the possible IDs for this track for this Cell/PGC
- IdArray _IDs = IfoFile->GetSubsId(_stream, title, aVobParser.GetVobID(), aVobParser.GetCellID(), language);
+ IdArray _IDs = IfoFile->GetSubsId(_stream, title, language);
for (int _IDidx=0; _IDidx < _IDs.GetCount(); _IDidx++)
{
wxString _langName;
@@ -639,7 +644,8 @@
// if(aVobParser.m_pci.btn_ns > 0)
{
_muxer = new SubDemuxWriter(subDirectory+newFilename+_langName, 0x20 + _IDs.Item(_IDidx));
- demuxer.AddDemuxer(0x20 + _IDs.Item(_IDidx), _muxer);
+ if (!demuxer.AddDemuxer(0x20 + _IDs.Item(_IDidx), _muxer))
+ delete _muxer;
}
}
}
Modified: trunk/DvdMenuXtractor/IFOFile.cpp
===================================================================
--- trunk/DvdMenuXtractor/IFOFile.cpp 2004-10-27 13:28:02 UTC (rev 931)
+++ trunk/DvdMenuXtractor/IFOFile.cpp 2004-10-27 14:41:51 UTC (rev 932)
@@ -341,22 +341,22 @@
return _ifo->m_Subs;
}
-uint8_t IFOFile::GetAudioId(uint8_t streamID, uint8_t title, uint16_t vobid, uint8_t cellid, bool language) const
+uint8_t IFOFile::GetAudioId(uint8_t streamID, uint8_t title, bool language) const
{
IfoContent *_ifo = m_ifos.GetIfoTitle(title);
if (!_ifo)
throw;
- return _ifo->FindAudioStream(streamID, vobid, cellid, language);
+ return _ifo->FindAudioStream(streamID, language);
}
-IdArray IFOFile::GetSubsId(uint8_t streamID, uint8_t title, uint16_t vobid, uint8_t cellid, bool language) const
+IdArray IFOFile::GetSubsId(uint8_t streamID, uint8_t title, bool language) const
{
IfoContent *_ifo = m_ifos.GetIfoTitle(title);
if (!_ifo)
throw;
- return _ifo->FindSubStream(streamID, vobid, cellid, language);
+ return _ifo->FindSubStream(streamID, language);
}
IfoContent::IfoContent(dvd_reader_t *dvdr, int16_t title)
@@ -394,21 +394,90 @@
}
}
-uint8_t IfoContent::FindAudioStream(uint8_t streamID, uint16_t vobid, uint8_t cellid, bool language) const
+uint8_t IfoContent::FindAudioStream(uint8_t streamID, bool language) const
{
+ assert(m_handle != NULL);
+ if (language)
+ {
+ if (m_handle->pgci_ut)
+ {
+ for (int i=0; i<m_handle->pgci_ut->nr_of_lus; i++)
+ {
+ pgci_lu_t &_lu = m_handle->pgci_ut->lu[i];
+ for (int j=0; j < _lu.pgcit->nr_of_pgci_srp; j++)
+ {
+ pgc_t *_pgc = _lu.pgcit->pgci_srp[j].pgc;
+ if(_pgc->audio_control[streamID] & 0x8000) // if present
+ return (_pgc->audio_control[streamID] >> 8) & 0x7F;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (m_handle->vts_pgcit)
+ {
+ for (int j=0; j < m_handle->vts_pgcit->nr_of_pgci_srp; j++)
+ {
+ pgc_t *_pgc = m_handle->vts_pgcit->pgci_srp[j].pgc;
+ if(_pgc->audio_control[streamID] & 0x8000) // if present
+ return (_pgc->audio_control[streamID] >> 8) & 0x7F;
+ }
+ }
+ }
return streamID;
}
-IdArray IfoContent::FindSubStream(uint8_t streamID, uint16_t vobid, uint8_t cellid, bool language) const
+IdArray IfoContent::FindSubStream(uint8_t streamID, bool language) const
{
IdArray result;
- result.Add(0,1);
- result.Add(1,1);
- result.Add(2,1);
- result.Add(3,1);
- result.Add(4,1);
- result.Add(5,1);
- result.Add(6,1);
+
+ assert(m_handle != NULL);
+ if (language)
+ {
+ if (m_handle->pgci_ut)
+ {
+ for (int i=0; i<m_handle->pgci_ut->nr_of_lus; i++)
+ {
+ pgci_lu_t &_lu = m_handle->pgci_ut->lu[i];
+ for (int j=0; j < _lu.pgcit->nr_of_pgci_srp; j++)
+ {
+ pgc_t *_pgc = _lu.pgcit->pgci_srp[j].pgc;
+ if(_pgc->subp_control[streamID] & 0x80000000) // if present
+ {
+ result.Add( _pgc->subp_control[streamID] >> 24 & 0x7F, 1);
+ if (_pgc->subp_control[streamID] & 0x007F0000)
+ result.Add( _pgc->subp_control[streamID] >> 16 & 0x7F, 1);
+ if (_pgc->subp_control[streamID] & 0x00007F00)
+ result.Add( _pgc->subp_control[streamID] >> 8 & 0x7F, 1);
+ if (_pgc->subp_control[streamID] & 0x0000007F)
+ result.Add( _pgc->subp_control[streamID] >> 0 & 0x7F, 1);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ if (m_handle->vts_pgcit)
+ {
+ for (int j=0; j < m_handle->vts_pgcit->nr_of_pgci_srp; j++)
+ {
+ pgc_t *_pgc = m_handle->vts_pgcit->pgci_srp[j].pgc;
+ if(_pgc->subp_control[streamID] & 0x80000000) // if present
+ {
+ result.Add( _pgc->subp_control[streamID] >> 24 & 0x7F, 1);
+ if (_pgc->subp_control[streamID] & 0x007F0000)
+ result.Add( _pgc->subp_control[streamID] >> 16 & 0x7F, 1);
+ if (_pgc->subp_control[streamID] & 0x00007F00)
+ result.Add( _pgc->subp_control[streamID] >> 8 & 0x7F, 1);
+ if (_pgc->subp_control[streamID] & 0x0000007F)
+ result.Add( _pgc->subp_control[streamID] >> 0 & 0x7F, 1);
+ }
+ }
+ }
+ }
+
return result;
}
Modified: trunk/DvdMenuXtractor/IFOFile.h
===================================================================
--- trunk/DvdMenuXtractor/IFOFile.h 2004-10-27 13:28:02 UTC (rev 931)
+++ trunk/DvdMenuXtractor/IFOFile.h 2004-10-27 14:41:51 UTC (rev 932)
@@ -48,8 +48,8 @@
return *m_handle;
}
- uint8_t FindAudioStream(uint8_t streamID, uint16_t vobid, uint8_t cellid, bool language) const;
- IdArray FindSubStream(uint8_t streamID, uint16_t vobid, uint8_t cellid, bool language) const;
+ uint8_t FindAudioStream(uint8_t streamID, bool language) const;
+ IdArray FindSubStream(uint8_t streamID, bool language) const;
int16_t m_title;
AudioTrackList m_langAudio;
@@ -92,8 +92,8 @@
const AudioTrackList & AudioTracks(unsigned int title, bool language) const;
const SubtitleTrackList & SubsTracks(unsigned int title, bool language) const;
- uint8_t GetAudioId(uint8_t streamID, uint8_t title, uint16_t vobid, uint8_t cellid, bool language) const;
- IdArray GetSubsId(uint8_t streamID, uint8_t title, uint16_t vobid, uint8_t cellid, bool language) const;
+ uint8_t GetAudioId(uint8_t streamID, uint8_t title, bool language) const;
+ IdArray GetSubsId(uint8_t streamID, uint8_t title, bool language) const;
protected:
void GetPGCCells(const pgcit_t & pgc, CellsHashType * CellsHash);
Modified: trunk/DvdMenuXtractor/VobParser.cpp
===================================================================
--- trunk/DvdMenuXtractor/VobParser.cpp 2004-10-27 13:28:02 UTC (rev 931)
+++ trunk/DvdMenuXtractor/VobParser.cpp 2004-10-27 14:41:51 UTC (rev 932)
@@ -93,10 +93,12 @@
Reset();
}
-void CompositeDemuxWriter::AddDemuxer(uint8_t streamID, Demuxer * demuxer)
+bool CompositeDemuxWriter::AddDemuxer(uint8_t streamID, Demuxer * demuxer)
{
- assert(m_muxers[streamID] == NULL);
+ if (m_muxers[streamID] != NULL)
+ return false;
m_muxers[streamID] = demuxer;
+ return true;
}
void CompositeDemuxWriter::ProcessStream(uint8_t streamID, uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
Modified: trunk/DvdMenuXtractor/VobParser.h
===================================================================
--- trunk/DvdMenuXtractor/VobParser.h 2004-10-27 13:28:02 UTC (rev 931)
+++ trunk/DvdMenuXtractor/VobParser.h 2004-10-27 14:41:51 UTC (rev 932)
@@ -303,7 +303,7 @@
public:
CompositeDemuxWriter();
~CompositeDemuxWriter();
- void AddDemuxer(uint8_t streamID, Demuxer * demuxer);
+ bool AddDemuxer(uint8_t streamID, Demuxer * demuxer);
void ProcessStream(uint8_t streamID, uint8_t* buff, uint32_t size, int32_t delay, wxString & debug);
void Reset();