]> git.decadent.org.uk Git - videolink.git/commitdiff
Added more standard headers that are strictly required.
authorBen Hutchings <ben@decadent.org.uk>
Sun, 15 Oct 2006 00:57:16 +0000 (00:57 +0000)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 2 Nov 2008 23:58:12 +0000 (23:58 +0000)
Added explicit input frame rate to ffmpeg command line since the assumed default is 25 fps and *not* the output frame rate.
Changed menu duration to 12 frames regardless of frame rate since this *should* be legal at 29.97 fps and it seems to avoid some problematic rounding errors.

generate_dvd.cpp

index 398fdd15e1662d6a095ccc0eafb9a74e0e1247b1..64079d28ad6c406e6579cc452bb7f1ae1e364ded 100644 (file)
@@ -1,8 +1,12 @@
 // Copyright 2005-6 Ben Hutchings <ben@decadent.org.uk>.
 // See the file "COPYING" for licence details.
 
+#include <cerrno>
+#include <cstring>
 #include <fstream>
+#include <iomanip>
 #include <iostream>
+#include <ostream>
 #include <sstream>
 #include <stdexcept>
 
@@ -76,11 +80,16 @@ namespace
     // We would like to use just a single frame for the menu but this
     // seems not to be legal or compatible.  The minimum length of a
     // cell is 0.4 seconds but I've seen a static menu using 12 frames
-    // on a "PAL" disc so let's say 0.5 seconds rounded down.
-    const char menu_duration_string[] = "0.5";
+    // on a commercial "PAL" disc so let's use 12 frames regardless.
     unsigned menu_duration_frames(const video::frame_params & params)
     {
-       return params.rate_numer / params.rate_denom / 2;
+       return 12;
+    }
+    double menu_duration_seconds(const video::frame_params & params)
+    {
+       return double(menu_duration_frames(params))
+           * double(params.rate_numer)
+           / double(params.rate_denom);
     }
 }
 
@@ -212,7 +221,10 @@ void dvd_generator::generate_menu_vob(unsigned index,
                    std::string("symlink: ").append(std::strerror(errno)));
        }
        command_stream <<
-           "ffmpeg -f image2 -vcodec png -i " << background_name << "-%02d"
+           "ffmpeg -f image2 -vcodec png"
+           " -r " << frame_params_.rate_numer <<
+           "/" << frame_params_.rate_denom <<
+           " -i " << background_name << "-%02d"
            " -target " << frame_params_.common_name <<  "-dvd"
            " -vcodec mpeg2video -aspect 4:3 -an -y /dev/stdout";
     }
@@ -373,7 +385,9 @@ void dvd_generator::generate(const std::string & output_dir) const
            // Define a cell covering the whole menu and set a still
            // time at the end of that, since it seems all players
            // support that but some ignore a still time set on a PGC.
-           "          <cell start='0' end='" << menu_duration_string << "'"
+           "          <cell start='0' end='"
+            << std::fixed << std::setprecision(4)
+            << menu_duration_seconds(frame_params_) << "'"
            " chapter='yes' pause='inf'/>\n"
            "        </vob>\n";