[matroska] r932 - trunk/DvdMenuXtractor

[email protected]
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();
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.