Hi,

Here is a quick hack that can save the extra dvdauthor run
and disk space for the intermediate mpg file.
dvdauthor can read from stdin, therefore with a shell script like

========== my-dvd.sh ===========================
#!/bin/sh

exec dvdauthor -t -v mpeg2 -o /mount/dvdexport -
================================================

you can master a dvd title directly by specifying

"|my-dvd.sh"

as the output file in the export file dialog.
(Maybe this could be made more elegant, but I didn't
want to mess with the dialog itself.)

As a next step it would of course be nice to generate
the xml file for dvdauthor _before_ the actual export
as a temporary and specify its name in an environment
variable.

Regards,
Wolfram.

diff -ur dvbcut/src/dvbcut.cpp dvbcut-wg/src/dvbcut.cpp
--- dvbcut/src/dvbcut.cpp       2007-11-11 20:59:10.000000000 +0100
+++ dvbcut-wg/src/dvbcut.cpp    2007-11-25 17:33:00.000000000 +0100
@@ -399,6 +399,35 @@
     expd->hide();
   }
 
+  int child_pid = -1;
+  int pipe_fds[2];
+
+#ifndef __WIN32__
+  // check for piped output
+  if (expfilen[0] == '|') {
+    if (::pipe(pipe_fds) < 0)
+      return;
+    child_pid = fork();
+    if (child_pid == 0) {
+      ::close(pipe_fds[1]);
+      if (pipe_fds[0] != STDIN_FILENO) {
+       dup2(pipe_fds[0], STDIN_FILENO);
+      }
+      //fprintf(stderr, "Executing %s\n", expfilen.c_str()+1);
+      for (int fd=0; fd<256; ++fd)
+       if (fd != STDIN_FILENO)
+         ::close(fd);
+      execl("/bin/sh", "sh", "-c", expfilen.c_str()+1, (char *)0);
+      exit(127);
+    }
+    ::close(pipe_fds[0]);
+    if (child_pid < 0) {
+      ::close(pipe_fds[1]);
+      return;
+    }
+  } else
+#endif
+
   if (QFileInfo(expfilen).exists() && question(
       "File exists - dvbcut",
       expfilen+"\nalready exists. "
@@ -426,23 +455,33 @@
     if (expd->audiolist->isSelected(a))
       audiostreammask|=1u<<a;
 
+  std::string out_file = (child_pid < 0) ? expfilen :
+    std::string("pipe:") + (const char*)QString::number(pipe_fds[1]);
+
   switch(settings().export_format) {
     case 1:
-      mux=std::auto_ptr<muxer>(new 
mpegmuxer(audiostreammask,*mpg,expfilen.c_str(),false,0));
+      mux=std::auto_ptr<muxer>(new 
mpegmuxer(audiostreammask,*mpg,out_file.c_str(),false,0));
       break;
     case 2:
-      mux=std::auto_ptr<muxer>(new 
lavfmuxer("dvd",audiostreammask,*mpg,expfilen.c_str()));
+      mux=std::auto_ptr<muxer>(new 
lavfmuxer("dvd",audiostreammask,*mpg,out_file.c_str()));
       break;
     case 3:
-      mux=std::auto_ptr<muxer>(new 
lavfmuxer("mpegts",audiostreammask,*mpg,expfilen.c_str()));
+      mux=std::auto_ptr<muxer>(new 
lavfmuxer("mpegts",audiostreammask,*mpg,out_file.c_str()));
       break;
     case 0:
     default:
-      mux=std::auto_ptr<muxer>(new 
mpegmuxer(audiostreammask,*mpg,expfilen.c_str()));
+      mux=std::auto_ptr<muxer>(new 
mpegmuxer(audiostreammask,*mpg,out_file.c_str()));
       break;
   }
 
   if (!mux->ready()) {
+#ifndef __WIN32__
+    if (child_pid > 0) {
+      ::close(pipe_fds[1]);
+      int wstatus;
+      while (waitpid(child_pid, &wstatus, 0)==-1 && errno==EINTR);
+    }
+#endif
     log->printerror("Unable to set up muxer!");
     if (nogui)
       delete log;
@@ -474,6 +513,13 @@
   }
 
   mux.reset();
+#ifndef __WIN32__
+  if (child_pid > 0) {
+    ::close(pipe_fds[1]);
+    int wstatus;
+    while (waitpid(child_pid, &wstatus, 0)==-1 && errno==EINTR);
+  }
+#endif
 
   log->printheading("Saved %d pictures (%02d:%02d:%02d.%03d)",savedpic,
                    int(savedtime/(3600*90000)),
diff -ur dvbcut/src/mpegmuxer.cpp dvbcut-wg/src/mpegmuxer.cpp
--- dvbcut/src/mpegmuxer.cpp    2007-11-11 20:59:10.000000000 +0100
+++ dvbcut-wg/src/mpegmuxer.cpp 2007-11-25 17:47:00.000000000 +0100
@@ -137,7 +137,10 @@
   allbuffers*=1.05; // 5% assumed muxing overhead
   ptsoffset=pts_t(90000.*(allbuffers/50./muxrate))+90;
 
-  fd=::open(filename,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0666);
+  if (!strncmp(filename, "pipe:", 5))
+    fd = atoi(filename+5);
+  else
+    fd=::open(filename,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0666);
   }
 
 mpegmuxer::~mpegmuxer()
diff -ur dvbcut/src/port.h dvbcut-wg/src/port.h
--- dvbcut/src/port.h   2007-07-28 12:57:53.000000000 +0200
+++ dvbcut-wg/src/port.h        2007-11-25 15:17:30.000000000 +0100
@@ -22,6 +22,9 @@
 #define _DVBCUT_PORT_H
 
 #include <sys/types.h>
+#ifndef __WIN32__
+#include <sys/wait.h>
+#endif
 #include <stdint.h>
 
 typedef int64_t dvbcut_off_t;


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
DVBCUT-user mailing list
DVBCUT-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dvbcut-user

Reply via email to