X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fadd_video_dialog.cc;h=126c1618126d9b10a18a30d2992227f4d891db79;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=7050c8412a295e096da75febf59f6158b2942ca5;hpb=a1429ed39f142ccf8cde558891cbe59ca97a9922;p=ardour.git diff --git a/gtk2_ardour/add_video_dialog.cc b/gtk2_ardour/add_video_dialog.cc index 7050c8412a..126c161812 100644 --- a/gtk2_ardour/add_video_dialog.cc +++ b/gtk2_ardour/add_video_dialog.cc @@ -17,8 +17,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifdef WITH_VIDEOTIMELINE - #include #include @@ -35,15 +33,15 @@ #include "ardour/session.h" #include "ardour_ui.h" -#include "utils.h" #include "add_video_dialog.h" #include "utils_videotl.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace Gtk; using namespace std; using namespace PBD; using namespace ARDOUR; +using namespace VideoUtils; #define PREVIEW_WIDTH (240) #define PREVIEW_HEIGHT (180) @@ -56,20 +54,22 @@ AddVideoDialog::AddVideoDialog (Session* s) : ArdourDialog (_("Set Video Track")) , seek_slider (0,1000,1) , preview_path ("") - , pi_duration ("-", Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false) - , pi_aspect ("-", Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false) - , pi_fps ("-", Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false) + , pi_tcin ("-", Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false) + , pi_tcout ("-", Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false) + , pi_aspect ("-", Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false) + , pi_fps ("-", Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false) , chooser (FILE_CHOOSER_ACTION_OPEN) - , xjadeo_checkbox (_("Launch External Video Monitor")) + , xjadeo_checkbox (_("Open Video Monitor Window")) , set_session_fps_checkbox (_("Adjust Session Framerate to Match Video Framerate")) , harvid_path ("") , harvid_reset (_("Reload docroot")) , harvid_list (ListStore::create(harvid_list_columns)) , harvid_list_view (harvid_list) + , show_advanced(false) + , loaded_docroot(false) { set_session (s); set_name ("AddVideoDialog"); - set_position (Gtk::WIN_POS_MOUSE); set_modal (true); set_skip_taskbar_hint (true); set_resizable (true); @@ -78,47 +78,37 @@ AddVideoDialog::AddVideoDialog (Session* s) harvid_initialized = false; std::string dstdir = video_dest_dir(_session->session_directory().video_path(), video_get_docroot(Config)); - if (Config->get_video_advanced_setup()) { - - /* Harvid Browser */ - harvid_list_view.append_column("", pixBufRenderer); - harvid_list_view.append_column(_("Filename"), harvid_list_columns.filename); - - harvid_list_view.get_column(0)->set_alignment(0.5); - harvid_list_view.get_column(0)->add_attribute(pixBufRenderer, "stock-id", harvid_list_columns.id); - harvid_list_view.get_column(1)->set_expand(true); - harvid_list_view.get_column(1)->set_sort_column(harvid_list_columns.filename); - harvid_list_view.set_enable_search(true); - harvid_list_view.set_search_column(1); + /* Harvid Browser */ + harvid_list_view.append_column("", pixBufRenderer); + harvid_list_view.append_column(_("Filename"), harvid_list_columns.filename); - harvid_list_view.get_selection()->set_mode (SELECTION_SINGLE); + harvid_list_view.get_column(0)->set_alignment(0.5); + harvid_list_view.get_column(0)->add_attribute(pixBufRenderer, "stock-id", harvid_list_columns.id); + harvid_list_view.get_column(1)->set_expand(true); + harvid_list_view.get_column(1)->set_sort_column(harvid_list_columns.filename); + harvid_list_view.set_enable_search(true); + harvid_list_view.set_search_column(1); - harvid_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &AddVideoDialog::harvid_list_view_selected)); - harvid_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &AddVideoDialog::harvid_list_view_activated)); + harvid_list_view.get_selection()->set_mode (SELECTION_SINGLE); - VBox* vbox = manage (new VBox); - Gtk::ScrolledWindow *scroll = manage(new ScrolledWindow); - scroll->add(harvid_list_view); - scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + harvid_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &AddVideoDialog::harvid_list_view_selected)); + harvid_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &AddVideoDialog::harvid_list_view_activated)); - HBox* hbox = manage (new HBox); - harvid_path.set_alignment (0, 0.5); - hbox->pack_start (harvid_path, true, true); - hbox->pack_start (harvid_reset, false, false); + Gtk::ScrolledWindow *scroll = manage(new ScrolledWindow); + scroll->add(harvid_list_view); + scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - vbox->pack_start (*hbox, false, false); - vbox->pack_start (*scroll, true, true); + HBox* hbox = manage (new HBox); + harvid_path.set_alignment (0, 0.5); + hbox->pack_start (harvid_path, true, true); + hbox->pack_start (harvid_reset, false, false); - notebook.append_page (*vbox, _("VideoServerIndex")); - } else { - /* dummy entry */ - VBox* vbox = manage (new VBox); - notebook.append_page (*vbox, _("VideoServerIndex")); - } + server_index_box.pack_start (*hbox, false, false); + server_index_box.pack_start (*scroll, true, true); /* file chooser */ chooser.set_border_width (4); -#ifdef GTKOSX +#ifdef __APPLE__ /* some broken redraw behaviour - this is a bandaid */ chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw)); #endif @@ -136,21 +126,7 @@ AddVideoDialog::AddVideoDialog (Session* s) chooser.add_filter (matchall_filter); chooser.set_select_multiple (false); - /* file import options */ - import_combo.set_name ("PaddedButton"); - import_combo.append_text(_("Reference From Current Location")); - import_combo.append_text(_("Hardlink or Copy to Session")); - import_combo.append_text(_("Transcode to Session")); - import_combo.set_active(2); - - VBox* vboxfb = manage (new VBox); - vboxfb->pack_start (chooser, true, true, 0); - vboxfb->pack_start (import_combo, false, true, 4); - - if (video_get_docroot(Config).size() > 0 && - Config->get_video_advanced_setup()) { - notebook.append_page (*vboxfb, _("Browse Files")); - } + file_chooser_box.pack_start (chooser, true, true, 0); /* Global Options*/ Gtk::Label* l; @@ -165,7 +141,7 @@ AddVideoDialog::AddVideoDialog (Session* s) /* preview pane */ VBox* previewpane = manage (new VBox); - Gtk::Table *table = manage(new Table(4,2)); + Gtk::Table *table = manage(new Table(5,2)); table->set_row_spacings(2); table->set_col_spacings(4); @@ -173,15 +149,18 @@ AddVideoDialog::AddVideoDialog (Session* s) l = manage (new Label (_("Video Information"), Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER, false)); l->set_use_markup (); table->attach (*l, 0, 2, 0, 1, FILL, FILL); - l = manage (new Label (_("Duration:"), Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false)); + l = manage (new Label (_("Start:"), Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false)); table->attach (*l, 0, 1, 1, 2, FILL, FILL); - table->attach (pi_duration, 1, 2, 1, 2, FILL, FILL); - l = manage (new Label (_("Frame rate:"), Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false)); + table->attach (pi_tcin, 1, 2, 1, 2, FILL, FILL); + l = manage (new Label (_("End:"), Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false)); table->attach (*l, 0, 1, 2, 3, FILL, FILL); - table->attach (pi_fps, 1, 2, 2, 3, FILL, FILL); - l = manage (new Label (_("Aspect Ratio:"), Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false)); + table->attach (pi_tcout, 1, 2, 2, 3, FILL, FILL); + l = manage (new Label (_("Frame rate:"), Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false)); table->attach (*l, 0, 1, 3, 4, FILL, FILL); - table->attach (pi_aspect, 1, 2, 3, 4, FILL, FILL); + table->attach (pi_fps, 1, 2, 3, 4, FILL, FILL); + l = manage (new Label (_("Aspect Ratio:"), Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER, false)); + table->attach (*l, 0, 1, 4, 5, FILL, FILL); + table->attach (pi_aspect, 1, 2, 4, 5, FILL, FILL); preview_image = manage(new Gtk::Image); @@ -190,31 +169,27 @@ AddVideoDialog::AddVideoDialog (Session* s) preview_image->set(imgbuf); seek_slider.set_draw_value(false); - HBox* hbox = manage (new HBox); + hbox = manage (new HBox); hbox->pack_start (*table, true, false); Gtk::Alignment *al = manage(new Gtk::Alignment()); al->set_size_request(-1, 20); - previewpane->pack_start (*al, false, false); - previewpane->pack_start (*hbox, true, true, 6); previewpane->pack_start (*preview_image, false, false); previewpane->pack_start (seek_slider, false, false); + previewpane->pack_start (*al, false, false); + previewpane->pack_start (*hbox, true, true, 6); + + /* Prepare Overall layout */ - /* Overall layout */ hbox = manage (new HBox); - if (Config->get_video_advanced_setup()) { - hbox->pack_start (notebook, true, true); - } else { - hbox->pack_start (*vboxfb, true, true); - } + hbox->pack_start (browser_container, true, true); hbox->pack_start (*previewpane, false, false); get_vbox()->set_spacing (4); get_vbox()->pack_start (*hbox, true, true); get_vbox()->pack_start (*options_box, false, false); - /* xjadeo checkbox */ if (ARDOUR_UI::instance()->video_timeline->found_xjadeo() /* TODO xjadeo setup w/ xjremote */ @@ -242,8 +217,6 @@ AddVideoDialog::AddVideoDialog (Session* s) notebook.signal_switch_page().connect (sigc::hide_return (sigc::hide (sigc::hide (sigc::mem_fun (*this, &AddVideoDialog::page_switch))))); seek_slider.signal_value_changed().connect(sigc::mem_fun(*this, &AddVideoDialog::seek_preview)); harvid_reset.signal_clicked().connect (sigc::mem_fun (*this, &AddVideoDialog::harvid_load_docroot)); - - show_all_children (); } AddVideoDialog::~AddVideoDialog () @@ -253,6 +226,38 @@ AddVideoDialog::~AddVideoDialog () void AddVideoDialog::on_show () { + /* overall layout depending on get_video_advanced_setup() and docroot */ + for (int i = notebook.get_n_pages(); i > 0 ; --i) { + notebook.remove_page(i); + } + if (server_index_box.get_parent()) { + server_index_box.get_parent()->remove(server_index_box); + } + if (file_chooser_box.get_parent()) { + file_chooser_box.get_parent()->remove(file_chooser_box); + } + if (notebook.get_parent()) { + notebook.get_parent()->remove(notebook); + } + + if (Config->get_video_advanced_setup()) { + notebook.append_page (server_index_box, _("VideoServerIndex")); + if (video_get_docroot(Config).size() > 0) { + notebook.append_page (file_chooser_box, _("Browse Files")); + } + browser_container.pack_start (notebook, true, true); + show_advanced = true; + if (!loaded_docroot) { + harvid_load_docroot(); + } + } else { + browser_container.pack_start (file_chooser_box, true, true); + show_advanced = false; + loaded_docroot = false; + } + + show_all_children (); + Dialog::on_show (); } @@ -264,6 +269,9 @@ static bool check_video_file_extension(std::string file) ".ogg" , ".OGG" , ".ogv" , ".OGV" , ".mpg" , ".MPG" , + ".mpeg" , ".MPEG" , + ".mts" , ".MTS" , + ".m2t" , ".M2T" , ".mov" , ".MOV" , ".mp4" , ".MP4" , ".mkv" , ".MKV" , @@ -278,6 +286,9 @@ static bool check_video_file_extension(std::string file) ".dv" , ".DV" , ".dirac" , ".DIRAC" , ".webm" , ".WEBM" , + ".wmv" , ".WMV" , + ".ts" , ".TS" , + ".mxf" , ".MXF" , }; for (size_t n = 0; n < sizeof(suffixes)/sizeof(suffixes[0]); ++n) { @@ -299,7 +310,7 @@ std::string AddVideoDialog::file_name (bool &local_file) { int n = notebook.get_current_page (); - if (n == 1 || ! Config->get_video_advanced_setup()) { + if (n == 1 || !show_advanced) { local_file = true; return chooser.get_filename(); } else { @@ -311,14 +322,19 @@ AddVideoDialog::file_name (bool &local_file) std::string video_server_url = video_get_server_url(Config); /* check if video server is running locally */ - if (video_get_docroot(Config).size() > 0 - && !video_server_url.compare(0, 16, "http://localhost")) + if (video_get_docroot(Config).size() > 0 && + (0 == video_server_url.compare (0, 16, "http://127.0.0.1") || 0 == video_server_url.compare (0, 16, "http://localhost")) + ) { /* check if the file can be accessed */ int plen; CURL *curl; curl = curl_easy_init(); char *ue = curl_easy_unescape(curl, uri.c_str(), uri.length(), &plen); +#ifdef PLATFORM_WINDOWS + char *tmp; + while ((tmp = strchr(ue, '/'))) *tmp = '\\'; +#endif std::string path = video_get_docroot(Config) + ue; if (!::access(path.c_str(), R_OK)) { uri = path; @@ -335,9 +351,8 @@ enum VtlImportOption AddVideoDialog::import_option () { int n = notebook.get_current_page (); - if (n == 0 && Config->get_video_advanced_setup()) { return VTL_IMPORT_NONE; } - int i = import_combo.get_active_row_number(); - return static_cast(i); + if (n == 0 && show_advanced) { return VTL_IMPORT_NONE; } + return VTL_IMPORT_TRANSCODE; } bool @@ -352,6 +367,15 @@ AddVideoDialog::auto_set_session_fps () return set_session_fps_checkbox.get_active(); } +void +AddVideoDialog::clear_preview_image () +{ + imgbuf->fill(RGBA_TO_UINT(0,0,0,255)); + video_draw_cross(imgbuf); + preview_image->set(imgbuf); + preview_image->show(); +} + void AddVideoDialog::set_action_ok (bool yn) { @@ -359,14 +383,12 @@ AddVideoDialog::set_action_ok (bool yn) ok_button->set_sensitive(true); } else { preview_path = ""; - pi_duration.set_text("-"); + pi_tcin.set_text("-"); + pi_tcout.set_text("-"); pi_aspect.set_text("-"); pi_fps.set_text("-"); ok_button->set_sensitive(false); - imgbuf->fill(RGBA_TO_UINT(0,0,0,255)); - video_draw_cross(imgbuf); - preview_image->set(imgbuf); - preview_image->show(); + clear_preview_image(); } } @@ -376,11 +398,11 @@ AddVideoDialog::file_selection_changed () if (chooser.get_filename().size() > 0) { std::string path = chooser.get_filename(); bool ok = - check_video_file_extension(path) - && Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_REGULAR | Glib::FILE_TEST_IS_SYMLINK) + Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_REGULAR | Glib::FILE_TEST_IS_SYMLINK) && !Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_DIR); set_action_ok(ok); if (ok) { + seek_slider.set_value(0); request_preview(video_map_path(video_get_docroot(Config), path)); } } else { @@ -395,8 +417,7 @@ AddVideoDialog::file_activated () std::string path = chooser.get_filename(); // TODO check docroot -> set import options bool ok = - check_video_file_extension(path) - && Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_REGULAR | Glib::FILE_TEST_IS_SYMLINK) + Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_REGULAR | Glib::FILE_TEST_IS_SYMLINK) && !Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_DIR); if (ok) { Gtk::Dialog::response(RESPONSE_ACCEPT); @@ -418,6 +439,7 @@ AddVideoDialog::harvid_list_view_selected () { set_action_ok(false); } else { set_action_ok(true); + seek_slider.set_value(0); request_preview((*iter)[harvid_list_columns.uri]); } } @@ -446,6 +468,7 @@ AddVideoDialog::harvid_list_view_activated (const Gtk::TreeModel::Path& path, Gt void AddVideoDialog::harvid_load_docroot() { set_action_ok(false); + loaded_docroot = true; std::string video_server_url = video_get_server_url(Config); char url[2048]; @@ -458,7 +481,7 @@ AddVideoDialog::harvid_load_docroot() { bool AddVideoDialog::page_switch() { - if (notebook.get_current_page () == 1 || Config->get_video_advanced_setup()) { + if (notebook.get_current_page () == 1 || show_advanced) { file_selection_changed(); return true; } @@ -481,7 +504,7 @@ AddVideoDialog::harvid_request(std::string u) harvid_list->clear(); - char *res = curl_http_get(url, &status); + char *res = a3_curl_http_get(url, &status); if (status != 200) { printf("request failed\n"); // XXX harvid_path.set_text(" - request failed -"); @@ -561,9 +584,12 @@ AddVideoDialog::request_preview(std::string u) printf("image preview info request failed\n"); // set_action_ok(false); // XXX only if docroot mismatch preview_path = ""; - pi_duration.set_text("-"); + pi_tcin.set_text("-"); + pi_tcout.set_text("-"); pi_aspect.set_text("-"); pi_fps.set_text("-"); + + clear_preview_image(); return; } @@ -573,9 +599,80 @@ AddVideoDialog::request_preview(std::string u) clip_height = MIN(PREVIEW_HEIGHT, rint(clip_width / video_aspect_ratio)); } - pi_duration.set_text(string_compose("%1 sec", video_duration / video_file_fps)); - pi_aspect.set_text(string_compose("%1", video_aspect_ratio)); - pi_fps.set_text(string_compose("%1 fps", video_file_fps)); + pi_tcin.set_text(Timecode::timecode_format_sampletime( + video_start_offset, video_file_fps, video_file_fps, rint(video_file_fps*100.0)==2997)); + pi_tcout.set_text(Timecode::timecode_format_sampletime( + video_start_offset + video_duration, video_file_fps, video_file_fps, rint(video_file_fps*100.0)==2997)); + + /* todo break out this code -> re-usability */ + const int arc = rint(video_aspect_ratio*100); + + switch (arc) { + case 100: + pi_aspect.set_text(X_(" 1:1")); // square (large format stills) + break; + case 125: + pi_aspect.set_text(X_(" 5:4")); + break; + case 133: + pi_aspect.set_text(X_(" 4:3")); + break; + case 134: + pi_aspect.set_text(X_(" 47:35")); // 752x560, Super8-scans + break; + case 137: + case 138: + pi_aspect.set_text(X_(" 1.37:1")); // 'Academy ratio' <= 1953 + break; + case 141: + pi_aspect.set_text(X_(" 1.41:1")); // Lichtenberg ratio + break; + case 150: + pi_aspect.set_text(X_(" 3:2")); // classic 35mm + break; + case 160: + pi_aspect.set_text(X_(" 8:5")); // credit-card size + break; + case 162: + pi_aspect.set_text(X_(" 16:10")); // golden ratio 1.61803.. + break; + case 166: + case 167: + pi_aspect.set_text(X_(" 5:3")); // Super16, EU-widescreen + break; + case 177: + case 178: + pi_aspect.set_text(X_(" 16:9")); // HD video + break; + case 180: + pi_aspect.set_text(X_(" 9:5")); + break; + case 185: + pi_aspect.set_text(X_(" 1.85:1")); // US widescreen cinema + break; + case 200: + pi_aspect.set_text(X_(" 2:1")); + break; + case 239: + case 240: + pi_aspect.set_text(X_(" 2.40:1")); // Anamorphic + break; + case 266: + case 267: + pi_aspect.set_text(X_(" 2.66:1")); // CinemaScope + break; + case 275: + pi_aspect.set_text(X_(" 2.75:1")); // Ultra Panavision + break; + case 400: + pi_aspect.set_text(X_(" 4.00:1")); // three 35mm 1.33:1 polyvision + break; + default: + pi_aspect.set_text(string_compose(X_(" %1:1"), video_aspect_ratio)); + break; + } + + pi_fps.set_text(string_compose(_(" %1 fps"), video_file_fps)); clip_xoff = (PREVIEW_WIDTH - clip_width)/2; clip_yoff = (PREVIEW_HEIGHT - clip_height)/2; @@ -587,7 +684,7 @@ AddVideoDialog::request_preview(std::string u) , (long long) (video_duration * seek_slider.get_value() / 1000.0) , clip_width, clip_height, u.c_str()); - char *data = curl_http_get(url, NULL); + char *data = a3_curl_http_get(url, NULL); if (!data) { printf("image preview request failed %s\n", url); imgbuf->fill(RGBA_TO_UINT(0,0,0,255)); @@ -606,5 +703,3 @@ AddVideoDialog::request_preview(std::string u) preview_image->set(imgbuf); preview_image->show(); } - -#endif /* WITH_VIDEOTIMELINE */