]> git.decadent.org.uk Git - videolink.git/blobdiff - webdvd.cpp
Changed video standard nomenclature to be completely pedantic.
[videolink.git] / webdvd.cpp
index 5fd5e6ff8774a34bbb70345a2c8d32e5af05da3b..9063bce42befa3a31fb20abce50d029d67162484 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2005-6 Ben Hutchings <ben@decadentplace.org.uk>.
+// Copyright 2005-6 Ben Hutchings <ben@decadent.org.uk>.
 // See the file "COPYING" for licence details.
 
 #include <cassert>
@@ -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,9 +837,10 @@ 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");
+           "           menu-url [output-dir]\n";
     }
     
     void set_browser_preferences()
@@ -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