[matroska] r1006 - trunk/DvdMenuXtractor

[email protected]
Newsgroups gmane.comp.multimedia.matroska.cvs
Message-ID <[email protected]>
Author: robux4
Date: 2005-01-05 17:14:41 +0300 (Wed, 05 Jan 2005)
New Revision: 1006

Modified:
   trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
   trunk/DvdMenuXtractor/README.txt
   trunk/DvdMenuXtractor/VobParser.cpp
   trunk/DvdMenuXtractor/VobParser.h
Log:
DMX: only use the files existing in the mkvmerge command-line

Modified: trunk/DvdMenuXtractor/DvdMenuXtractor.cpp
===================================================================
--- trunk/DvdMenuXtractor/DvdMenuXtractor.cpp	2005-01-05 13:12:35 UTC (rev 1005)
+++ trunk/DvdMenuXtractor/DvdMenuXtractor.cpp	2005-01-05 14:14:41 UTC (rev 1006)
@@ -73,7 +73,7 @@
 wxString outputDirectory;
 wxString mtxDirectory;
 const wxString APPLICATION_NAME = "DVDMenuXtractor: DMX - a fair-use tool";
-const wxString APPLICATION_VERSION = "0.6.4";
+const wxString APPLICATION_VERSION = "0.7.0";
 
 // ----------------------------------------------------------------------------
 
@@ -617,7 +617,7 @@
 
             m_txtDemuxLog->AppendText("Processing " + newFilename + "\n");
 
-			wxString MtxFilename = outputDirectory + newFilename + ".cmd";
+			wxString MtxFilename = outputDirectory + newFilename + ".bat";
 			wxFile MtxCommandFile;
 			MtxCommandFile.Create(MtxFilename, true, wxS_DEFAULT | wxS_IXUSR | wxS_IXGRP | wxS_IXOTH);
 #if !defined(WIN32)
@@ -625,14 +625,14 @@
 			MtxCommandFile.Write(ShellString.c_str(), ShellString.Length());
 #endif
 #if defined(WIN32)
-			wxString MtxCommandString = "\"" + mtxDirectory + "mkvmerge\" -o " + outputDirectory+newFilename + ".mkv ";
+			wxString MtxCommandString = "\"" + mtxDirectory + "mkvmerge\" -o " + outputDirectory+newFilename + ".mkv";
 #else
-			wxString MtxCommandString = mtxDirectory + "mkvmerge -o " + outputDirectory+newFilename + ".mkv ";
+			wxString MtxCommandString = mtxDirectory + "mkvmerge -o " + outputDirectory+newFilename + ".mkv";
 #endif
-			MtxCommandString += "--track-name 0:\"video\" --timecodes 0:" + outputDirectory+newFilename + "_m2v.tmc " + outputDirectory+newFilename + ".m2v";
+			wxString MtxCommandStringTemp = " --track-name 0:\"video\" --timecodes 0:" + outputDirectory+newFilename + "_m2v.tmc " + outputDirectory+newFilename + ".m2v";
 
-			Demuxer * _muxer = new VideoDemuxWriter(outputDirectory + newFilename, _fps);
-            if (!demuxer.AddDemuxer(VIDEO_STREAM, _muxer))
+			Writer * _muxer = new VideoDemuxWriter(outputDirectory + newFilename, _fps);
+            if (!demuxer.AddDemuxer(VIDEO_STREAM, _muxer, MtxCommandStringTemp))
 				delete _muxer;
 
 			size_t _stream;
@@ -664,37 +664,33 @@
 					switch (_audioTracks.Item(_stream)->GetData()->audio_format)
 					{
 					case 0:
+						MtxTempString += "_ac3.tmc " + outputDirectory+newFilename+_langName + ".ac3";
 						_muxer = new AC3DemuxWriter(outputDirectory + newFilename+_langName, 0x80 + _ID);
-						if (!demuxer.AddDemuxer(SUBSTREAM_AC3_LOW + _ID, _muxer))
+						if (!demuxer.AddDemuxer(SUBSTREAM_AC3_LOW + _ID, _muxer, MtxTempString))
 							delete _muxer;
-						else
-							MtxCommandString += MtxTempString + "_ac3.tmc " + outputDirectory+newFilename+_langName + ".ac3";
 						break;
 
 					case 2:
 					case 3:
+						MtxTempString += "_mpa.tmc " + outputDirectory+newFilename+_langName + ".mpa";
 						_muxer = new MPADemuxWriter(outputDirectory + newFilename+_langName, 0xC0 + _ID);
-						if (!demuxer.AddDemuxer(AUDIO_STREAM + _ID, _muxer))
+						if (!demuxer.AddDemuxer(AUDIO_STREAM + _ID, _muxer, MtxTempString))
 							delete _muxer;
-						else
-							MtxCommandString += MtxTempString + "_mpa.tmc " + outputDirectory+newFilename+_langName + ".mpa";
 						break;
 
 					case 4:
 						// TODO possibly other LPCM formats ?
+						MtxTempString += "_wav.tmc " + outputDirectory+newFilename+_langName + ".wav";
 						_muxer = new LPCMDemuxWriter(outputDirectory + newFilename+_langName, 0xA0 + _ID, 48000, 16, 2);
-						if (!demuxer.AddDemuxer(SUBSTREAM_PCM_LOW + _ID, _muxer))
+						if (!demuxer.AddDemuxer(SUBSTREAM_PCM_LOW + _ID, _muxer, MtxTempString))
 							delete _muxer;
-						else
-							MtxCommandString += MtxTempString + "_wav.tmc " + outputDirectory+newFilename+_langName + ".wav";
 						break;
 
 					case 6:
+						MtxTempString += "_dts.tmc " + outputDirectory+newFilename+_langName + ".dts";
 						_muxer = new DTSDemuxWriter(outputDirectory + newFilename+_langName, 0x88 + _ID);
-						if (!demuxer.AddDemuxer(SUBSTREAM_DTS_LOW + _ID, _muxer))
+						if (!demuxer.AddDemuxer(SUBSTREAM_DTS_LOW + _ID, _muxer, MtxTempString))
 							delete _muxer;
-						else
-							MtxCommandString += MtxTempString + "_dts.tmc " + outputDirectory+newFilename+_langName + ".dts";
 						break;
 
 					default:
@@ -728,25 +724,19 @@
 							MtxTempString += newFilename+_langName + "\" --language 0:";
 							MtxTempString += wxString::Format("%c%c ", _attr->lang_code >> 8, _attr->lang_code & 0xFF);
 						}
+						MtxTempString += outputDirectory+newFilename+_langName + ".idx";
 						_muxer = new SubDemuxWriter(outputDirectory + newFilename+_langName, 0x20 + _IDs.Item(_IDidx), _width, _height, _palette, _attr->lang_code, _attr->lang_extension == 9);
-						if (!demuxer.AddDemuxer(SUBSTREAM_SUB_LOW + _IDs.Item(_IDidx), _muxer))
+						if (!demuxer.AddDemuxer(SUBSTREAM_SUB_LOW + _IDs.Item(_IDidx), _muxer, MtxTempString))
 							delete _muxer;
-						else
-							MtxCommandString += MtxTempString + outputDirectory+newFilename+_langName + ".idx";
 					}
 				}
 				// create a possible button demuxer too
+				MtxCommandStringTemp = " --track-name 0:\"btn-" + newFilename + "\" --timecodes 0:" + outputDirectory+newFilename + "_btn.tmc " + outputDirectory+newFilename + ".btn";
 				_muxer = new BtnDemuxWriter(outputDirectory + newFilename, _width, _height);
-				if (!demuxer.AddDemuxer(SUBSTREAM_PCI, _muxer))
+				if (!demuxer.AddDemuxer(SUBSTREAM_PCI, _muxer, MtxCommandStringTemp))
 					delete _muxer;
-				else
-					MtxCommandString += " --track-name 0:\"btn-" + newFilename + "\" --timecodes 0:" + outputDirectory+newFilename + "_btn.tmc " + outputDirectory+newFilename + ".btn";
 			}
 
-			MtxCommandString += " --chapters " + outputDirectory+newFilename + "_menu.xml";
-			MtxCommandFile.Write(MtxCommandString.c_str(), MtxCommandString.Length());
-			MtxCommandFile.Close();
-
 			m_gaDemuxProgress->SetValue(0);
 			m_gaDemuxProgress->SetRange(aVobParser.GetPacketCount() >> 8);
             while(aVobParser.ParseNextPacket(*IfoFile))
@@ -754,6 +744,17 @@
 				m_gaDemuxProgress->SetValue(aVobParser.GetPacketIndex() >> 8);
                 wxYield();
             }
+			
+			// create the command line using the list of used files
+			for (_stream = 0; _stream < 256; _stream++)
+			{
+				if (demuxer.FileExists(_stream))
+					MtxCommandString += demuxer.GetString(_stream);
+			}
+			MtxCommandString += " --chapters " + outputDirectory+newFilename + "_menu.xml";
+			MtxCommandFile.Write(MtxCommandString);
+			MtxCommandFile.Close();
+
 			m_txtDemuxLog->AppendText("Done demuxing " + newFilename + "\n");
         }
         catch(VobParserException e)

Modified: trunk/DvdMenuXtractor/README.txt
===================================================================
--- trunk/DvdMenuXtractor/README.txt	2005-01-05 13:12:35 UTC (rev 1005)
+++ trunk/DvdMenuXtractor/README.txt	2005-01-05 14:14:41 UTC (rev 1006)
@@ -1,9 +1,9 @@
 TODO :
 * support infinite still frames in the chapter XML file
-* detect when a file was empty and therefore not written
 * make use of the cancel buttons
 * store the palette for subs
 * verify (and fix) the frame and cluster timecodes from mkvmerge
+* remove the AC3 and MPEG2 decoders from the build
 * generate the d2v file ?
 * 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	2005-01-05 13:12:35 UTC (rev 1005)
+++ trunk/DvdMenuXtractor/VobParser.cpp	2005-01-05 14:14:41 UTC (rev 1006)
@@ -78,11 +78,12 @@
 	Reset();
 }
 
-bool CompositeDemuxWriter::AddDemuxer(uint8_t streamID, Demuxer * demuxer)
+bool CompositeDemuxWriter::AddDemuxer(uint8_t streamID, Writer * demuxer, wxString & CommandLine)
 {
 	if (m_muxers[streamID] != NULL)
 		return false;
 	m_muxers[streamID] = demuxer;
+	m_strings[streamID] = CommandLine;
 	return true;
 }
 

Modified: trunk/DvdMenuXtractor/VobParser.h
===================================================================
--- trunk/DvdMenuXtractor/VobParser.h	2005-01-05 13:12:35 UTC (rev 1005)
+++ trunk/DvdMenuXtractor/VobParser.h	2005-01-05 14:14:41 UTC (rev 1006)
@@ -13,7 +13,6 @@
 #include "dvdread/ifo_read.h"
 
 #include "wx/wx.h"
-#include "wx/hashmap.h"
 
 // ============================================================================
 
@@ -195,7 +194,7 @@
 
 // ----------------------------------------------------------------------------
 
-class Writer
+class Writer : public Demuxer
 {
 public:
 	Writer(const char* filenamePrefix, const char* extension, double fps)
@@ -223,6 +222,11 @@
 		WriteTimecodeInfo(start_time, end_time, ftell(m_file), debug);
 		fwrite(buff, 1, size, m_file);
 	}
+
+	bool FileExists() const {
+		return m_file != NULL;
+	}
+
 protected:
 	inline FILE* GetTimecodeFile()
 	{
@@ -262,7 +266,7 @@
 
 // ----------------------------------------------------------------------------
 
-class VideoDemuxWriter : public Demuxer, public Writer
+class VideoDemuxWriter : public Writer
 {
 public:
 	VideoDemuxWriter(const char* filenamePrefix, double fps)
@@ -286,7 +290,7 @@
 
 // ----------------------------------------------------------------------------
 
-class AC3DemuxWriter : public Demuxer, public Writer
+class AC3DemuxWriter : public Writer
 {
 public:
 	AC3DemuxWriter(const char* filenamePrefix, const uint8_t streamID)
@@ -314,7 +318,7 @@
 
 // ----------------------------------------------------------------------------
 
-class DTSDemuxWriter : public Demuxer, public Writer
+class DTSDemuxWriter : public Writer
 {
 public:
 	DTSDemuxWriter(const char* filenamePrefix, const uint8_t streamID)
@@ -359,7 +363,7 @@
 		size_t m_size_position1,m_size_position2, m_size;
 };
 
-class LPCMDemuxWriter : public Demuxer, public WavWriter
+class LPCMDemuxWriter : public WavWriter
 {
 public:
 	LPCMDemuxWriter(const char* filenamePrefix, const uint8_t streamID, uint32_t sample_rate, uint8_t bit_depth, uint8_t channel_nb)
@@ -387,7 +391,7 @@
 
 // ----------------------------------------------------------------------------
 
-class MPADemuxWriter : public Demuxer, public Writer
+class MPADemuxWriter : public Writer
 {
 public:
 	MPADemuxWriter(const char* filenamePrefix, const uint8_t streamID) :
@@ -405,7 +409,7 @@
 
 // ----------------------------------------------------------------------------
 
-class SubDemuxWriter : public Demuxer, public Writer
+class SubDemuxWriter : public Writer
 {
 public:
 	SubDemuxWriter(const char* filenamePrefix, const uint8_t streamID, uint16_t width, uint16_t height, const uint32_t * palette, uint16_t language, bool forced)
@@ -437,7 +441,7 @@
 
 // ----------------------------------------------------------------------------
 
-class BtnDemuxWriter : public Demuxer, public Writer
+class BtnDemuxWriter : public Writer
 {
 public:
 	BtnDemuxWriter(const char* filenamePrefix, uint16_t width, uint16_t height)
@@ -487,13 +491,22 @@
 public:
 	CompositeDemuxWriter();
 	~CompositeDemuxWriter();
-	bool AddDemuxer(uint8_t streamID, Demuxer * demuxer);
+	bool AddDemuxer(uint8_t streamID, Writer * demuxer, wxString & CommandLine);
 	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 start_timecode, uint32_t duration, const CellListElem *cell);
 
+	bool FileExists(uint8_t streamID) const {
+		return (m_muxers[streamID] != NULL && m_muxers[streamID]->FileExists());
+	}
+
+	const wxString & GetString(uint8_t streamID) const {
+		return m_strings[streamID];
+	}
+
 protected:
-	Demuxer * m_muxers[256];
+	Writer * m_muxers[256];
+	wxString m_strings[256];
 };
 
 // ----------------------------------------------------------------------------
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.