X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_player.cc;h=0f1ed00b32f901fb544662978d3c2dbd9aca703c;hb=1f1661f36ffd7a5662847f0642c7a7ebdcadc0f0;hp=8329f1d8655393df71e50d8dd8bc16d3ef38b86d;hpb=39a7a8be0bdb499423f96aa23ed3bffdc7d6c912;p=dcpomatic.git diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index 8329f1d86..0f1ed00b3 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -136,7 +136,7 @@ public: #endif _config_changed_connection = Config::instance()->Changed.connect (boost::bind (&DOMFrame::config_changed, this)); - config_changed (); + update_from_config (); Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_open, this), ID_file_open); Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_add_ov, this), ID_file_add_ov); @@ -170,7 +170,7 @@ public: _viewer->Seeked.connect (bind(&DOMFrame::playback_seeked, this, _1)); _viewer->Stopped.connect (bind(&DOMFrame::playback_stopped, this, _1)); _info = new PlayerInformation (_overall_panel, _viewer); - setup_main_sizer (true); + setup_main_sizer (Config::instance()->player_mode()); #ifdef __WXOSX__ int accelerators = 4; #else @@ -193,19 +193,18 @@ public: Bind (wxEVT_MENU, boost::bind (&DOMFrame::forward_frame, this), ID_forward_frame); UpdateChecker::instance()->StateChanged.connect (boost::bind (&DOMFrame::update_checker_state_changed, this)); - _controls->DCPDirectorySelected.connect (boost::bind(&DOMFrame::load_dcp, this, _1)); - _controls->DCPEjected.connect (boost::bind(&DOMFrame::eject_dcp, this)); + _controls->SPLChanged.connect (boost::bind(&DOMFrame::set_spl, this, _1)); setup_screen (); } - void setup_main_sizer (bool with_viewer) + void setup_main_sizer (Config::PlayerMode mode) { wxSizer* main_sizer = new wxBoxSizer (wxVERTICAL); - if (with_viewer) { + if (mode != Config::PLAYER_MODE_DUAL) { main_sizer->Add (_viewer->panel(), 1, wxEXPAND | wxALIGN_CENTER_VERTICAL); } - main_sizer->Add (_controls, 0, wxEXPAND | wxALL, 6); + main_sizer->Add (_controls, mode == Config::PLAYER_MODE_DUAL ? 1 : 0, wxEXPAND | wxALL, 6); main_sizer->Add (_info, 0, wxEXPAND | wxALL, 6); _overall_panel->SetSizer (main_sizer); _overall_panel->Layout (); @@ -293,105 +292,157 @@ public: Config::instance()->set_decode_reduction (reduction); } - void eject_dcp () + void load_dcp (boost::filesystem::path dir) { - _film.reset (new Film (optional())); - _viewer->set_film (_film); - _info->triggered_update (); + list spl; + spl.push_back (SPLEntry(dir)); + set_spl (spl); + Config::instance()->add_to_player_history (dir); } - void load_dcp (boost::filesystem::path dir) + optional get_kdm_from_url (shared_ptr dcp) { - _film.reset (new Film (optional())); - shared_ptr dcp; - try { - dcp.reset (new DCPContent (_film, dir)); - } catch (boost::filesystem::filesystem_error& e) { - error_dialog (this, _("Could not load DCP"), std_to_wx (e.what())); - return; + ScopedTemporary temp; + string url = Config::instance()->kdm_server_url(); + boost::algorithm::replace_all (url, "{CPL}", *dcp->cpl()); + optional kdm; + if (dcp->cpl() && !get_from_url(url, false, temp)) { + try { + kdm = dcp::EncryptedKDM (dcp::file_to_string(temp.file())); + if (kdm->cpl_id() != dcp->cpl()) { + kdm = boost::none; + } + } catch (std::exception& e) { + /* Hey well */ + } } + return kdm; + } - _film->examine_and_add_content (dcp, true); - bool const ok = progress (_("Loading DCP")); - if (!ok || !report_errors_from_last_job()) { - return; + optional get_kdm_from_directory (shared_ptr dcp) + { + using namespace boost::filesystem; + optional kdm_dir = Config::instance()->player_kdm_directory(); + if (!kdm_dir) { + return optional(); } - - /* The DCP has been examined and loaded */ - - optional kdm_dir = Config::instance()->player_kdm_directory(); - if (dcp->needs_kdm() && kdm_dir) { - /* Look for a KDM */ - - optional kdm; - - ScopedTemporary temp; - string url = Config::instance()->kdm_server_url(); - boost::algorithm::replace_all (url, "{CPL}", "%1"); - if (dcp->cpl() && !get_from_url(String::compose(url, *dcp->cpl()), false, temp)) { + for (directory_iterator i = directory_iterator(*kdm_dir); i != directory_iterator(); ++i) { + if (file_size(i->path()) < MAX_KDM_SIZE) { try { - kdm = dcp::EncryptedKDM (dcp::file_to_string(temp.file())); - if (kdm->cpl_id() != dcp->cpl()) { - kdm = boost::none; + dcp::EncryptedKDM kdm (dcp::file_to_string(i->path())); + if (kdm.cpl_id() == dcp->cpl()) { + return kdm; } } catch (std::exception& e) { /* Hey well */ } } + } + return optional(); + } - if (!kdm) { - using namespace boost::filesystem; - for (directory_iterator i = directory_iterator(*kdm_dir); i != directory_iterator(); ++i) { - if (file_size(i->path()) < MAX_KDM_SIZE) { - try { - kdm = dcp::EncryptedKDM(dcp::file_to_string(i->path())); - if (kdm->cpl_id() == dcp->cpl()) { - break; - } - } catch (std::exception& e) { - /* Hey well */ - } - } - } + void set_spl (list spl) + { + if (_viewer->playing ()) { + _viewer->stop (); + } + + _film.reset (new Film (optional())); + + if (spl.empty ()) { + _viewer->set_film (_film); + _info->triggered_update (); + return; + } + + /* Start off as Flat */ + _film->set_container (Ratio::from_id("185")); + + DCPTime position; + shared_ptr first; + + BOOST_FOREACH (SPLEntry i, spl) { + shared_ptr dcp; + try { + dcp.reset (new DCPContent (_film, i.dcp)); + } catch (boost::filesystem::filesystem_error& e) { + error_dialog (this, _("Could not load DCP"), std_to_wx (e.what())); + return; } - if (kdm) { - dcp->add_kdm (*kdm); - dcp->examine (shared_ptr()); + if (!first) { + first = dcp; } - } - setup_from_dcp (dcp); + _film->examine_and_add_content (dcp, true); + bool const ok = progress (_("Loading DCP")); + if (!ok || !report_errors_from_last_job()) { + return; + } - if (dcp->three_d()) { - _film->set_three_d (true); - } + dcp->set_position (position + i.black_before); + position += dcp->length_after_trim() + i.black_before; - _viewer->set_film (_film); - _viewer->seek (DCPTime(), true); - _info->triggered_update (); + /* This DCP has been examined and loaded */ - Config::instance()->add_to_player_history (dir); + if (dcp->needs_kdm()) { + optional kdm; +#ifdef DCPOMATIC_VARIANT_SWAROOP + kdm = get_kdm_from_url (dcp); +#endif + if (!kdm) { + get_kdm_from_directory (dcp); + } - set_menu_sensitivity (); + if (kdm) { + dcp->add_kdm (*kdm); + dcp->examine (shared_ptr()); + } + } + + BOOST_FOREACH (shared_ptr j, dcp->text) { + j->set_use (true); + } + + if (dcp->video) { + Ratio const * r = Ratio::nearest_from_ratio(dcp->video->size().ratio()); + if (r->id() == "239") { + /* Any scope content means we use scope */ + _film->set_container(r); + } + } + + /* Any 3D content means we use 3D mode */ + if (dcp->three_d()) { + _film->set_three_d (true); + } + + _viewer->set_film (_film); + _viewer->seek (DCPTime(), true); + _info->triggered_update (); + + set_menu_sensitivity (); + _controls->log (wxString::Format(_("Load DCP %s"), i.dcp.filename().string().c_str())); + } wxMenuItemList old = _cpl_menu->GetMenuItems(); for (wxMenuItemList::iterator i = old.begin(); i != old.end(); ++i) { _cpl_menu->Remove (*i); } - DCPExaminer ex (dcp); - int id = ID_view_cpl; - BOOST_FOREACH (shared_ptr i, ex.cpls()) { - wxMenuItem* j = _cpl_menu->AppendRadioItem( - id, - wxString::Format("%s (%s)", std_to_wx(i->annotation_text()).data(), std_to_wx(i->id()).data()) - ); - j->Check(!dcp->cpl() || i->id() == *dcp->cpl()); - ++id; + if (spl.size() == 1) { + /* Offer a CPL menu */ + DCPExaminer ex (first); + int id = ID_view_cpl; + BOOST_FOREACH (shared_ptr i, ex.cpls()) { + wxMenuItem* j = _cpl_menu->AppendRadioItem( + id, + wxString::Format("%s (%s)", std_to_wx(i->annotation_text()).data(), std_to_wx(i->id()).data()) + ); + j->Check(!first->cpl() || i->id() == *first->cpl()); + ++id; + } } - - _controls->log (wxString::Format(_("Load DCP %s"), dir.filename().string().c_str())); } private: @@ -416,12 +467,14 @@ private: #endif #ifdef __WXOSX__ - _file_menu->Append (wxID_PREFERENCES, _("&Preferences...\tCtrl-P")); + wxMenuItem* prefs = _file_menu->Append (wxID_PREFERENCES, _("&Preferences...\tCtrl-P")); #else wxMenu* edit = new wxMenu; - edit->Append (wxID_PREFERENCES, _("&Preferences...\tCtrl-P")); + wxMenuItem* prefs = edit->Append (wxID_PREFERENCES, _("&Preferences...\tCtrl-P")); #endif + prefs->Enable (Config::instance()->have_write_permission()); + _cpl_menu = new wxMenu; wxMenu* view = new wxMenu; @@ -520,7 +573,15 @@ private: if (!ok || !report_errors_from_last_job()) { return; } - setup_from_dcp (dcp); + BOOST_FOREACH (shared_ptr i, dcp->text) { + i->set_use (true); + } + if (dcp->video) { + Ratio const * r = Ratio::nearest_from_ratio(dcp->video->size().ratio()); + if (r) { + _film->set_container(r); + } + } } c->Destroy (); @@ -573,6 +634,10 @@ private: void edit_preferences () { + if (!Config::instance()->have_write_permission()) { + return; + } + if (!_config_dialog) { _config_dialog = create_player_config_dialog (); } @@ -665,7 +730,7 @@ private: } } - setup_main_sizer (_mode != Config::PLAYER_MODE_DUAL); + setup_main_sizer (_mode); } void view_closed_captions () @@ -749,16 +814,26 @@ private: /* Instantly save any config changes when using the player GUI */ try { Config::instance()->write_config(); - } catch (exception& e) { + } catch (FileError& e) { error_dialog ( this, - wxString::Format ( + wxString::Format( _("Could not write to config file at %s. Your changes have not been saved."), - std_to_wx (Config::instance()->cinemas_file().string()).data() + std_to_wx(e.file().string()) ) ); + } catch (exception& e) { + error_dialog ( + this, + _("Could not write to config file. Your changes have not been saved.") + ); } + update_from_config (); + } + + void update_from_config () + { for (int i = 0; i < _history_items; ++i) { delete _file_menu->Remove (ID_file_history + i); } @@ -859,20 +934,6 @@ private: return true; } - void setup_from_dcp (shared_ptr dcp) - { - BOOST_FOREACH (shared_ptr i, dcp->text) { - i->set_use (true); - } - - if (dcp->video) { - Ratio const * r = Ratio::nearest_from_ratio(dcp->video->size().ratio()); - if (r) { - _film->set_container(r); - } - } - } - wxFrame* _dual_screen; bool _update_news_requested; PlayerInformation* _info;