[matroska] r963 - trunk/DvdMenuXtractor
[email protected] Sun, 12 Dec 2004 12:53:18 +0300 (MSK)
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;
};