X-Git-Url: https://git.decadent.org.uk/gitweb/?p=videolink.git;a=blobdiff_plain;f=generate_dvd.cpp;h=371894d41edc23abd7ac34abee8337fd52b64711;hp=2fa3388d6bb1e5c6b6e1e8d3c1835ba4d095b0cc;hb=HEAD;hpb=84fb85103e80499cc8dc7929375e9a1798e043da diff --git a/generate_dvd.cpp b/generate_dvd.cpp index 2fa3388..371894d 100644 --- a/generate_dvd.cpp +++ b/generate_dvd.cpp @@ -1,6 +1,7 @@ -// Copyright 2005-6 Ben Hutchings . +// Copyright 2005-8 Ben Hutchings . // See the file "COPYING" for licence details. +#include #include #include #include @@ -10,6 +11,10 @@ #include #include +#include +#include +#include + #include #include #include @@ -161,12 +166,12 @@ void dvd_generator::generate_menu_vob(unsigned index, std::string background_name( temp_file_name(temp_dir_, "menu-%3d-back.png", 1 + index)); - std::cout << "saving " << background_name << std::endl; + std::cout << "INFO: Saving " << background_name << std::endl; background->save(background_name, "png"); std::string highlights_name( temp_file_name(temp_dir_, "menu-%3d-links.png", 1 + index)); - std::cout << "saving " << highlights_name << std::endl; + std::cout << "INFO: Saving " << highlights_name << std::endl; highlights->save(highlights_name, "png"); std::string spumux_name( @@ -211,11 +216,15 @@ void dvd_generator::generate_menu_vob(unsigned index, } } } + // Pad vertically to even y coordinates since dvdauthor claims + // odd values may result in incorrect display. + // XXX This may cause overlappping where it wasn't previously + // a problem. spumux_file << " " << temp_file_name(temp_dir_, "menu-%3d.mpeg", 1 + index); + << " | spumux -v0 -mdvd " << spumux_name << " > " << output_name; std::string command(command_stream.str()); const char * argv[] = { "/bin/sh", "-c", command.c_str(), 0 }; - std::cout << "running " << command << std::endl; + std::cout << "INFO: Running " << command << std::endl; int command_result; Glib::spawn_sync(".", Glib::ArrayHandle( argv, sizeof(argv)/sizeof(argv[0]), Glib::OWNERSHIP_NONE), Glib::SPAWN_STDOUT_TO_DEV_NULL, - SigC::Slot0(), + sigc::slot(), 0, 0, &command_result); - if (command_result != 0) + struct stat stat_buf; + if (command_result != 0 || stat(output_name.c_str(), &stat_buf) != 0 + || stat_buf.st_size == 0) throw std::runtime_error("spumux pipeline failed"); } @@ -366,14 +360,16 @@ void dvd_generator::generate(const std::string & output_dir) const const bool have_real_menus = titleset_num * dvdauthor_anonymous_menus_max < menus_.size(); - file << " <" << outer_element_name << ">\n" - << " \n"; + file << " <" << outer_element_name << ">\n" << + " \n" + "