[matroska] r975 - trunk/DvdMenuXtractor
[email protected] Tue, 14 Dec 2004 15:16:57 +0300 (MSK)
Newsgroups
gmane.comp.multimedia.matroska.cvs
Message-ID
<[email protected] >
Author: robux4
Date: 2004-12-14 15:16:56 +0300 (Tue, 14 Dec 2004)
New Revision: 975
Modified:
trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
trunk/DvdMenuXtractor/README.txt
trunk/DvdMenuXtractor/VobParser.cpp
trunk/DvdMenuXtractor/VobParser.h
Log:
DMX: write a WAV header on extracted PCM files
Modified: trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
===================================================================
--- trunk/DvdMenuXtractor/DvdMenuXtractor.cpp 2004-12-14 08:25:56 UTC (rev 974)
+++ trunk/DvdMenuXtractor/DvdMenuXtractor.cpp 2004-12-14 12:16:56 UTC (rev 975)
@@ -605,7 +605,8 @@
break;
case 4:
- _muxer = new LPCMDemuxWriter(outputDirectory + newFilename+_langName, 0xA0 + _ID);
+ // TODO possibly other LPCM formats ?
+ _muxer = new LPCMDemuxWriter(outputDirectory + newFilename+_langName, 0xA0 + _ID, 48000, 16, 2);
if (!demuxer.AddDemuxer(SUBSTREAM_PCM_LOW + _ID, _muxer))
delete _muxer;
break;
Modified: trunk/DvdMenuXtractor/README.txt
===================================================================
--- trunk/DvdMenuXtractor/README.txt 2004-12-14 08:25:56 UTC (rev 974)
+++ trunk/DvdMenuXtractor/README.txt 2004-12-14 12:16:56 UTC (rev 975)
@@ -2,7 +2,6 @@
* The duration of still frames is not handled yet (only lasts as normal frames)
TODO :
-* add a WAV header to PCM files
* generate the mkvmerge muxing batch for each output file (OS specific)
* allow skipping DVD parts when extracting (VMG, VTSM, VTS)
* allow selection of stream output (audio & subs languages)
Modified: trunk/DvdMenuXtractor/VobParser.cpp
===================================================================
--- trunk/DvdMenuXtractor/VobParser.cpp 2004-12-14 08:25:56 UTC (rev 974)
+++ trunk/DvdMenuXtractor/VobParser.cpp 2004-12-14 12:16:56 UTC (rev 975)
@@ -1116,3 +1116,87 @@
fprintf(m_TimecodeFile, "%lf\n", (m_end_timecode - m_start_timecode) / 1000.0);
}
}
+
+WavWriter::~WavWriter()
+{
+ if (m_file)
+ {
+ uint8_t _tinteger[4];
+
+ fseek(m_file, m_size_position2, SEEK_SET);
+ _tinteger[0] = m_size & 0xFF;
+ _tinteger[1] = (m_size >> 8) & 0xFF;
+ _tinteger[2] = (m_size >> 16) & 0xFF;
+ _tinteger[3] = (m_size >> 24) & 0xFF;
+ fwrite(_tinteger,4,1, m_file);
+
+ m_size += 36;
+ fseek(m_file, m_size_position1, SEEK_SET);
+ _tinteger[0] = m_size & 0xFF;
+ _tinteger[1] = (m_size >> 8) & 0xFF;
+ _tinteger[2] = (m_size >> 16) & 0xFF;
+ _tinteger[3] = (m_size >> 24) & 0xFF;
+ fwrite(_tinteger,4,1, m_file);
+ }
+}
+
+void WavWriter::Write(uint8_t* buff, uint32_t size, uint32_t start_time, uint32_t end_time, wxString & debug)
+{
+ if (m_file == NULL)
+ {
+ uint8_t _tinteger[4];
+ m_file = OpenOuputFile();
+
+ // create the WAV header
+ // RIFF head
+ fwrite("RIFF",4,1, m_file);
+ m_size_position1 = ftell(m_file);
+ fwrite("0000",4,1, m_file);
+ fwrite("WAVE",4,1, m_file);
+
+ // Format head
+ fwrite("fmt ",4,1, m_file);
+ _tinteger[0] = 16;
+ _tinteger[1] = 0;
+ _tinteger[2] = 0;
+ _tinteger[3] = 0;
+ fwrite(_tinteger,4,1, m_file);
+
+ _tinteger[0] = 1;
+ fwrite(_tinteger,2,1, m_file); // PCM
+
+ _tinteger[0] = m_channel_nb & 0xFF;
+ _tinteger[1] = m_channel_nb >> 8;
+ fwrite(_tinteger,2,1, m_file); // Channels
+
+ _tinteger[0] = m_sample_rate & 0xFF;
+ _tinteger[1] = (m_sample_rate >> 8) & 0xFF;
+ _tinteger[2] = (m_sample_rate >> 16) & 0xFF;
+ _tinteger[3] = (m_sample_rate >> 24) & 0xFF;
+ fwrite(_tinteger,4,1, m_file); // Sampling freq
+
+ uint32_t _byte_rate = (m_sample_rate * m_channel_nb * m_bit_depth) >> 3;
+ _tinteger[0] = _byte_rate & 0xFF;
+ _tinteger[1] = (_byte_rate >> 8) & 0xFF;
+ _tinteger[2] = (_byte_rate >> 16) & 0xFF;
+ _tinteger[3] = (_byte_rate >> 24) & 0xFF;
+ fwrite(_tinteger,4,1, m_file); // Byte Rate
+
+ uint16_t _block_align = (m_channel_nb * m_bit_depth) >> 3;
+ _tinteger[0] = _block_align & 0xFF;
+ _tinteger[1] = (_block_align >> 8) & 0xFF;
+ fwrite(_tinteger,2,1, m_file); // Block Align
+
+ _tinteger[0] = m_bit_depth & 0xFF;
+ _tinteger[1] = (m_bit_depth >> 8) & 0xFF;
+ fwrite(_tinteger,2,1, m_file); // Block Align
+
+ // Data head
+ fwrite("data",4,1, m_file);
+ m_size_position2 = ftell(m_file);
+ fwrite("0000",4,1, m_file);
+ m_size = 0;
+ }
+ Writer::Write(buff, size, start_time, end_time, debug);
+ m_size += size;
+}
Modified: trunk/DvdMenuXtractor/VobParser.h
===================================================================
--- trunk/DvdMenuXtractor/VobParser.h 2004-12-14 08:25:56 UTC (rev 974)
+++ trunk/DvdMenuXtractor/VobParser.h 2004-12-14 12:16:56 UTC (rev 975)
@@ -204,15 +204,9 @@
fclose(m_TimecodeFile);
}
- void Write(uint8_t* buff, uint32_t size, uint32_t start_time, uint32_t end_time, wxString & debug)
+ virtual void Write(uint8_t* buff, uint32_t size, uint32_t start_time, uint32_t end_time, wxString & debug)
{
- if(!m_file)
- {
- wxString m_filename = m_Filename;
- m_filename += ".";
- m_filename += m_fileExtension;
- m_file = fopen(m_filename.c_str(),"wb");
- }
+ m_file = OpenOuputFile();
WriteTimecodeInfo(start_time, end_time, ftell(m_file), debug);
fwrite(buff, 1, size, m_file);
}
@@ -232,6 +226,17 @@
return m_TimecodeFile;
}
+ inline FILE* OpenOuputFile()
+ {
+ if(!m_file)
+ {
+ wxString m_filename = m_Filename;
+ m_filename += ".";
+ m_filename += m_fileExtension;
+ m_file = fopen(m_filename.c_str(),"wb");
+ }
+ return m_file;
+ }
wxString m_Filename;
wxString m_fileExtension;
@@ -322,11 +327,28 @@
// ----------------------------------------------------------------------------
-class LPCMDemuxWriter : public Demuxer, public Writer
+class WavWriter : public Writer
{
+ public:
+ WavWriter(const char* filenamePrefix, double fps, uint32_t sample_rate, uint8_t bit_depth, uint8_t channel_nb)
+ :Writer(filenamePrefix, "wav", fps)
+ ,m_sample_rate(sample_rate)
+ ,m_bit_depth(bit_depth)
+ ,m_channel_nb(channel_nb)
+ {}
+ ~WavWriter();
+ void Write(uint8_t* buff, uint32_t size, uint32_t start_time, uint32_t end_time, wxString & debug);
+ protected:
+ uint32_t m_sample_rate;
+ uint8_t m_bit_depth, m_channel_nb;
+ size_t m_size_position1,m_size_position2, m_size;
+};
+
+class LPCMDemuxWriter : public Demuxer, public WavWriter
+{
public:
- LPCMDemuxWriter(const char* filenamePrefix, const uint8_t streamID)
- :Writer(filenamePrefix,"pcm",0.0)
+ LPCMDemuxWriter(const char* filenamePrefix, const uint8_t streamID, uint32_t sample_rate, uint8_t bit_depth, uint8_t channel_nb)
+ :WavWriter(filenamePrefix,0.0, sample_rate, bit_depth, channel_nb)
,m_streamID(streamID)
,m_end_timecode(0)
,m_last_start_timecode(0)