- quantise_rgba_pixbuf(state->diff_pixbuf, dvd::button_n_colours);
-
- std::cout << "saving " << state->links_temp.get_name()
- << std::endl;
- state->diff_pixbuf->save(state->links_temp.get_name(), "png");
-
- state->spumux_file <<
- " </spu>\n"
- " </stream>\n"
- "</subpictures>\n";
-
- state->spumux_file.close();
-
- // TODO: if (!state->spumux_file) throw ...
-
- {
- std::ostringstream command_stream;
- if (encoder_ == mpeg_encoder_ffmpeg)
- {
- command_stream
- << "ffmpeg"
- << " -f image2 -vcodec png -i "
- << background_temp_->get_name()
- << " -target " << frame_params_.ffmpeg_name << "-dvd"
- << " -vcodec mpeg2video -an -y /dev/stdout"
- << " | spumux -v0 -mdvd " << state->spumux_temp.get_name()
- << " > " << contents_.menus[menu_num].vob_temp->get_name();
- }
- else
- {
- assert(encoder_ == mpeg_encoder_mjpegtools_old
- || encoder_ == mpeg_encoder_mjpegtools_new);
- command_stream
- << "pngtopnm "
- << background_temp_->get_name()
- << " | ppmtoy4m -v0 -n1 -F"
- << frame_params_.rate_numer
- << ":" << frame_params_.rate_denom
- << " -A" << frame_params_.pixel_ratio_width
- << ":" << frame_params_.pixel_ratio_height
- << " -Ip ";
- // The chroma subsampling keywords changed between
- // versions 1.6.2 and 1.8 of mjpegtools. There is no
- // keyword that works with both.
- if (encoder_ == mpeg_encoder_mjpegtools_old)
- command_stream << "-S420_mpeg2";
- else
- command_stream << "-S420mpeg2";
- command_stream
- << (" | mpeg2enc -v0 -f8 -a2 -o/dev/stdout"
- " | mplex -v0 -f8 -o/dev/stdout /dev/stdin"
- " | spumux -v0 -mdvd ")
- << state->spumux_temp.get_name()
- << " > "
- << contents_.menus[menu_num].vob_temp->get_name();
- }
- std::string command(command_stream.str());
- const char * argv[] = {
- "/bin/sh", "-c", command.c_str(), 0
- };
- std::cout << "running " << argv[2] << std::endl;
- int command_result;
- Glib::spawn_sync(".",
- Glib::ArrayHandle<std::string>(
- argv, sizeof(argv)/sizeof(argv[0]),
- Glib::OWNERSHIP_NONE),
- Glib::SPAWN_STDOUT_TO_DEV_NULL,
- SigC::Slot0<void>(),
- 0, 0,
- &command_result);
- if (command_result != 0)
- throw std::runtime_error("spumux pipeline failed");
- }