[matroska] r975 - trunk/DvdMenuXtractor

[email protected]
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)
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.