[matroska] r963 - trunk/DvdMenuXtractor

[email protected]
Newsgroups gmane.comp.multimedia.matroska.cvs
Message-ID <[email protected]>
Author: robux4
Date: 2004-12-12 12:53:18 +0300 (Sun, 12 Dec 2004)
New Revision: 963

Modified:
   trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
   trunk/DvdMenuXtractor/IFOFile.cpp
   trunk/DvdMenuXtractor/IFOFile.h
   trunk/DvdMenuXtractor/VobParser.cpp
   trunk/DvdMenuXtractor/VobParser.h
Log:
cleaner handling of cell times

Modified: trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
===================================================================
--- trunk/DvdMenuXtractor/DvdMenuXtractor.cpp	2004-12-11 21:26:11 UTC (rev 962)
+++ trunk/DvdMenuXtractor/DvdMenuXtractor.cpp	2004-12-12 09:53:18 UTC (rev 963)
@@ -464,7 +464,7 @@
                     wxString::Format("%d",cle->cellid));
 
                 cle->start_frame = frameaccu;
-                frameaccu += cle->duration;
+                frameaccu += cle->nb_frames;
                 cle->end_frame = frameaccu-1;
 
                 m_lstcMenuCell->SetItem(i,LI_COLUMN_IDX_IFO_RANGE,

Modified: trunk/DvdMenuXtractor/IFOFile.cpp
===================================================================
--- trunk/DvdMenuXtractor/IFOFile.cpp	2004-12-11 21:26:11 UTC (rev 962)
+++ trunk/DvdMenuXtractor/IFOFile.cpp	2004-12-12 09:53:18 UTC (rev 963)
@@ -22,9 +22,9 @@
 // Macro to convert Binary Coded Decimal to Decimal
 #define BCD2D(__x__) (((__x__ & 0xf0) >> 4) * 10 + (__x__ & 0x0f))
 
-int dvdtime2frame(dvd_time_t* dtime)
+int dvdtime2frame(dvd_time_t* dtime, double & frame_dur)
 {
-	double frame_rate = 25.0;
+	double frame_rate;
 	double result = 0.0;
 	assert((dtime->hour>>4) < 0xa && (dtime->hour&0xf) < 0xa);
 	assert((dtime->minute>>4) < 0x7 && (dtime->minute&0xf) < 0xa);
@@ -37,8 +37,9 @@
 	sec = BCD2D(dtime->second);
 	ff = BCD2D(dtime->frame_u & 0x3f);
 
-	frame_rate = ((dtime->frame_u & 0xc0) >> 6) == 1 ? 25.0 : 30;
+	frame_rate = ((dtime->frame_u & 0xc0) >> 6) == 1 ? 25.0 : (30000.0/1001.0);
 	result = (((((hh * 60) + min) * 60) + sec) * frame_rate) + (ff & 0x3f);
+	frame_dur = 1000.0 / frame_rate;
 
 	return (int)result;
 }
@@ -228,19 +229,12 @@
 				cle->vobid = vob_id;
 				cle->cellid = cell_id;
 
-				if(srp.pgc->cell_playback[k].still_time > 0)
+				cle->nb_frames = dvdtime2frame(&srp.pgc->cell_playback[k].playback_time, cle->frame_dur);
+				cle->isStill = (srp.pgc->cell_playback[k].still_time > 0);
+				if (cle->isStill)
 				{
-					// stills
-					double frame_rate = ((srp.pgc->cell_playback[k].playback_time.frame_u & 0xc0) >> 6) == 1 ? 25.0 : 30;
-					cle->duration = srp.pgc->cell_playback[k].still_time * frame_rate;
-					cle->isStill = TRUE;
+					cle->frame_dur = srp.pgc->cell_playback[k].still_time * 1000.0 / cle->nb_frames;
 				}
-				else
-				{
-					// video
-					cle->duration = dvdtime2frame(&srp.pgc->cell_playback[k].playback_time);
-					cle->isStill = FALSE;
-				}
 				cle->first_sector = srp.pgc->cell_playback[k].first_sector;
 			}
 		}
@@ -296,7 +290,7 @@
 
 // ----------------------------------------------------------------------------
 
-bool IFOFile::IsACandidateCell(const unsigned int vobid, const unsigned int cellid)
+CellListElem* IFOFile::IsACandidateCell(const unsigned int vobid, const unsigned int cellid)
 {
 	CellsListType::Node *node;
 	CellListElem* cle;
@@ -308,11 +302,11 @@
 		cle = node->GetData();
 		if( cle->vobid == vobid && cle->cellid == cellid)
 		{
-			return TRUE;
+			return cle;
 		}
 		node = node->GetNext();
 	}
-	return FALSE;
+	return NULL;
 }
 
 // ----------------------------------------------------------------------------

Modified: trunk/DvdMenuXtractor/IFOFile.h
===================================================================
--- trunk/DvdMenuXtractor/IFOFile.h	2004-12-11 21:26:11 UTC (rev 962)
+++ trunk/DvdMenuXtractor/IFOFile.h	2004-12-12 09:53:18 UTC (rev 963)
@@ -21,8 +21,9 @@
 	unsigned int cellid;
 	unsigned int start_frame;
 	unsigned int end_frame;
-	unsigned int duration; // in frame
+	unsigned int nb_frames;
 	unsigned int first_sector; // sector in vob
+	double frame_dur;
 	bool isStill;
 	//ButtonsListType btt_list;
 } CellListElem;
@@ -82,7 +83,7 @@
 	void AddLanguageToSelection(const int languageNumber);
 	void ClearLanguageSelection();
 	const CellsListType* GetCellsList(unsigned int title, bool language);
-	bool IsACandidateCell(const unsigned int vobid, const unsigned int cellid);
+	CellListElem* IsACandidateCell(const unsigned int vobid, const unsigned int cellid);
 	virtual ~IFOFile();
 	const pgc_t *FirstPlayPGC() const;
 	const pgci_ut_t *LanguageUnits(unsigned int title) const;

Modified: trunk/DvdMenuXtractor/VobParser.cpp
===================================================================
--- trunk/DvdMenuXtractor/VobParser.cpp	2004-12-11 21:26:11 UTC (rev 962)
+++ trunk/DvdMenuXtractor/VobParser.cpp	2004-12-12 09:53:18 UTC (rev 963)
@@ -4,6 +4,7 @@
 // ============================================================================
 
 #include "VobParser.h"
+#include "IFOFile.h"
 #include <assert.h>
 
 #include "wx/listimpl.cpp"
@@ -85,10 +86,10 @@
 	return true;
 }
 
-void CompositeDemuxWriter::ProcessStream(uint8_t streamID, uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+void CompositeDemuxWriter::ProcessStream(uint8_t streamID, uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug)
 {
 	assert(m_muxers[streamID] != NULL);
-	m_muxers[streamID]->ProcessStream(buff, size, delay, debug);
+	m_muxers[streamID]->ProcessStream(buff, size, start_time, end_time, debug);
 }
 
 void CompositeDemuxWriter::Reset()
@@ -103,13 +104,13 @@
 	}
 }
 
-void CompositeDemuxWriter::SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id)
+void CompositeDemuxWriter::SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id)
 {
 	for (int i=0; i<256; i++)
 	{
 		if (m_muxers[i] != NULL)
 		{
-			m_muxers[i]->SetBoundary(end_timecode, vob_id, cell_id);
+			m_muxers[i]->SetBoundary(start_timecode, duration, vob_id, cell_id);
 		}
 	}
 }
@@ -238,9 +239,23 @@
 						SkipNBytes(_size);
 					}
 				}
-				if (IsNewCell())
-					m_demuxer.SetBoundary(0,GetVobID(), GetCellID());
+				if (IsNewCell()) {
+					CellListElem* cell = IfoFile.IsACandidateCell(GetVobID(), GetCellID());
+
+					if (cell != NULL)
+					{
+						if (m_dsi.nv_pck_scr == 0)
+							m_pci_vob_timecode_offset = m_pci.vobu_s_ptm / 90;
+						m_demuxer.SetBoundary(m_pci.vobu_s_ptm/90 - m_pci_vob_timecode_offset, cell->nb_frames * cell->frame_dur, cell->vobid, cell->vobid);
+					}
 			}
+				if (m_pci.btn_ns != 0) 
+				{ // there are some buttons
+					uint32_t t3 = m_pci.vobu_s_ptm/90 - m_pci_vob_timecode_offset;
+					uint32_t t4 = m_pci.vobu_e_ptm/90 - m_pci_vob_timecode_offset;
+					m_demuxer.ProcessStream(SUBSTREAM_PCI, &m_buff[m_pci_position], m_pci_size+2, t3, t4, wxString::Format("%X / %X / %d / %d\n", m_dsi.c_eltm, m_pci.c_eltm, t3, t4));
+				}
+			}
 			else if ((_StreamID & VIDEO_STREAM) == VIDEO_STREAM)
 			{
 				DebugLog("Video pack {}\n");
@@ -406,6 +421,7 @@
 void VobParser::ParseNavPacket()
 {
 	uint32_t endStreamIndex = 0;
+	uint32_t position = m_index;
 	uint16_t length = GetNext16Bits();
 	endStreamIndex = m_index + length;
 	uint8_t substreamID = GetNext8Bits();
@@ -416,8 +432,8 @@
 		DebugLog("PCI {\n");
 		inc_lvl();
 		ParsePCI();
-		if (m_pci.btn_ns != 0) // there are some buttons
-			m_demuxer.ProcessStream(SUBSTREAM_PCI, &m_buff[0x2C], length, (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_pci_position = position;
+		m_pci_size = length;
 		dec_lvl();
 		DebugLog("}\n");
 		break;
@@ -645,7 +661,7 @@
 	ParsePESHeaderData();
 
 	m_demuxer.ProcessStream(VIDEO_STREAM, &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));
+		length - 3 - pes_header_data_content.PES_header_data_len, (int32_t)pktinfo.pts/90, (int32_t)pktinfo.dts/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)
@@ -655,7 +671,7 @@
 	ParsePESHeaderData();
 
 	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));
+		length - 3 - pes_header_data_content.PES_header_data_len, (int32_t)pktinfo.pts/90, (int32_t)pktinfo.dts/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));
 }
 
 // ----------------------------------------------------------------------------
@@ -674,7 +690,7 @@
 		DebugLog("Subtitles streamID = 0x%X\n", substreamID);
 
 		// .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));
+		m_demuxer.ProcessStream(substreamID, m_buff, DVD_VIDEO_LB_LEN, (int32_t)pktinfo.pts/90, (int32_t)pktinfo.dts/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)
 	{
@@ -686,7 +702,7 @@
 		SkipNBytes(2);
 
 		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));
+		m_demuxer.ProcessStream(substreamID, &m_buff[m_index], ac3DataLen, (int32_t)pktinfo.pts/90, (int32_t)pktinfo.dts/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)
 	{
@@ -697,7 +713,7 @@
 		SkipNBytes(2);
 
 		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));
+		m_demuxer.ProcessStream(substreamID, &m_buff[m_index], ac3DataLen, (int32_t)pktinfo.pts/90, (int32_t)pktinfo.dts/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)
 	{
@@ -706,7 +722,7 @@
 		SkipNBytes(6);
 
 		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));
+		m_demuxer.ProcessStream(substreamID, &m_buff[m_index], ac3DataLen, (int32_t)pktinfo.pts/90, (int32_t)pktinfo.dts/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
 	{
@@ -730,36 +746,6 @@
 
 // ----------------------------------------------------------------------------
 
-void VobParser::BuildMap(IFOFile & IfoFile)
-{
-	cell_info_node* cell;
-	ButtonListElem* ble;
-
-	m_map.Clear();
-	m_pci.btn_ns = 0;
-
-    while(ParseNextPacket(IfoFile))
-    {
-        if(IsNewCell())
-        {
-			// Collect cell info
-			cell = m_map.AddCell(GetVobID(), GetCellID());
-
-			for(int i=0; i < m_pci.btn_ns; i++)
-			{
-				ble = new ButtonListElem();
-				ble->x1 = m_pci.btnit[i].start_x;
-				ble->y1 = m_pci.btnit[i].start_y;
-				ble->x2 = m_pci.btnit[i].end_x;
-				ble->y2 = m_pci.btnit[i].end_y;
-				cell->btt_list.Append(ble);
-			}
-        }
-    }
-}
-
-// ----------------------------------------------------------------------------
-
 bool VobParser::IsNewCell()
 {
 	bool result = (GetVobID() != previous_vobid ||
@@ -796,15 +782,8 @@
 
 // ----------------------------------------------------------------------------
  
-const CellMap& VobParser::GetVobMap() const
+void SubDemuxWriter::WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug)
 {
-	return m_map;
-}
-
-// ----------------------------------------------------------------------------
- 
-void SubDemuxWriter::WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug)
-{
 	if (!m_TimecodeFile)
 	{
 		wxString m_filename = m_Filename;
@@ -851,6 +830,7 @@
 		       "# alt: ", 1, 112, m_TimecodeFile);
         fprintf(m_TimecodeFile, "%s\n\n", DecodeLanguage(m_language));
 	}
+	int32_t delay = start_time - end_time;
 	bool sign = delay < 0;
 	delay = sign?-delay:delay;
 	int millisecond = delay % 1000;
@@ -862,30 +842,17 @@
 	fprintf(m_TimecodeFile, "timestamp: %s%02d:%02d:%02d:%03d, filepos: %09x\n", sign?"-":"", delay,minute,second,millisecond,filepos);
 }
 
-void BtnDemuxWriter::WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug)
+void BtnDemuxWriter::WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug)
 {
 	m_TimecodeFile = GetTimecodeFile();
-	if (m_prev_timecode < m_timecode)
-	{
-		// there was a gap
-		fprintf(m_TimecodeFile, "gap,%lf", 1000.0 * (m_timecode - m_prev_timecode));
-		m_prev_timecode = m_timecode;
-	}
-	m_timecode = delay;
-/*	bool sign = delay < 0;
-	delay = sign?-delay:delay;
-	int millisecond = delay % 1000;
-	delay /= 1000;
-	int second = delay % 60;
-	delay /= 60;
-	int minute = delay % 60;
-	delay /= 60;
-	fprintf(m_TimecodeFile, "timestamp: %s%02d:%02d:%02d:%03d, filepos: %09x\n", sign?"-":"", delay,minute,second,millisecond,filepos);
-*/}
+	fwrite(debug.c_str(), 1, debug.length(), m_TimecodeFile);
+	fprintf(m_TimecodeFile, "# timecode %d\n", m_timecode);
+}
 
-void DTSDemuxWriter::WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug)
+void DTSDemuxWriter::WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug)
 {
 	m_TimecodeFile = GetTimecodeFile();
+	int32_t delay = start_time - end_time;
 	bool sign = delay < 0;
 	delay = sign?-delay:delay;
 	int millisecond = delay % 1000;
@@ -897,9 +864,10 @@
 	fprintf(m_TimecodeFile, "timestamp: %s%02d:%02d:%02d:%03d, filepos: %09x\n", sign?"-":"", delay,minute,second,millisecond,filepos);
 }
 
-void LPCMDemuxWriter::WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug)
+void LPCMDemuxWriter::WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug)
 {
 	m_TimecodeFile = GetTimecodeFile();
+	int32_t delay = start_time - end_time;
 	bool sign = delay < 0;
 	delay = sign?-delay:delay;
 	int millisecond = delay % 1000;
@@ -911,9 +879,10 @@
 	fprintf(m_TimecodeFile, "timestamp: %s%02d:%02d:%02d:%03d, filepos: %09x\n", sign?"-":"", delay,minute,second,millisecond,filepos);
 }
 
-void MPADemuxWriter::WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug)
+void MPADemuxWriter::WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug)
 {
 	m_TimecodeFile = GetTimecodeFile();
+	int32_t delay = start_time - end_time;
 	bool sign = delay < 0;
 	delay = sign?-delay:delay;
 	int millisecond = delay % 1000;
@@ -925,9 +894,10 @@
 	fprintf(m_TimecodeFile, "timestamp: %s%02d:%02d:%02d:%03d, filepos: %09x\n", sign?"-":"", delay,minute,second,millisecond,filepos);
 }
 
-void AC3DemuxWriter::WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug)
+void AC3DemuxWriter::WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug)
 {
 	m_TimecodeFile = GetTimecodeFile();
+	int32_t delay = start_time - end_time;
 	bool sign = delay < 0;
 	delay = sign?-delay:delay;
 	int millisecond = delay % 1000;
@@ -939,9 +909,10 @@
 	fprintf(m_TimecodeFile, "timestamp: %s%02d:%02d:%02d:%03d, filepos: %09x\n", sign?"-":"", delay,minute,second,millisecond,filepos);
 }
 
-void VideoDemuxWriter::WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug)
+void VideoDemuxWriter::WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug)
 {
 	m_TimecodeFile = GetTimecodeFile();
+	int32_t delay = start_time - end_time;
 	bool sign = delay < 0;
 	delay = sign?-delay:delay;
 	int millisecond = delay % 1000;
@@ -955,39 +926,42 @@
 
 // ============================================================================
 
-void VideoDemuxWriter::SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id)
+void VideoDemuxWriter::SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id)
 {
 }
 
-void AC3DemuxWriter::SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id)
+void AC3DemuxWriter::SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id)
 {
 }
 
-void DTSDemuxWriter::SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id)
+void DTSDemuxWriter::SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id)
 {
 }
 
-void LPCMDemuxWriter::SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id)
+void LPCMDemuxWriter::SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id)
 {
 }
 
-void MPADemuxWriter::SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id)
+void MPADemuxWriter::SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id)
 {
 }
 
-void SubDemuxWriter::SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id)
+void SubDemuxWriter::SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id)
 {
 }
 
-void BtnDemuxWriter::SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id)
+void BtnDemuxWriter::SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id)
 {
 	m_TimecodeFile = GetTimecodeFile();
-	if (m_prev_timecode < m_timecode)
+	if (start_timecode == 0) // new VOB
 	{
-		// there was a gap
-		fprintf(m_TimecodeFile, "gap,%lf\n", 1000.0 * (m_timecode - m_prev_timecode));
-		m_prev_timecode = m_timecode;
+		if (m_prev_timecode < start_timecode)
+		{
+			// there was a gap
+			fprintf(m_TimecodeFile, "gap,%lf\n", ((double)(start_timecode - m_prev_timecode)) / 1000.0);
+			m_prev_timecode = start_timecode;
+		}
 	}
 	fprintf(m_TimecodeFile, "# VOB %d Cell %d\n", vob_id, cell_id);
-	fprintf(m_TimecodeFile, "timecode %d\n", end_timecode);
+	fprintf(m_TimecodeFile, "# CELL TIMECODE %d -> %d [%d]\n", start_timecode, start_timecode+duration, duration);
 }

Modified: trunk/DvdMenuXtractor/VobParser.h
===================================================================
--- trunk/DvdMenuXtractor/VobParser.h	2004-12-11 21:26:11 UTC (rev 962)
+++ trunk/DvdMenuXtractor/VobParser.h	2004-12-12 09:53:18 UTC (rev 963)
@@ -176,8 +176,8 @@
 {
 public:
 	virtual ~Demuxer() {}
-	virtual void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug) = 0;
-	virtual void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id) = 0;
+	virtual void ProcessStream(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug) = 0;
+	virtual void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id) = 0;
 };
 
 // ----------------------------------------------------------------------------
@@ -204,18 +204,16 @@
 			fclose(m_TimecodeFile);
 	}
 
-	void Write(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+	void Write(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug)
 	{
 		if(!m_file)
 		{
 			wxString m_filename = m_Filename;
-//			if (delay != 0)
-//				m_filename += wxString::Format("_%dms",delay);
 			m_filename += ".";
 			m_filename +=  m_fileExtension;
 			m_file = fopen(m_filename.c_str(),"wb");
 		}
-		WriteTimecodeInfo(delay, ftell(m_file), debug);
+		WriteTimecodeInfo(start_time, end_time, ftell(m_file), debug);
 		fwrite(buff, 1, size, m_file);
 	}
 protected:
@@ -241,7 +239,7 @@
 	FILE* m_TimecodeFile;
 	double m_fps;
 
-	virtual void WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug) = 0;
+	virtual void WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug) = 0;
 };
 
 // ----------------------------------------------------------------------------
@@ -250,10 +248,10 @@
 {
 public:
 	VideoDemuxWriter(const char* filenamePrefix, double fps) : Writer(filenamePrefix,"m2v", fps) {}
-	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug) { Write(buff, size, delay, debug); }
-	void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id);
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug) { Write(buff, size, start_time, end_time, debug); }
+	void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id);
 protected:
-	void WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug);
+	void WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug);
 };
 
 // ----------------------------------------------------------------------------
@@ -263,15 +261,15 @@
 public:
 	AC3DemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix,"ac3", 0.0), m_streamID(streamID) {}
-	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug)
 	{
-		Write(buff,size, delay, debug);
+		Write(buff,size, start_time, end_time, debug);
 	}
-	void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id);
+	void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id);
 private:
 	uint8_t m_streamID;
 protected:
-	void WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug);
+	void WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug);
 };
 
 // ----------------------------------------------------------------------------
@@ -281,15 +279,15 @@
 public:
 	DTSDemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix,"dts",0.0), m_streamID(streamID) {}
-	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug)
 	{
-		Write(buff,size, delay, debug);
+		Write(buff,size, start_time, end_time, debug);
 	}
-	void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id);
+	void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id);
 private:
 	uint8_t m_streamID;
 protected:
-	void WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug);
+	void WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug);
 };
 
 // ----------------------------------------------------------------------------
@@ -299,15 +297,15 @@
 public:
 	LPCMDemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix,"pcm",0.0), m_streamID(streamID) {}
-	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug)
 	{
-		Write(buff,size, delay, debug);
+		Write(buff,size, start_time, end_time, debug);
 	}
-	void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id);
+	void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id);
 private:
 	uint8_t m_streamID;
 protected:
-	void WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug);
+	void WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug);
 };
 
 // ----------------------------------------------------------------------------
@@ -317,15 +315,15 @@
 public:
 	MPADemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
 	  Writer(filenamePrefix,"mpa",0.0), m_streamID(streamID) {}
-	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug)
 	{
-		Write(buff,size, delay, debug);
+		Write(buff,size, start_time, end_time, debug);
 	}
-	void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id);
+	void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id);
 private:
 	uint8_t m_streamID;
 protected:
-	void WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug);
+	void WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug);
 };
 
 // ----------------------------------------------------------------------------
@@ -341,13 +339,13 @@
 		,m_palette(palette)
 		,m_language(language)
 	{}
-	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug)
 	{
-		Write(buff,size, delay, debug);
+		Write(buff,size, start_time, end_time, debug);
 	}
-	void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id);
+	void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id);
 protected:
-	void WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug);
+	void WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug);
 private:
 	uint16_t m_width;
 	uint16_t m_height;
@@ -366,13 +364,13 @@
 		,m_timecode(0)
 		,m_prev_timecode(0)
 	{}
-	void ProcessStream(uint8_t* buff, uint32_t size, int32_t delay, wxString & debug)
+	void ProcessStream(uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug)
 	{
-		Write(buff,size, delay, debug);
+		Write(buff,size, start_time, end_time, debug);
 	}
-	void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id);
+	void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id);
 protected:
-	void WriteTimecodeInfo(int32_t delay, uint64_t filepos, wxString & debug);
+	void WriteTimecodeInfo(int32_t start_time, int32_t end_time, uint64_t filepos, wxString & debug);
 	uint32_t m_timecode;
 	uint32_t m_prev_timecode;
 };
@@ -385,9 +383,9 @@
 	CompositeDemuxWriter();
 	~CompositeDemuxWriter();
 	bool AddDemuxer(uint8_t streamID, Demuxer * demuxer);
-	void ProcessStream(uint8_t streamID, uint8_t* buff, uint32_t size, int32_t delay, wxString & debug);
+	void ProcessStream(uint8_t streamID, uint8_t* buff, uint32_t size, int32_t start_time, int32_t end_time, wxString & debug);
 	void Reset();
-	void SetBoundary(uint32_t end_timecode, uint16_t vob_id, uint16_t cell_id);
+	void SetBoundary(uint32_t start_timecode, uint32_t duration, uint16_t vob_id, uint16_t cell_id);
 
 protected:
 	Demuxer * m_muxers[256];
@@ -415,72 +413,8 @@
 WX_DECLARE_LIST(ButtonListElem, ButtonsListType);
 
 
-class cell_info_node
-{
-public:
-	cell_info_node(uint8_t vobid = 0, uint8_t cellid = 0) :
-		vobid(vobid),
-		cellid(cellid)
-	{
-	}
-
-	uint8_t vobid;
-	uint8_t cellid;
-	ButtonsListType btt_list;
-};
-
-
-
-WX_DECLARE_HASH_MAP( int, cell_info_node*, wxIntegerHash, wxIntegerEqual, CellsInfoHashType );
-#define MAKE_CELLINFO_KEY(__cell_elem__)  ((__cell_elem__->vobid << 8) | __cell_elem__->cellid)
-
-
 // ----------------------------------------------------------------------------
 
-class CellMap
-{
-public:
-	CellMap()
-	{
-	}
-
-	~CellMap()
-	{
-		// clean the hash table
-		Clear();
-	}
-
-	cell_info_node* AddCell(uint8_t vobid, uint8_t cellid)
-	{
-		cell_info_node* newnode = new cell_info_node(vobid,cellid);
-
-		CellsHash[MAKE_CELLINFO_KEY(newnode)] = newnode;
-		return newnode;
-	}
-
-	int GetCount() { return CellsHash.size(); }
-
-	cell_info_node* GetCell(uint8_t vobid, uint8_t cellid)
-	{
-		return CellsHash[((vobid << 8) | cellid)];
-	}
-
-	void Clear()
-	{
-		cell_info_node* node;
-		CellsInfoHashType::iterator it;
-		for( it = CellsHash.begin(); it != CellsHash.end(); ++it )
-		{
-			node = (cell_info_node*)it->second;
-			delete node;
-		}
-
-		CellsHash.clear();
-	}
-
-	CellsInfoHashType CellsHash;
-};
-
 // ============================================================================
 // Main class
 // ============================================================================
@@ -499,8 +433,6 @@
 	uint8_t GetVobID() const;
 	uint8_t GetCellID() const;
 	bool IsNewCell();
-	void BuildMap(IFOFile & IfoFile);
-	const CellMap& GetVobMap() const;
 	virtual ~VobParser();
 	inline CompositeDemuxWriter & GetDemuxer()
 	{
@@ -545,9 +477,11 @@
 	bool m_bFirstPacket;
 	int64_t m_startpts;
 	int64_t m_startdts;
+	uint16_t m_pci_position;
+	uint16_t m_pci_size;
+	uint32_t m_pci_vob_timecode_offset;
 	
 	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.