merge from mixbus branch.
[ardour.git] / gtk2_ardour / transcode_ffmpeg.cc
index 94f8527cbbe48a16b2baa077ffdcc088d5ef40cc..b756b02618b3ce027fadb74eef42bda68cde313b 100644 (file)
@@ -96,7 +96,7 @@ TranscodeFfmpeg::probe ()
        argp[6] = 0;
        ffcmd = new ARDOUR::SystemExec(ffprobe_exe, argp);
        ffcmd->ReadStdout.connect_same_thread (*this, boost::bind (&TranscodeFfmpeg::ffprobeparse, this, _1 ,_2));
-       ffcmd->Terminated.connect_same_thread (*this, boost::bind (&TranscodeFfmpeg::ffexit, this));
+       ffcmd->Terminated.connect (*this, invalidator (*this), boost::bind (&TranscodeFfmpeg::ffexit, this), gui_context());
        if (ffcmd->start(1)) {
                ffexit();
                return false;
@@ -110,6 +110,7 @@ TranscodeFfmpeg::probe ()
        int timeout = 300; // 1.5 sec
        while (ffcmd && --timeout > 0) {
                Glib::usleep(5000);
+               ARDOUR::GUIIdle();
        }
        if (timeout == 0 || ffoutput.empty()) {
                return false;
@@ -298,7 +299,15 @@ TranscodeFfmpeg::format_metadata (std::string key, std::string value)
 
        size_t len = key.length() + v1.length() + 4;
        char *mds = (char*) calloc(len, sizeof(char));
+#ifdef PLATFORM_WINDOWS
+       /* SystemExec::make_wargs() adds quotes around the complete argument
+        * windows uses CreateProcess() with a parameter string
+        * (and not an array list of separate arguments)
+        */
+       snprintf(mds, len, "%s=%s", key.c_str(), v1.c_str());
+#else
        snprintf(mds, len, "%s=\"%s\"", key.c_str(), v1.c_str());
+#endif
        return mds;
 }
 
@@ -391,7 +400,7 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf
 
        ffcmd = new ARDOUR::SystemExec(ffmpeg_exe, argp);
        ffcmd->ReadStdout.connect_same_thread (*this, boost::bind (&TranscodeFfmpeg::ffmpegparse_v, this, _1 ,_2));
-       ffcmd->Terminated.connect_same_thread (*this, boost::bind (&TranscodeFfmpeg::ffexit, this));
+       ffcmd->Terminated.connect (*this, invalidator (*this), boost::bind (&TranscodeFfmpeg::ffexit, this), gui_context());
        if (ffcmd->start(2)) {
                ffexit();
                return false;
@@ -439,7 +448,7 @@ TranscodeFfmpeg::extract_audio (std::string outfile, ARDOUR::framecnt_t /*sample
 
        ffcmd = new ARDOUR::SystemExec(ffmpeg_exe, argp);
        ffcmd->ReadStdout.connect_same_thread (*this, boost::bind (&TranscodeFfmpeg::ffmpegparse_a, this, _1 ,_2));
-       ffcmd->Terminated.connect_same_thread (*this, boost::bind (&TranscodeFfmpeg::ffexit, this));
+       ffcmd->Terminated.connect (*this, invalidator (*this), boost::bind (&TranscodeFfmpeg::ffexit, this), gui_context());
        if (ffcmd->start(2)) {
                ffexit();
                return false;
@@ -470,7 +479,7 @@ TranscodeFfmpeg::transcode (std::string outfile, const int outw, const int outh,
        if (bitrate < 10)  bitrate = 10;
        if (bitrate > 1000) bitrate = 1000;
 
-       argp=(char**) calloc(15,sizeof(char*));
+       argp=(char**) calloc(16,sizeof(char*));
        argp[0] = strdup(ffmpeg_exe.c_str());
        argp[1] = strdup("-i");
        argp[2] = strdup(infile.c_str());
@@ -480,17 +489,18 @@ TranscodeFfmpeg::transcode (std::string outfile, const int outw, const int outh,
        argp[6] = (char*) calloc(10,sizeof(char)); snprintf(argp[6], 10, "%ix%i", width, height);
        argp[7] = strdup("-y");
        argp[8] = strdup("-vcodec");
-       argp[9] = strdup("mpeg4");
+       argp[9] = strdup("mjpeg");
        argp[10] = strdup("-an");
-       argp[11] = strdup("-keyint_min");
-       argp[12] = strdup("10");
-       argp[13] = strdup(outfile.c_str());
-       argp[14] = (char *)0;
+       argp[11] = strdup("-intra");
+       argp[12] = strdup("-g");
+       argp[13] = strdup("1");
+       argp[14] = strdup(outfile.c_str());
+       argp[15] = (char *)0;
        /* Note: these are free()d in ~SystemExec */
 #if 1 /* DEBUG */
        if (debug_enable) { /* tentative debug mode */
        printf("TRANSCODE VIDEO:\n");
-       for (int i=0; i< 14; ++i) {
+       for (int i=0; i< 15; ++i) {
          printf("%s ", argp[i]);
        }
        printf("\n");
@@ -498,7 +508,7 @@ TranscodeFfmpeg::transcode (std::string outfile, const int outw, const int outh,
 #endif
        ffcmd = new ARDOUR::SystemExec(ffmpeg_exe, argp);
        ffcmd->ReadStdout.connect_same_thread (*this, boost::bind (&TranscodeFfmpeg::ffmpegparse_v, this, _1 ,_2));
-       ffcmd->Terminated.connect_same_thread (*this, boost::bind (&TranscodeFfmpeg::ffexit, this));
+       ffcmd->Terminated.connect (*this, invalidator (*this), boost::bind (&TranscodeFfmpeg::ffexit, this), gui_context());
        if (ffcmd->start(2)) {
                ffexit();
                return false;