X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=webdvd.cpp;h=9063bce42befa3a31fb20abce50d029d67162484;hb=ab30f1996d97f10d243b7075021840c37ae8238a;hp=10289999bf8dbe71761dd027fa6de0768903ed70;hpb=f27d045785151cd33fb5146cf2b7cbabf864e48a;p=videolink.git diff --git a/webdvd.cpp b/webdvd.cpp index 1028999..9063bce 100644 --- a/webdvd.cpp +++ b/webdvd.cpp @@ -1,4 +1,4 @@ -// Copyright 2005-6 Ben Hutchings . +// Copyright 2005-6 Ben Hutchings . // See the file "COPYING" for licence details. #include @@ -71,7 +71,7 @@ namespace // We can try using any of these encoders to convert PNG to MPEG. enum mpeg_encoder { - mpeg_encoder_ffmpeg, // ffmpeg - doesn't work yet + mpeg_encoder_ffmpeg, // ffmpeg mpeg_encoder_mjpegtools_old, // mjpegtools before version 1.8 mpeg_encoder_mjpegtools_new // mjpegtools from version 1.8 }; @@ -169,6 +169,7 @@ namespace dvd_contents::pgc_ref add_menu(const std::string & uri); dvd_contents::pgc_ref add_title(const std::string & uri); void load_next_page(); + bool on_idle(); void on_net_state_change(const char * uri, gint flags, guint status); bool browser_is_busy() const { @@ -220,11 +221,12 @@ namespace add(browser_widget_); browser_widget_.show(); + Glib::signal_idle().connect( + SigC::slot(*this, &webdvd_window::on_idle)); browser_widget_.signal_net_state().connect( SigC::slot(*this, &webdvd_window::on_net_state_change)); add_menu(main_page_uri); - load_next_page(); } bool webdvd_window::is_finished() const @@ -302,6 +304,12 @@ namespace browser_widget_.load_uri(uri); } + bool webdvd_window::on_idle() + { + load_next_page(); + return false; // don't call again thankyou + } + void webdvd_window::on_net_state_change(const char * uri, gint flags, guint status) { @@ -753,7 +761,7 @@ namespace << "ffmpeg" << " -f image2 -vcodec png -i " << background_temp_->get_name() - << " -target " << frame_params_.name << "-dvd" + << " -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(); @@ -808,22 +816,19 @@ namespace const video::frame_params & lookup_frame_params(const char * str) { assert(str); - static const struct { const char * str; bool is_ntsc; } - known_strings[] = { - { "NTSC", true }, - { "ntsc", true }, - { "PAL", false }, - { "pal", false }, - // For DVD purposes, SECAM can be treated identically to PAL. - { "SECAM", false }, - { "secam", false } + static const char * const known_strings[] = { + "525", "625", + "525/60", "625/50", + "NTSC", "PAL", + "ntsc", "pal" }; for (std::size_t i = 0; i != sizeof(known_strings)/sizeof(known_strings[0]); ++i) - if (std::strcmp(str, known_strings[i].str) == 0) - return known_strings[i].is_ntsc ? - video::ntsc_params : video::pal_params; + if (std::strcmp(str, known_strings[i]) == 0) + return (i & 1) + ? video::frame_params_625 + : video::frame_params_525; throw std::runtime_error( std::string("Invalid video standard: ").append(str)); } @@ -832,7 +837,8 @@ namespace { stream << "Usage: " << command_name << " [gtk-options] [--preview]\n" - " [--video-std {ntsc|pal|secam}]\n" + " [--video-std {525|525/60|NTSC|ntsc" + " | 625|625/50|PAL|pal}]\n" " [--encoder {mjpegtools|mjpegtools-old}]\n" " menu-url [output-dir]\n"; } @@ -862,9 +868,9 @@ namespace // ranging from 10 to 25 inches wide, for a resolution of // 24-60 dpi. I therefore declare the average horizontal // resolution to be 40 dpi. The vertical resolution will be - // slightly higher (PAL/SECAM) or lower (NTSC), but - // unfortunately Mozilla doesn't support non-square pixels - // (and neither do fontconfig or Xft anyway). + // slightly different but unfortunately Mozilla doesn't + // support non-square pixels (and neither do fontconfig or Xft + // anyway). check(pref_service->GetDefaultBranch("browser.display", getter_AddRefs(pref_branch))); check(pref_branch->SetIntPref("screen_resolution", 40)); @@ -882,11 +888,11 @@ int main(int argc, char ** argv) { try { - video::frame_params frame_params = video::pal_params; + video::frame_params frame_params = video::frame_params_625; bool preview_mode = false; std::string menu_url; std::string output_dir; - mpeg_encoder encoder = mpeg_encoder_mjpegtools_new; + mpeg_encoder encoder = mpeg_encoder_ffmpeg; // Do initial option parsing. We have to do this before // letting Gtk parse the arguments since we may need to spawn @@ -1035,7 +1041,9 @@ int main(int argc, char ** argv) // Run the browser/converter webdvd_window window(frame_params, menu_url, output_dir, encoder); - Gtk::Main::run(window); + window.show(); + window.signal_hide().connect(SigC::slot(&Gtk::Main::quit)); + Gtk::Main::run(); return ((preview_mode || window.is_finished()) ? EXIT_SUCCESS