[matroska] r930 - trunk/DvdMenuXtractor

[email protected]
Newsgroups gmane.comp.multimedia.matroska.cvs
Message-ID <[email protected]>
Author: robux4
Date: 2004-10-27 15:39:18 +0400 (Wed, 27 Oct 2004)
New Revision: 930

Modified:
   trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
   trunk/DvdMenuXtractor/IFOFile.cpp
   trunk/DvdMenuXtractor/IFOFile.h
   trunk/DvdMenuXtractor/VobParser.cpp
   trunk/DvdMenuXtractor/VobParser.h
Log:
get the real stream number for audio and subs (work in progress)

Modified: trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
===================================================================
--- trunk/DvdMenuXtractor/DvdMenuXtractor.cpp	2004-10-26 22:38:32 UTC (rev 929)
+++ trunk/DvdMenuXtractor/DvdMenuXtractor.cpp	2004-10-27 11:39:18 UTC (rev 930)
@@ -542,7 +542,6 @@
 
     void SplitAndDemux(VobParser & aVobParser, int16_t title, bool language)
     {
-        CompositeDemuxWriter *demuxer = NULL;
         wxString newFilename;
 		uint32_t cell = 0;
 		const CellsListType *CellsList = IfoFile->GetCellsList(title, language);
@@ -556,6 +555,8 @@
         {
             m_gaDemuxProgress->SetRange(CellsList->GetCount());
 
+			CompositeDemuxWriter & demuxer = aVobParser.GetDemuxer();
+
             while(aVobParser.ParseNextPacket())
             {
 				if(aVobParser.IsNewCell())
@@ -563,12 +564,13 @@
 					m_gaDemuxProgress->SetValue(cell);
                     if(IfoFile->IsACandidateCell(aVobParser.GetVobID(),aVobParser.GetCellID()))
                     {
+						demuxer.Reset();
                         newFilename = CellName(title, aVobParser.GetVobID(), aVobParser.GetCellID(), language);
 
                         m_txtDemuxLog->AppendText("Processing " + newFilename + "\n");
 
-                        demuxer = new CompositeDemuxWriter();
-                        demuxer->AddDemuxer(new VideoDemuxWriter(m2vDirectory+newFilename));
+						Demuxer * _muxer = new VideoDemuxWriter(m2vDirectory+newFilename);
+                        demuxer.AddDemuxer(0xE0, _muxer);
 
 						int _stream;
 
@@ -580,27 +582,34 @@
 							{
 								wxString _langName;
 								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);
 								if (_attr->lang_code == 0)
-									_langName = wxString::Format("_%d_un", _stream);
+									_langName = wxString::Format("_%d_un", _ID);
 								else
-									_langName = wxString::Format("_%d_%c%c", _stream, _attr->lang_code >> 8, _attr->lang_code & 0xFF);
+									_langName = wxString::Format("_%d_%c%c", _ID, _attr->lang_code >> 8, _attr->lang_code & 0xFF);
 								switch (_audioTracks.Item(_stream)->GetData()->audio_format)
 								{
 								case 0:
-									demuxer->AddDemuxer(new AC3DemuxWriter(audioDirectory+newFilename+_langName, 0x80 + _stream));
+									_muxer = new AC3DemuxWriter(audioDirectory+newFilename+_langName, 0x80 + _ID);
+									demuxer.AddDemuxer(0x80 + _ID, _muxer);
 									break;
 
 								case 2:
 								case 3:
-									demuxer->AddDemuxer(new MPADemuxWriter(audioDirectory+newFilename+_langName, 0xC0 + _stream));
+									_muxer = new MPADemuxWriter(audioDirectory+newFilename+_langName, 0xC0 + _ID);
+									demuxer.AddDemuxer(0xC0 + _ID, _muxer);
 									break;
 
 								case 4:
-									demuxer->AddDemuxer(new LPCMDemuxWriter(audioDirectory+newFilename+_langName, 0xA0 + _stream));
+									_muxer = new LPCMDemuxWriter(audioDirectory+newFilename+_langName, 0xA0 + _ID);
+									demuxer.AddDemuxer(0xA0 + _ID, _muxer);
 									break;
 
 								case 6:
-									demuxer->AddDemuxer(new DTSDemuxWriter(audioDirectory+newFilename+_langName, 0x88 + _stream));
+									_muxer = new DTSDemuxWriter(audioDirectory+newFilename+_langName, 0x88 + _ID);
+									demuxer.AddDemuxer(0x88 + _ID, _muxer);
 									break;
 
 								default:
@@ -616,29 +625,30 @@
 						{
 							for (_stream=0; _stream<_subTracks.GetCount();_stream++)
 							{
-								wxString _langName;
-								subp_attr_t * _attr = _subTracks.Item(_stream)->GetData();
-								if (_attr->lang_code == 0)
-									_langName = "_un";
-								else
-									_langName = wxString::Format("_%c%c", _attr->lang_code >> 8, _attr->lang_code & 0xFF);
-//								if(aVobParser.m_pci.btn_ns > 0)
+								// get the possible IDs for this track for this Cell/PGC
+								IdArray _IDs = IfoFile->GetSubsId(_stream, title, aVobParser.GetVobID(), aVobParser.GetCellID(), language);
+								for (int _IDidx=0; _IDidx < _IDs.GetCount(); _IDidx++)
 								{
-									demuxer->AddDemuxer(new SubDemuxWriter(subDirectory+newFilename+_langName, 0x20 + _stream));
+									wxString _langName;
+
+									subp_attr_t * _attr = _subTracks.Item(_stream)->GetData();
+									if (_attr->lang_code == 0)
+										_langName = wxString::Format("_%d_un", _IDs.Item(_IDidx));
+									else
+										_langName = wxString::Format("_%d_%c%c", _IDs.Item(_IDidx), _attr->lang_code >> 8, _attr->lang_code & 0xFF);
+//									if(aVobParser.m_pci.btn_ns > 0)
+									{
+										_muxer = new SubDemuxWriter(subDirectory+newFilename+_langName, 0x20 + _IDs.Item(_IDidx));
+										demuxer.AddDemuxer(0x20 + _IDs.Item(_IDidx), _muxer);
+									}
 								}
 							}
 						}
                     }
-                    aVobParser.SetDemuxer(demuxer);
                 }
                 m_gaDemuxProgress->SetValue(aVobParser.GetPacketIndex());
                 wxYield();
             }
-            if(demuxer)
-            {
-                delete demuxer;
-				demuxer = NULL;
-            }
         }
         catch(VobParserException e)
         {

Modified: trunk/DvdMenuXtractor/IFOFile.cpp
===================================================================
--- trunk/DvdMenuXtractor/IFOFile.cpp	2004-10-26 22:38:32 UTC (rev 929)
+++ trunk/DvdMenuXtractor/IFOFile.cpp	2004-10-27 11:39:18 UTC (rev 930)
@@ -7,11 +7,13 @@
 // ----------------------------------------------------------------------------
 
 #include "wx/listimpl.cpp"
+#include <wx/arrimpl.cpp>
 
 WX_DEFINE_LIST(CellsListType);
 WX_DEFINE_LIST(IfoHandles);
 WX_DEFINE_LIST(AudioTrackList);
 WX_DEFINE_LIST(SubtitleTrackList);
+WX_DEFINE_OBJARRAY(IdArray);
 
 // ----------------------------------------------------------------------------
 
@@ -339,7 +341,24 @@
 		return _ifo->m_Subs;
 }
 
+uint8_t IFOFile::GetAudioId(uint8_t streamID, uint8_t title, uint16_t vobid, uint8_t cellid, bool language) const
+{
+	IfoContent *_ifo = m_ifos.GetIfoTitle(title);
+	if (!_ifo)
+		throw;
 
+	return _ifo->FindAudioStream(streamID, vobid, cellid, language);
+}
+
+IdArray IFOFile::GetSubsId(uint8_t streamID, uint8_t title, uint16_t vobid, uint8_t cellid, bool language) const
+{
+	IfoContent *_ifo = m_ifos.GetIfoTitle(title);
+	if (!_ifo)
+		throw;
+
+	return _ifo->FindSubStream(streamID, vobid, cellid, language);
+}
+
 IfoContent::IfoContent(dvd_reader_t *dvdr, int16_t title)
 	:m_title(title)
 {
@@ -375,6 +394,24 @@
 	}
 }
 
+uint8_t IfoContent::FindAudioStream(uint8_t streamID, uint16_t vobid, uint8_t cellid, bool language) const
+{
+	return streamID;
+}
+
+IdArray IfoContent::FindSubStream(uint8_t streamID, uint16_t vobid, uint8_t cellid, 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);
+	return result;
+}
+
 IfoContent * IfoHandleList::GetIfoTitle(int16_t title) const
 {
 	for (size_t _index = 0; _index < GetCount(); _index++)
@@ -384,3 +421,4 @@
 	}
 	return NULL;
 }
+

Modified: trunk/DvdMenuXtractor/IFOFile.h
===================================================================
--- trunk/DvdMenuXtractor/IFOFile.h	2004-10-26 22:38:32 UTC (rev 929)
+++ trunk/DvdMenuXtractor/IFOFile.h	2004-10-27 11:39:18 UTC (rev 930)
@@ -30,6 +30,7 @@
 
 WX_DECLARE_LIST(audio_attr_t, AudioTrackList);
 WX_DECLARE_LIST(subp_attr_t, SubtitleTrackList);
+WX_DECLARE_OBJARRAY(uint8_t, IdArray);
 
 class IfoContent 
 {
@@ -47,6 +48,9 @@
 		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;
+
 	int16_t m_title;
 	AudioTrackList m_langAudio;
 	AudioTrackList m_Audio;
@@ -88,6 +92,9 @@
 	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;
+
 protected:
 	void GetPGCCells(const pgcit_t & pgc, CellsHashType * CellsHash);
 

Modified: trunk/DvdMenuXtractor/VobParser.cpp
===================================================================
--- trunk/DvdMenuXtractor/VobParser.cpp	2004-10-26 22:38:32 UTC (rev 929)
+++ trunk/DvdMenuXtractor/VobParser.cpp	2004-10-27 11:39:18 UTC (rev 930)
@@ -79,10 +79,49 @@
 #endif
 
 // ----------------------------------------------------------------------------
+// CompositeDemuxWriter
+// ----------------------------------------------------------------------------
 
+CompositeDemuxWriter::CompositeDemuxWriter()
+{
+	for (int i=0; i<256; i++)
+		m_muxers[i] = NULL;
+}
+
+CompositeDemuxWriter::~CompositeDemuxWriter()
+{
+	Reset();
+}
+
+void CompositeDemuxWriter::AddDemuxer(uint8_t streamID, Demuxer * demuxer)
+{
+	assert(m_muxers[streamID] == NULL);
+	m_muxers[streamID] = demuxer;
+}
+
+void CompositeDemuxWriter::ProcessStream(uint8_t streamID, uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+{
+	assert(m_muxers[streamID] != NULL);
+	m_muxers[streamID]->ProcessStream(buff, size, delay, debug);
+}
+
+void CompositeDemuxWriter::Reset()
+{
+	for (int i=0; i<256; i++)
+	{
+		if (m_muxers[i] != NULL)
+		{
+			delete m_muxers[i];
+			m_muxers[i] = NULL;
+		}
+	}
+}
+	
+
+// ----------------------------------------------------------------------------
+
 VobParser::VobParser(const char* dirname, int16_t title, bool language)
 	:m_title(title)
-	,m_demuxer(NULL)
 	,m_dvdhandle(NULL)
 	,m_stream(NULL)
 	,m_language(language)
@@ -253,15 +292,6 @@
 
 // ----------------------------------------------------------------------------
 
-void VobParser::SetDemuxer(Demuxer* demuxer)
-{
-	if (m_demuxer)
-		delete m_demuxer;
-	m_demuxer = demuxer;
-}
-
-// ----------------------------------------------------------------------------
-
 bool VobParser::AvailablePacketData() const
 {
 	return (m_index < DVD_VIDEO_LB_LEN);
@@ -625,12 +655,8 @@
 	ParsePESHeaderDataContentFlag();
 	ParsePESHeaderData();
 
-
-	if(m_demuxer)
-	{
-		m_demuxer->ProcessVideoStream(&m_buff[m_index],
-			length - 3 - pes_header_data_content.PES_header_data_len, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
-	}
+	m_demuxer.ProcessStream(0xE0, &m_buff[m_index],
+		length - 3 - pes_header_data_content.PES_header_data_len, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
 }
 
 void VobParser::ParseAudioPacket(uint8_t StreamID)
@@ -639,12 +665,8 @@
 	ParsePESHeaderDataContentFlag();
 	ParsePESHeaderData();
 
-
-	if(m_demuxer)
-	{	
-		m_demuxer->ProcessAudioStream(&m_buff[m_index],
-			length - 3 - pes_header_data_content.PES_header_data_len, StreamID, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
-	}
+	m_demuxer.ProcessStream(StreamID, &m_buff[m_index],
+		length - 3 - pes_header_data_content.PES_header_data_len, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
 }
 
 // ----------------------------------------------------------------------------
@@ -662,11 +684,8 @@
 	{
 		DebugLog("Subtitles streamID = 0x%X\n", substreamID);
 
-		if(m_demuxer)
-		{
-			// .sub files the VobSub way (includes the whole packet)
-			m_demuxer->ProcessSubStream(m_buff, DVD_VIDEO_LB_LEN, substreamID, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
-		}
+		// .sub files the VobSub way (includes the whole packet)
+		m_demuxer.ProcessStream(substreamID, m_buff, DVD_VIDEO_LB_LEN, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
 	}
 	else if(substreamID >= SUBSTREAM_AC3_LOW && substreamID < SUBSTREAM_AC3_HIGH)
 	{
@@ -676,11 +695,9 @@
 		SkipNBytes(1);
 		// Skip first access unit pointer
 		SkipNBytes(2);
-		if(m_demuxer)
-		{
-			uint16_t ac3DataLen = length - (m_index - dataStartIndex);
-			m_demuxer->ProcessAC3Stream(&m_buff[m_index], ac3DataLen, substreamID, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
-		}
+
+		uint16_t ac3DataLen = length - (m_index - dataStartIndex);
+		m_demuxer.ProcessStream(substreamID, &m_buff[m_index], ac3DataLen, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
 	}
 	else if(substreamID >= SUBSTREAM_DTS_LOW && substreamID < SUBSTREAM_DTS_HIGH)
 	{
@@ -689,22 +706,18 @@
 		SkipNBytes(1);
 		// Skip first access unit pointer
 		SkipNBytes(2);
-		if(m_demuxer)
-		{
-			uint16_t ac3DataLen = length - (m_index - dataStartIndex);
-			m_demuxer->ProcessDTSStream(&m_buff[m_index], ac3DataLen, substreamID, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
-		}
+
+		uint16_t ac3DataLen = length - (m_index - dataStartIndex);
+		m_demuxer.ProcessStream(substreamID, &m_buff[m_index], ac3DataLen, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
 	}
 	else if(substreamID >= SUBSTREAM_PCM_LOW && substreamID < SUBSTREAM_PCM_HIGH)
 	{
 		DebugLog("LPCM streamID = 0x%X\n", substreamID);
 		// Skip unknown data
 		SkipNBytes(6);
-		if(m_demuxer)
-		{
-			uint16_t ac3DataLen = length - (m_index - dataStartIndex);
-			m_demuxer->ProcessLPCMStream(&m_buff[m_index], ac3DataLen, substreamID, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
-		}
+
+		uint16_t ac3DataLen = length - (m_index - dataStartIndex);
+		m_demuxer.ProcessStream(substreamID, &m_buff[m_index], ac3DataLen, (int32_t)pktinfo.pts/90, wxString::Format("DTS %d PTS %d - %d %d\n", (int32_t)m_startdts/90, (int32_t)m_startpts/90, (int32_t)pktinfo.dts/90, (int32_t)pktinfo.pts/90));
 	}
 	else
 	{
@@ -724,9 +737,6 @@
 	m_index = 0;
 	m_pktindex = 0;
 	DVDFileSeek(m_stream,0);
-	if (m_demuxer)
-		delete m_demuxer;
-	m_demuxer = NULL;
 }
 
 // ----------------------------------------------------------------------------

Modified: trunk/DvdMenuXtractor/VobParser.h
===================================================================
--- trunk/DvdMenuXtractor/VobParser.h	2004-10-26 22:38:32 UTC (rev 929)
+++ trunk/DvdMenuXtractor/VobParser.h	2004-10-27 11:39:18 UTC (rev 930)
@@ -157,15 +157,7 @@
 class Demuxer
 {
 public:
-	Demuxer() : m_next(NULL) {}
-	virtual ~Demuxer() {}
-	virtual void ProcessVideoStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug) {}
-	virtual void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug) {}
-	virtual void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug) {}
-	virtual void ProcessLPCMStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug) {}
-	virtual void ProcessDTSStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug) {}
-	virtual void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug) {}
-	Demuxer* m_next; // used by the CompositeDemuxWriter (linked list of demuxer)
+	virtual void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug) = 0;
 };
 
 // ----------------------------------------------------------------------------
@@ -225,7 +217,7 @@
 {
 public:
 	VideoDemuxWriter(const char* filenamePrefix) : Writer(filenamePrefix,"m2v") {}
-	void ProcessVideoStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug) { Write(buff, size, delay, debug); }
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug) { Write(buff, size, delay, debug); }
 };
 
 // ----------------------------------------------------------------------------
@@ -235,9 +227,9 @@
 public:
 	AC3DemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix,"ac3"), m_streamID(streamID) {}
-	void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
 	{
-		if(m_streamID == streamID) { Write(buff,size, delay, debug); }
+		Write(buff,size, delay, debug);
 	}
 private:
 	uint8_t m_streamID;
@@ -250,9 +242,9 @@
 public:
 	DTSDemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix,"dts"), m_streamID(streamID) {}
-	void ProcessDTSStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
 	{
-		if(m_streamID == streamID) { Write(buff,size, delay, debug); }
+		Write(buff,size, delay, debug);
 	}
 private:
 	uint8_t m_streamID;
@@ -265,9 +257,9 @@
 public:
 	LPCMDemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix,"pcm"), m_streamID(streamID) {}
-	void ProcessLPCMStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
 	{
-		if(m_streamID == streamID) { Write(buff,size, delay, debug); }
+		Write(buff,size, delay, debug);
 	}
 private:
 	uint8_t m_streamID;
@@ -280,9 +272,9 @@
 public:
 	MPADemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix,"mpa"), m_streamID(streamID) {}
-	void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
 	{
-		if(m_streamID == streamID) { Write(buff,size, delay, debug); }
+		Write(buff,size, delay, debug);
 	}
 private:
 	uint8_t m_streamID;
@@ -295,9 +287,9 @@
 public:
 	SubDemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix, "sub"), m_streamID(streamID) {}
-	void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
 	{
-		if(m_streamID == streamID) { Write(buff,size, delay, debug); }
+		Write(buff,size, delay, debug);
 	}
 private:
 	uint8_t m_streamID;
@@ -305,97 +297,17 @@
 
 // ----------------------------------------------------------------------------
 
-class CompositeDemuxWriter : public Demuxer
+class CompositeDemuxWriter
 {
 public:
-	CompositeDemuxWriter() : m_demuxerRoot(NULL) {}
+	CompositeDemuxWriter();
+	~CompositeDemuxWriter();
+	void AddDemuxer(uint8_t streamID, Demuxer * demuxer);
+	void ProcessStream(uint8_t streamID, uint8_t* buff, uint32_t size, int32_t delay, wxString & debug);
+	void Reset();
 
-	void AddDemuxer(Demuxer* demuxer)
-	{
-		if(m_demuxerRoot != NULL)
-		{
-			demuxer->m_next = m_demuxerRoot;
-		}
-		m_demuxerRoot = demuxer;
-	}
-
-	~CompositeDemuxWriter() {
-		Demuxer* demuxCursor = m_demuxerRoot;
-		Demuxer* sav_next;
-
-		while(demuxCursor)
-		{
-			sav_next = demuxCursor->m_next;
-			delete demuxCursor;
-			demuxCursor = sav_next;
-		}		
-
-		m_demuxerRoot = NULL;
-	}
-
-	void ProcessVideoStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
-	{
-		Demuxer* demuxCursor = m_demuxerRoot;
-		while(demuxCursor)
-		{
-			demuxCursor->ProcessVideoStream(buff,size, delay, debug);
-			demuxCursor = demuxCursor->m_next;
-		}		
-	}
-
-	void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
-	{
-		Demuxer* demuxCursor = m_demuxerRoot;
-		while(demuxCursor)
-		{
-			demuxCursor->ProcessAudioStream(buff,size, streamID, delay, debug);
-			demuxCursor = demuxCursor->m_next;
-		}		
-	}
-
-	void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
-	{
-		Demuxer* demuxCursor = m_demuxerRoot;
-		while(demuxCursor)
-		{
-			demuxCursor->ProcessAC3Stream(buff,size,streamID, delay, debug);
-			demuxCursor = demuxCursor->m_next;
-		}		
-	}
-
-	void ProcessDTSStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
-	{
-		Demuxer* demuxCursor = m_demuxerRoot;
-		while(demuxCursor)
-		{
-			demuxCursor->ProcessDTSStream(buff,size,streamID, delay, debug);
-			demuxCursor = demuxCursor->m_next;
-		}		
-	}
-
-	void ProcessLPCMStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
-	{
-		Demuxer* demuxCursor = m_demuxerRoot;
-		while(demuxCursor)
-		{
-			demuxCursor->ProcessLPCMStream(buff,size,streamID, delay, debug);
-			demuxCursor = demuxCursor->m_next;
-		}		
-	}
-
-	void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay, wxString & debug)
-	{
-		Demuxer* demuxCursor = m_demuxerRoot;
-		while(demuxCursor)
-		{
-			demuxCursor->ProcessSubStream(buff,size,streamID, delay, debug);
-			demuxCursor = demuxCursor->m_next;
-		}		
-	}
-
-public:
-
-	Demuxer* m_demuxerRoot;
+protected:
+	Demuxer * m_muxers[256];
 };
 
 // ----------------------------------------------------------------------------
@@ -501,11 +413,14 @@
 	char* GetCurrentPacketData() const;
 	uint8_t GetVobID() const;
 	uint8_t GetCellID() const;
-	void SetDemuxer(Demuxer* demuxer);
 	bool IsNewCell();
 	void BuildMap();
 	const CellMap& GetVobMap() const;
 	virtual ~VobParser();
+	inline CompositeDemuxWriter & GetDemuxer()
+	{
+		return m_demuxer;
+	}
 
 	nav_dsi_gi m_dsi;
 	nav_pci_gi m_pci;
@@ -546,7 +461,7 @@
 	int64_t m_startpts;
 	int64_t m_startdts;
 	
-	Demuxer* m_demuxer;
+	CompositeDemuxWriter m_demuxer;
 	CellMap m_map;
 
 	int previous_vobid, previous_cellid;
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.