[matroska] r930 - trunk/DvdMenuXtractor
[email protected] Wed, 27 Oct 2004 15:39:20 +0400 (MSD)
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;