[matroska] r918 - trunk/DvdMenuXtractor
[email protected] Tue, 26 Oct 2004 01:22:19 +0400 (MSD)
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;