[matroska] r918 - trunk/DvdMenuXtractor

[email protected]
Newsgroups gmane.comp.multimedia.matroska.cvs
Message-ID <[email protected]>
Author: robux4
Date: 2004-10-26 01:22:18 +0400 (Tue, 26 Oct 2004)
New Revision: 918

Modified:
   trunk/DvdMenuXtractor/VobParser.cpp
   trunk/DvdMenuXtractor/VobParser.h
Log:
handle the stream delay compared to the first stream (always video ?)

Modified: trunk/DvdMenuXtractor/VobParser.cpp
===================================================================
--- trunk/DvdMenuXtractor/VobParser.cpp	2004-10-25 21:19:56 UTC (rev 917)
+++ trunk/DvdMenuXtractor/VobParser.cpp	2004-10-25 21:22:18 UTC (rev 918)
@@ -86,6 +86,7 @@
 	,m_dvdhandle(NULL)
 	,m_stream(NULL)
 	,m_language(language)
+	,m_bFirstPacket(true)
 {
 	m_pktcount = 0;
 
@@ -183,8 +184,8 @@
 				while (AvailablePacketData())
 				{
 					_Header = GetNext32Bits();
-					_StreamID = _Header & 0xFF;
-					if (_StreamID == PRIVATE_STREAM2)
+					uint8_t _StreamId = _Header & 0xFF;
+					if (_StreamId == PRIVATE_STREAM2)
 					{
 						DebugLog("Navigation pack {\n");
 						inc_lvl();
@@ -227,6 +228,13 @@
 				SkipNBytes(_size);
 				DebugLog("Unknown slice type\n");
 			}
+
+			if (m_bFirstPacket && _StreamID != SYSTEM_HEADER)
+			{
+				m_bFirstPacket = false;
+				m_startdts = pktinfo.dts;
+				m_startpts = pktinfo.pts;
+			}
 		}
 		else
 		{
@@ -611,7 +619,6 @@
 	ParsePESHeaderDataContentFlag();
 	ParsePESHeaderData();
 
-myfprintf(stdout, "vid: %I64d %I64d",pktinfo.pts,pktinfo.dts);
 
 	if(m_demuxer)
 	{	
@@ -626,12 +633,11 @@
 	ParsePESHeaderDataContentFlag();
 	ParsePESHeaderData();
 
-myfprintf(stdout, "aud: %I64d %I64d",pktinfo.pts,pktinfo.dts);
 
 	if(m_demuxer)
 	{	
 		m_demuxer->ProcessAudioStream(&m_buff[m_index],
-			length - 3 - pes_header_data_content.PES_header_data_len, StreamID);
+			length - 3 - pes_header_data_content.PES_header_data_len, StreamID, (pktinfo.pts - m_startpts)/90);
 	}
 }
 
@@ -649,17 +655,15 @@
 	if(substreamID >= SUBSTREAM_SUB_LOW && substreamID < SUBSTREAM_SUB_HIGH)
 	{
 		DebugLog("Subtitles streamID = 0x%X\n", substreamID);
-myfprintf(stdout, "sub: %I64d %I64d",pktinfo.pts,pktinfo.dts);
 
 		if(m_demuxer)
 		{
 			// .sub files the VobSub way (includes the whole packet)
-			m_demuxer->ProcessSubStream(m_buff, DVD_VIDEO_LB_LEN, substreamID);
+			m_demuxer->ProcessSubStream(m_buff, DVD_VIDEO_LB_LEN, substreamID, (pktinfo.pts - m_startpts)/90);
 		}
 	}
 	else if(substreamID >= SUBSTREAM_AC3_LOW && substreamID < SUBSTREAM_AC3_HIGH)
 	{
-myfprintf(stdout, "ac3: %I64d %I64d",pktinfo.pts,pktinfo.dts);
 
 		DebugLog("AC3 streamID = 0x%X\n", substreamID);
 		// Skip frame header number
@@ -669,7 +673,7 @@
 		if(m_demuxer)
 		{
 			uint16_t ac3DataLen = length - (m_index - dataStartIndex);
-			m_demuxer->ProcessAC3Stream(&m_buff[m_index], ac3DataLen, substreamID);
+			m_demuxer->ProcessAC3Stream(&m_buff[m_index], ac3DataLen, substreamID, (pktinfo.pts - m_startpts)/90);
 		}
 	}
 	else if(substreamID >= SUBSTREAM_DTS_LOW && substreamID < SUBSTREAM_DTS_HIGH)
@@ -682,7 +686,7 @@
 		if(m_demuxer)
 		{
 			uint16_t ac3DataLen = length - (m_index - dataStartIndex);
-			m_demuxer->ProcessDTSStream(&m_buff[m_index], ac3DataLen, substreamID);
+			m_demuxer->ProcessDTSStream(&m_buff[m_index], ac3DataLen, substreamID, (pktinfo.pts - m_startpts)/90);
 		}
 	}
 	else if(substreamID >= SUBSTREAM_PCM_LOW && substreamID < SUBSTREAM_PCM_HIGH)
@@ -693,7 +697,7 @@
 		if(m_demuxer)
 		{
 			uint16_t ac3DataLen = length - (m_index - dataStartIndex);
-			m_demuxer->ProcessLPCMStream(&m_buff[m_index], ac3DataLen, substreamID);
+			m_demuxer->ProcessLPCMStream(&m_buff[m_index], ac3DataLen, substreamID, (pktinfo.pts - m_startpts)/90);
 		}
 	}
 	else

Modified: trunk/DvdMenuXtractor/VobParser.h
===================================================================
--- trunk/DvdMenuXtractor/VobParser.h	2004-10-25 21:19:56 UTC (rev 917)
+++ trunk/DvdMenuXtractor/VobParser.h	2004-10-25 21:22:18 UTC (rev 918)
@@ -105,8 +105,8 @@
 	uint64_t scr;
 	uint16_t scr_ext;
 	uint32_t program_mux_rate;
-	uint64_t pts;
-	uint64_t dts;
+	int64_t pts;
+	int64_t dts;
 } packet_info;
 
 // ============================================================================
@@ -160,12 +160,12 @@
 	Demuxer() : m_next(NULL) {}
 	virtual ~Demuxer() {}
 	virtual void ProcessVideoStream(uint8_t* buff, uint32_t size) {}
-	virtual void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID) {}
+	virtual void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay) {}
 	virtual void ProcessVOBStream(uint8_t* buff, uint32_t size) {}
-	virtual void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID) {}
-	virtual void ProcessLPCMStream(uint8_t* buff, uint32_t size, uint8_t streamID) {}
-	virtual void ProcessDTSStream(uint8_t* buff, uint32_t size, uint8_t streamID) {}
-	virtual void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID) {}
+	virtual void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay) {}
+	virtual void ProcessLPCMStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay) {}
+	virtual void ProcessDTSStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay) {}
+	virtual void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay) {}
 	Demuxer* m_next; // used by the CompositeDemuxWriter (linked list of demuxer)
 };
 
@@ -176,7 +176,8 @@
 public:
 	Writer(const char* filenamePrefix, const char* extension)
 	{
-		sprintf(m_fullFilename, "%s.%s", filenamePrefix, extension);
+		m_fullFilename = filenamePrefix;
+		m_fileExtension = extension;
 		m_file = NULL;
 	}
 
@@ -192,12 +193,28 @@
 	{
 		if(!m_file)
 		{
-			m_file = fopen(m_fullFilename,"wb");
+			m_fullFilename += ".";
+			m_fullFilename += m_fileExtension;
+			m_file = fopen(m_fullFilename.c_str(),"wb");
 		}
 		fwrite(buff, 1, size, m_file);
 	}
+
+	void Write(uint8_t* buff, uint32_t size, int32_t delay)
+	{
+		if(!m_file)
+		{
+			if (delay != 0)
+				m_fullFilename += wxString::Format("_%dms",delay);
+			m_fullFilename += ".";
+			m_fullFilename +=  m_fileExtension;
+			m_file = fopen(m_fullFilename.c_str(),"wb");
+		}
+		fwrite(buff, 1, size, m_file);
+	}
 protected:
-	char m_fullFilename[255];
+	wxString m_fullFilename;
+	wxString m_fileExtension;
 	FILE* m_file;
 };
 
@@ -226,9 +243,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)
+	void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
-		if(m_streamID == streamID) { Write(buff,size); }
+		if(m_streamID == streamID) { Write(buff,size, delay); }
 	}
 private:
 	uint8_t m_streamID;
@@ -241,9 +258,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)
+	void ProcessDTSStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
-		if(m_streamID == streamID) { Write(buff,size); }
+		if(m_streamID == streamID) { Write(buff,size, delay); }
 	}
 private:
 	uint8_t m_streamID;
@@ -256,9 +273,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)
+	void ProcessLPCMStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
-		if(m_streamID == streamID) { Write(buff,size); }
+		if(m_streamID == streamID) { Write(buff,size, delay); }
 	}
 private:
 	uint8_t m_streamID;
@@ -271,9 +288,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)
+	void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
-		if(m_streamID == streamID) { Write(buff,size); }
+		if(m_streamID == streamID) { Write(buff,size, delay); }
 	}
 private:
 	uint8_t m_streamID;
@@ -286,7 +303,7 @@
 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)
+	void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		if(m_streamID == streamID) { Write(buff,size); }
 	}
@@ -348,52 +365,52 @@
 		}		
 	}
 
-	void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID)
+	void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		Demuxer* demuxCursor = m_demuxerRoot;
 		while(demuxCursor)
 		{
-			demuxCursor->ProcessAudioStream(buff,size, streamID);
+			demuxCursor->ProcessAudioStream(buff,size, streamID, delay);
 			demuxCursor = demuxCursor->m_next;
 		}		
 	}
 
-	void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID)
+	void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		Demuxer* demuxCursor = m_demuxerRoot;
 		while(demuxCursor)
 		{
-			demuxCursor->ProcessAC3Stream(buff,size,streamID);
+			demuxCursor->ProcessAC3Stream(buff,size,streamID, delay);
 			demuxCursor = demuxCursor->m_next;
 		}		
 	}
 
-	void ProcessDTSStream(uint8_t* buff, uint32_t size, uint8_t streamID)
+	void ProcessDTSStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		Demuxer* demuxCursor = m_demuxerRoot;
 		while(demuxCursor)
 		{
-			demuxCursor->ProcessDTSStream(buff,size,streamID);
+			demuxCursor->ProcessDTSStream(buff,size,streamID, delay);
 			demuxCursor = demuxCursor->m_next;
 		}		
 	}
 
-	void ProcessLPCMStream(uint8_t* buff, uint32_t size, uint8_t streamID)
+	void ProcessLPCMStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		Demuxer* demuxCursor = m_demuxerRoot;
 		while(demuxCursor)
 		{
-			demuxCursor->ProcessLPCMStream(buff,size,streamID);
+			demuxCursor->ProcessLPCMStream(buff,size,streamID, delay);
 			demuxCursor = demuxCursor->m_next;
 		}		
 	}
 
-	void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID)
+	void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		Demuxer* demuxCursor = m_demuxerRoot;
 		while(demuxCursor)
 		{
-			demuxCursor->ProcessSubStream(buff,size,streamID);
+			demuxCursor->ProcessSubStream(buff,size,streamID, delay);
 			demuxCursor = demuxCursor->m_next;
 		}		
 	}
@@ -506,17 +523,17 @@
 		m_cid->hasVideo = true;
 	}
 
-	void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID)
+	void ProcessAudioStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		m_cid->hasAudio = true;
 	}
 
-	void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID)
+	void ProcessAC3Stream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		m_cid->hasAudio = true;
 	}
 
-	void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID)
+	void ProcessSubStream(uint8_t* buff, uint32_t size, uint8_t streamID, int32_t delay)
 	{
 		m_cid->hasSubs = true;
 	}
@@ -580,6 +597,9 @@
 	uint32_t m_index;
 	uint32_t m_pktindex;
 	uint32_t m_pktcount;
+	bool m_bFirstPacket;
+	int64_t m_startpts;
+	int64_t m_startdts;
 	
 	Demuxer* m_demuxer;
 	CellMap m_map;
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.