From 9b577fb38b51ccfa1229ceabaf12088c6c9b81e0 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 10 Apr 2013 15:11:40 +0100 Subject: Updated sv_SE from Adam. --- src/lib/po/sv_SE.po | 8 +++----- src/tools/po/sv_SE.po | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/lib/po/sv_SE.po b/src/lib/po/sv_SE.po index d574261c8..ef8109dfa 100644 --- a/src/lib/po/sv_SE.po +++ b/src/lib/po/sv_SE.po @@ -8,10 +8,9 @@ msgstr "" "Project-Id-Version: DVD-o-matic\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-04-09 11:14+0100\n" -"PO-Revision-Date: 2013-04-09 10:13+0100\n" +"PO-Revision-Date: 2013-04-10 15:35+0100\n" "Last-Translator: Adam Klotblixt \n" "Language-Team: \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -50,9 +49,8 @@ msgid "16:9 within Flat" msgstr "16:9 innanför Flat" #: src/lib/format.cc:115 -#, fuzzy msgid "16:9 within Scope" -msgstr "16:9 innanför Flat" +msgstr "16:9 innanför Scope" #: src/lib/filter.cc:88 msgid "3D denoiser" @@ -76,7 +74,7 @@ msgstr "Reklam" #: src/lib/job.cc:72 msgid "An error occurred whilst handling the file %1." -msgstr "Ett fel inträffade vid hantering av filen (%1)" +msgstr "Ett fel inträffade vid hantering av filen %1" #: src/lib/analyse_audio_job.cc:49 msgid "Analyse audio of %1" diff --git a/src/tools/po/sv_SE.po b/src/tools/po/sv_SE.po index 57254770c..28566d876 100644 --- a/src/tools/po/sv_SE.po +++ b/src/tools/po/sv_SE.po @@ -107,8 +107,8 @@ msgid "S&how DCP" msgstr "&Visa DCP" #: src/tools/dvdomatic.cc:74 -msgid "Save changes to film \"%s\" before closing?" -msgstr "Spara ändringarna till filmen \"%s\" före avslut?" +msgid "Save changes to film \"%1\" before closing?" +msgstr "Spara ändringarna till filmen \"%1\" före avslut?" #: src/tools/dvdomatic.cc:319 msgid "Select film to open" -- cgit v1.2.3 From 8e61be024ddc5a7a6bf03b0c1c71e2add97db965 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 13 Apr 2013 21:00:22 +0100 Subject: Some logging. --- src/tools/dvdomatic.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index 212d4848e..b09f4e554 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -458,14 +458,21 @@ setup_i18n () { int language = wxLANGUAGE_DEFAULT; + ofstream f ("c:/users/carl/foo", ios::app); + f << "Hello.\n"; + if (Config::instance()->language()) { + f << "Configured language " << Config::instance()->language().get() << "\n"; wxLanguageInfo const * li = wxLocale::FindLanguageInfo (std_to_wx (Config::instance()->language().get())); + f << "LanguageInfo " << li << "\n"; if (li) { language = li->Language; + f << "language=" << language << " cf " << wxLANGUAGE_DEFAULT << " " << wxLANGUAGE_ENGLISH << "\n"; } } if (wxLocale::IsAvailable (language)) { + f << "Language is available.\n"; locale = new wxLocale (language, wxLOCALE_LOAD_DEFAULT); #ifdef DVDOMATIC_WINDOWS @@ -476,6 +483,7 @@ setup_i18n () locale->AddCatalog (wxT ("dvdomatic")); if (!locale->IsOk()) { + f << "Locale is not ok.\n"; delete locale; locale = new wxLocale (wxLANGUAGE_ENGLISH); language = wxLANGUAGE_ENGLISH; -- cgit v1.2.3 From 784c560e3437136d6006f8df2fb35f41585b6a8d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 13 Apr 2013 21:24:18 +0100 Subject: Use film-name-derived names for MXFs in DCPs. --- src/lib/film.cc | 32 ++++++++++++++++++++++++++++++-- src/lib/film.h | 8 ++++++-- src/lib/writer.cc | 18 +++++++++--------- test/test.cc | 2 +- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/lib/film.cc b/src/lib/film.cc index bd11c1eb5..077c9e17f 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -232,18 +232,46 @@ Film::info_dir () const } string -Film::video_mxf_dir () const +Film::internal_video_mxf_dir () const { boost::filesystem::path p; return dir ("video"); } string -Film::video_mxf_filename () const +Film::internal_video_mxf_filename () const { return video_state_identifier() + ".mxf"; } +string +Film::dcp_video_mxf_filename () const +{ + return filename_safe_name() + "_video.mxf"; +} + +string +Film::dcp_audio_mxf_filename () const +{ + return filename_safe_name() + "_audio.mxf"; +} + +string +Film::filename_safe_name () const +{ + string const n = name (); + string o; + for (size_t i = 0; i < n.length(); ++i) { + if (isalnum (n[i])) { + o += n[i]; + } else { + o += "_"; + } + } + + return o; +} + string Film::audio_analysis_path () const { diff --git a/src/lib/film.h b/src/lib/film.h index adc4b0eec..a5a8ac5fa 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -64,10 +64,13 @@ public: std::string info_dir () const; std::string j2c_path (int f, bool t) const; std::string info_path (int f) const; - std::string video_mxf_dir () const; - std::string video_mxf_filename () const; + std::string internal_video_mxf_dir () const; + std::string internal_video_mxf_filename () const; std::string audio_analysis_path () const; + std::string dcp_video_mxf_filename () const; + std::string dcp_audio_mxf_filename () const; + void examine_content (); void analyse_audio (); void send_dcp_to_tms (); @@ -387,6 +390,7 @@ private: void examine_content_finished (); void analyse_audio_finished (); std::string video_state_identifier () const; + std::string filename_safe_name () const; /** Complete path to directory containing the film metadata; * must not be relative. diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 2d7ee9ba3..c6ce4711d 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -65,8 +65,8 @@ Writer::Writer (shared_ptr f) _picture_asset.reset ( new libdcp::MonoPictureAsset ( - _film->video_mxf_dir (), - _film->video_mxf_filename (), + _film->internal_video_mxf_dir (), + _film->internal_video_mxf_filename (), _film->dcp_frame_rate (), _film->format()->dcp_size () ) @@ -80,7 +80,7 @@ Writer::Writer (shared_ptr f) _sound_asset.reset ( new libdcp::SoundAsset ( _film->dir (_film->dcp_name()), - N_("audio.mxf"), + _film->dcp_audio_mxf_filename (), _film->dcp_frame_rate (), m.dcp_channels (), dcp_audio_sample_rate (_film->audio_stream()->sample_rate()) @@ -267,12 +267,12 @@ Writer::finish () /* Hard-link the video MXF into the DCP */ boost::filesystem::path from; - from /= _film->video_mxf_dir(); - from /= _film->video_mxf_filename(); + from /= _film->internal_video_mxf_dir(); + from /= _film->internal_video_mxf_filename(); boost::filesystem::path to; to /= _film->dir (_film->dcp_name()); - to /= N_("video.mxf"); + to /= _film->dcp_video_mxf_filename (); boost::system::error_code ec; boost::filesystem::create_hard_link (from, to, ec); @@ -285,7 +285,7 @@ Writer::finish () /* And update the asset */ _picture_asset->set_directory (_film->dir (_film->dcp_name ())); - _picture_asset->set_file_name (N_("video.mxf")); + _picture_asset->set_file_name (_film->dcp_video_mxf_filename ()); if (_sound_asset) { _sound_asset->set_entry_point (_film->trim_start ()); @@ -339,8 +339,8 @@ Writer::check_existing_picture_mxf () { /* Try to open the existing MXF */ boost::filesystem::path p; - p /= _film->video_mxf_dir (); - p /= _film->video_mxf_filename (); + p /= _film->internal_video_mxf_dir (); + p /= _film->internal_video_mxf_filename (); FILE* mxf = fopen (p.string().c_str(), N_("rb")); if (!mxf) { return; diff --git a/test/test.cc b/test/test.cc index d1bb400f9..6fad0986b 100644 --- a/test/test.cc +++ b/test/test.cc @@ -504,7 +504,7 @@ BOOST_AUTO_TEST_CASE (have_dcp_test) BOOST_CHECK (f.have_dcp()); p /= f.dcp_name(); - p /= "video.mxf"; + p /= f.dcp_video_mxf_filename(); boost::filesystem::remove (p); BOOST_CHECK (!f.have_dcp ()); } -- cgit v1.2.3 From 926324a7747c22322ffd7963a85ab7184d3662b5 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 13 Apr 2013 21:24:45 +0100 Subject: ChangeLog. --- ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ChangeLog b/ChangeLog index 833aa085d..a414cf32d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-04-13 Carl Hetherington + + * Use film-name-derived names for MXFs in DCPs (#54). + 2013-04-10 Carl Hetherington * Version 0.83 released. -- cgit v1.2.3 From b8d4a4326e8dae1bd1b850e6798cda9c6c319c91 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 13 Apr 2013 21:27:00 +0100 Subject: Missing using. --- src/tools/dvdomatic.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index b09f4e554..70a96866c 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -52,6 +52,7 @@ using std::stringstream; using std::map; using std::make_pair; using std::exception; +using std::ofstream; using boost::shared_ptr; static FilmEditor* film_editor = 0; -- cgit v1.2.3 From ea7b50b1b1f42e3a722f2efdca6fa2c3184d2105 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 14 Apr 2013 01:17:14 +0100 Subject: UI and basic back-end state for trim type. --- src/lib/film.cc | 26 ++++++++++++++ src/lib/film.h | 13 +++++++ src/wx/film_editor.cc | 93 ++++++++++++++++++++++++++++----------------------- src/wx/film_editor.h | 4 +-- 4 files changed, 92 insertions(+), 44 deletions(-) diff --git a/src/lib/film.cc b/src/lib/film.cc index 077c9e17f..a42b874e8 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -93,6 +93,7 @@ Film::Film (string d, bool must_exist) , _scaler (Scaler::from_id ("bicubic")) , _trim_start (0) , _trim_end (0) + , _trim_type (CPL) , _dcp_ab (false) , _use_content_audio (true) , _audio_gain (0) @@ -163,6 +164,7 @@ Film::Film (Film const & o) , _scaler (o._scaler) , _trim_start (o._trim_start) , _trim_end (o._trim_end) + , _trim_type (o._trim_type) , _dcp_ab (o._dcp_ab) , _content_audio_stream (o._content_audio_stream) , _external_audio (o._external_audio) @@ -456,6 +458,14 @@ Film::write_metadata () const f << "scaler " << _scaler->id () << endl; f << "trim_start " << _trim_start << endl; f << "trim_end " << _trim_end << endl; + switch (_trim_type) { + case CPL: + f << "trim_type cpl\n"; + break; + case ENCODE: + f << "trim_type encode\n"; + break; + } f << "dcp_ab " << (_dcp_ab ? "1" : "0") << endl; if (_content_audio_stream) { f << "selected_content_audio_stream " << _content_audio_stream->to_string() << endl; @@ -569,6 +579,12 @@ Film::read_metadata () _trim_start = atoi (v.c_str ()); } else if ( ((!version || version < 2) && k == "dcp_trim_end") || k == "trim_end") { _trim_end = atoi (v.c_str ()); + } else if (k == "trim_type") { + if (v == "cpl") { + _trim_type = CPL; + } else if (v == "encode") { + _trim_type = ENCODE; + } } else if (k == "dcp_ab") { _dcp_ab = (v == "1"); } else if (k == "selected_content_audio_stream" || (!version && k == "selected_audio_stream")) { @@ -1124,6 +1140,16 @@ Film::set_trim_end (int t) signal_changed (TRIM_END); } +void +Film::set_trim_type (TrimType t) +{ + { + boost::mutex::scoped_lock lm (_state_mutex); + _trim_type = t; + } + signal_changed (TRIM_TYPE); +} + void Film::set_dcp_ab (bool a) { diff --git a/src/lib/film.h b/src/lib/film.h index a5a8ac5fa..dd0a83d94 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -112,6 +112,11 @@ public: bool have_dcp () const; + enum TrimType { + CPL, + ENCODE + }; + /** Identifiers for the parts of our state; used for signalling changes. */ @@ -128,6 +133,7 @@ public: SCALER, TRIM_START, TRIM_END, + TRIM_TYPE, DCP_AB, CONTENT_AUDIO_STREAM, EXTERNAL_AUDIO, @@ -213,6 +219,11 @@ public: return _trim_end; } + TrimType trim_type () const { + boost::mutex::scoped_lock lm (_state_mutex); + return _trim_type; + } + bool dcp_ab () const { boost::mutex::scoped_lock lm (_state_mutex); return _dcp_ab; @@ -345,6 +356,7 @@ public: void set_scaler (Scaler const *); void set_trim_start (int); void set_trim_end (int); + void set_trim_type (TrimType); void set_dcp_ab (bool); void set_content_audio_stream (boost::shared_ptr); void set_external_audio (std::vector); @@ -426,6 +438,7 @@ private: int _trim_start; /** Frames to trim off the end of the DCP */ int _trim_end; + TrimType _trim_type; /** true to create an A/B comparison DCP, where the left half of the image is the video without any filters or post-processing, and the right half has the specified filters and post-processing. diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index 62eecb70c..a21782a6f 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -156,11 +156,6 @@ FilmEditor::make_film_panel () _frame_rate_description->SetFont(font); ++r; - video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Original Size"), wxGBPosition (r, 0))); - _original_size = new wxStaticText (_film_panel, wxID_ANY, wxT ("")); - grid->Add (video_control (_original_size), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - ++r; - video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Length"), wxGBPosition (r, 0))); _length = new wxStaticText (_film_panel, wxID_ANY, wxT ("")); grid->Add (video_control (_length), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); @@ -181,6 +176,11 @@ FilmEditor::make_film_panel () } ++r; + video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Trim method"), wxGBPosition (r, 0))); + _trim_type = new wxChoice (_film_panel, wxID_ANY); + grid->Add (video_control (_trim_type), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + ++r; + _dcp_ab = new wxCheckBox (_film_panel, wxID_ANY, _("A/B")); video_control (_dcp_ab); grid->Add (_dcp_ab, wxGBPosition (r, 0)); @@ -208,45 +208,49 @@ FilmEditor::make_film_panel () for (list::const_iterator i = dfr.begin(); i != dfr.end(); ++i) { _dcp_frame_rate->Append (std_to_wx (boost::lexical_cast (*i))); } + + _trim_type->Append (_("encode all frames and play the subset")); + _trim_type->Append (_("encode only the subset")); } void FilmEditor::connect_to_widgets () { - _name->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (FilmEditor::name_changed), 0, this); - _use_dci_name->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::use_dci_name_toggled), 0, this); - _edit_dci_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_dci_button_clicked), 0, this); - _format->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::format_changed), 0, this); - _content->Connect (wxID_ANY, wxEVT_COMMAND_FILEPICKER_CHANGED, wxCommandEventHandler (FilmEditor::content_changed), 0, this); - _trust_content_header->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::trust_content_header_changed), 0, this); - _left_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::left_crop_changed), 0, this); - _right_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::right_crop_changed), 0, this); - _top_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::top_crop_changed), 0, this); - _bottom_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::bottom_crop_changed), 0, this); - _filters_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_filters_clicked), 0, this); - _scaler->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::scaler_changed), 0, this); - _dcp_content_type->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_content_type_changed), 0, this); - _dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_frame_rate_changed), 0, this); - _best_dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::best_dcp_frame_rate_clicked), 0, this); - _dcp_ab->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::dcp_ab_toggled), 0, this); - _still_duration->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::still_duration_changed), 0, this); - _trim_start->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_start_changed), 0, this); - _trim_end->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_end_changed), 0, this); - _with_subtitles->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::with_subtitles_toggled), 0, this); - _subtitle_offset->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_offset_changed), 0, this); - _subtitle_scale->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_scale_changed), 0, this); - _colour_lut->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::colour_lut_changed), 0, this); - _j2k_bandwidth->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::j2k_bandwidth_changed), 0, this); - _subtitle_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::subtitle_stream_changed), 0, this); - _audio_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::audio_stream_changed), 0, this); - _audio_gain->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_gain_changed), 0, this); + _name->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (FilmEditor::name_changed), 0, this); + _use_dci_name->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::use_dci_name_toggled), 0, this); + _edit_dci_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_dci_button_clicked), 0, this); + _format->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::format_changed), 0, this); + _content->Connect (wxID_ANY, wxEVT_COMMAND_FILEPICKER_CHANGED, wxCommandEventHandler (FilmEditor::content_changed), 0, this); + _trust_content_header->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::trust_content_header_changed), 0, this); + _left_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::left_crop_changed), 0, this); + _right_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::right_crop_changed), 0, this); + _top_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::top_crop_changed), 0, this); + _bottom_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::bottom_crop_changed), 0, this); + _filters_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_filters_clicked), 0, this); + _scaler->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::scaler_changed), 0, this); + _dcp_content_type->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_content_type_changed), 0, this); + _dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_frame_rate_changed), 0, this); + _best_dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::best_dcp_frame_rate_clicked), 0, this); + _dcp_ab->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::dcp_ab_toggled), 0, this); + _still_duration->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::still_duration_changed), 0, this); + _trim_start->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_start_changed), 0, this); + _trim_end->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_end_changed), 0, this); + _trim_type->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::trim_type_changed), 0, this); + _with_subtitles->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::with_subtitles_toggled), 0, this); + _subtitle_offset->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_offset_changed), 0, this); + _subtitle_scale->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_scale_changed), 0, this); + _colour_lut->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::colour_lut_changed), 0, this); + _j2k_bandwidth->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::j2k_bandwidth_changed), 0, this); + _subtitle_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::subtitle_stream_changed), 0, this); + _audio_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::audio_stream_changed), 0, this); + _audio_gain->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_gain_changed), 0, this); _audio_gain_calculate_button->Connect ( wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::audio_gain_calculate_button_clicked), 0, this ); - _show_audio->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::show_audio_clicked), 0, this); - _audio_delay->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_delay_changed), 0, this); - _use_content_audio->Connect (wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler (FilmEditor::use_audio_changed), 0, this); - _use_external_audio->Connect (wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler (FilmEditor::use_audio_changed), 0, this); + _show_audio->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::show_audio_clicked), 0, this); + _audio_delay->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_delay_changed), 0, this); + _use_content_audio->Connect (wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler (FilmEditor::use_audio_changed), 0, this); + _use_external_audio->Connect (wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler (FilmEditor::use_audio_changed), 0, this); for (int i = 0; i < MAX_AUDIO_CHANNELS; ++i) { _external_audio[i]->Connect ( wxID_ANY, wxEVT_COMMAND_FILEPICKER_CHANGED, wxCommandEventHandler (FilmEditor::external_audio_changed), 0, this @@ -682,12 +686,6 @@ FilmEditor::film_changed (Film::Property p) setup_frame_rate_description (); break; case Film::SIZE: - if (_film->size().width == 0 && _film->size().height == 0) { - _original_size->SetLabel (wxT ("")); - } else { - s << _film->size().width << " x " << _film->size().height; - _original_size->SetLabel (std_to_wx (s.str ())); - } setup_scaling_description (); break; case Film::LENGTH: @@ -720,6 +718,9 @@ FilmEditor::film_changed (Film::Property p) case Film::TRIM_END: checked_set (_trim_end, _film->trim_end()); break; + case Film::TRIM_TYPE: + checked_set (_trim_type, _film->trim_type() == Film::CPL ? 0 : 1); + break; case Film::AUDIO_GAIN: checked_set (_audio_gain, _film->audio_gain ()); break; @@ -898,6 +899,7 @@ FilmEditor::set_film (shared_ptr f) film_changed (Film::SCALER); film_changed (Film::TRIM_START); film_changed (Film::TRIM_END); + film_changed (Film::TRIM_TYPE); film_changed (Film::DCP_AB); film_changed (Film::CONTENT_AUDIO_STREAM); film_changed (Film::EXTERNAL_AUDIO); @@ -944,6 +946,7 @@ FilmEditor::set_things_sensitive (bool s) _dcp_frame_rate->Enable (s); _trim_start->Enable (s); _trim_end->Enable (s); + _trim_type->Enable (s); _dcp_ab->Enable (s); _colour_lut->Enable (s); _j2k_bandwidth->Enable (s); @@ -1400,3 +1403,9 @@ FilmEditor::setup_scaling_description () _scaling_description->SetLabel (d); } + +void +FilmEditor::trim_type_changed (wxCommandEvent &) +{ + _film->set_trim_type (_trim_type->GetSelection () == 0 ? Film::CPL : Film::ENCODE); +} diff --git a/src/wx/film_editor.h b/src/wx/film_editor.h index 7123620d3..e2a4d5836 100644 --- a/src/wx/film_editor.h +++ b/src/wx/film_editor.h @@ -65,6 +65,7 @@ private: void format_changed (wxCommandEvent &); void trim_start_changed (wxCommandEvent &); void trim_end_changed (wxCommandEvent &); + void trim_type_changed (wxCommandEvent &); void dcp_content_type_changed (wxCommandEvent &); void dcp_ab_toggled (wxCommandEvent &); void scaler_changed (wxCommandEvent &); @@ -169,8 +170,6 @@ private: wxChoice* _dcp_frame_rate; wxButton* _best_dcp_frame_rate; wxStaticText* _frame_rate_description; - /** The Film's original size */ - wxStaticText* _original_size; /** The Film's length */ wxStaticText* _length; /** The Film's audio details */ @@ -180,6 +179,7 @@ private: wxSpinCtrl* _trim_start; wxSpinCtrl* _trim_end; + wxChoice* _trim_type; /** Selector to generate an A/B comparison DCP */ wxCheckBox* _dcp_ab; -- cgit v1.2.3 From aa3c4f99bc31ed85262031bc347a75361f93eb09 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 14 Apr 2013 01:36:51 +0100 Subject: NS fix. --- src/tools/dvdomatic.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index 70a96866c..3628fd450 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -18,6 +18,7 @@ */ #include +#include #include #ifdef __WXMSW__ #include @@ -459,7 +460,7 @@ setup_i18n () { int language = wxLANGUAGE_DEFAULT; - ofstream f ("c:/users/carl/foo", ios::app); + ofstream f ("c:/users/carl/foo", std::ios::app); f << "Hello.\n"; if (Config::instance()->language()) { -- cgit v1.2.3 From d28d53096798c90e2d04a8f844b0e37d9d9a8d3f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 14 Apr 2013 15:57:10 +0100 Subject: Fix path. --- src/tools/dvdomatic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index 3628fd450..fda784048 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -460,7 +460,7 @@ setup_i18n () { int language = wxLANGUAGE_DEFAULT; - ofstream f ("c:/users/carl/foo", std::ios::app); + ofstream f ("c:/users/carl hetherington/foo", ios::app); f << "Hello.\n"; if (Config::instance()->language()) { -- cgit v1.2.3 From 3b85509d3bda75c2402327fbbe55ad008c57df71 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 14 Apr 2013 23:40:15 +0100 Subject: Try to fix path. --- src/tools/dvdomatic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index 3628fd450..6c7da4610 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -460,7 +460,7 @@ setup_i18n () { int language = wxLANGUAGE_DEFAULT; - ofstream f ("c:/users/carl/foo", std::ios::app); + ofstream f ("c:/users/carl hetherington/foo", std::ios::app); f << "Hello.\n"; if (Config::instance()->language()) { -- cgit v1.2.3 From 9fcaaf1cc7582598b06f5a43878cbd9aa2b4ff17 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 14 Apr 2013 23:41:57 +0100 Subject: Add Trimmer class; not linked in. --- src/lib/trimmer.cc | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/trimmer.h | 39 +++++++++++++++++++++ src/lib/writer.cc | 13 +++++-- src/lib/wscript | 1 + test/metadata.ref | 1 + test/test.cc | 51 +++++++++++++++++++++++++++ 6 files changed, 202 insertions(+), 3 deletions(-) create mode 100644 src/lib/trimmer.cc create mode 100644 src/lib/trimmer.h diff --git a/src/lib/trimmer.cc b/src/lib/trimmer.cc new file mode 100644 index 000000000..68364e50a --- /dev/null +++ b/src/lib/trimmer.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include "trimmer.h" + +using std::cout; +using std::max; +using boost::shared_ptr; + +/** @param audio_sample_rate Audio sampling rate, or 0 if there is no audio */ +Trimmer::Trimmer ( + shared_ptr log, + int video_trim_start, + int video_trim_end, int video_length, + int audio_sample_rate, + float frames_per_second, + int dcp_frames_per_second + ) + : AudioVideoProcessor (log) + , _video_start (video_trim_start) + , _video_end (video_length - video_trim_end) + , _video_in (0) + , _audio_in (0) +{ + FrameRateConversion frc (frames_per_second, dcp_frames_per_second); + + if (frc.skip) { + _video_start /= 2; + _video_end /= 2; + } else if (frc.repeat) { + _video_start *= 2; + _video_end *= 2; + } + + if (audio_sample_rate) { + _audio_start = video_frames_to_audio_frames (_video_start, audio_sample_rate, frames_per_second); + _audio_end = video_frames_to_audio_frames (_video_end, audio_sample_rate, frames_per_second); + } +} + +void +Trimmer::process_video (shared_ptr image, bool same, shared_ptr sub) +{ + if (_video_in >= _video_start && _video_in <= _video_end) { + Video (image, same, sub); + } + + ++_video_in; +} + +void +Trimmer::process_audio (shared_ptr audio) +{ + int64_t offset = _audio_start - _audio_in; + if (offset > audio->frames()) { + _audio_in += audio->frames (); + return; + } + + if (offset < 0) { + offset = 0; + } + + int64_t length = _audio_end - max (_audio_in, _audio_start); + if (length < 0) { + _audio_in += audio->frames (); + return; + } + + if (length > (audio->frames() - offset)) { + length = audio->frames () - offset; + } + + _audio_in += audio->frames (); + + if (offset != 0 || length != audio->frames ()) { + audio->move (offset, 0, length); + audio->set_frames (length); + } + + Audio (audio); +} + diff --git a/src/lib/trimmer.h b/src/lib/trimmer.h new file mode 100644 index 000000000..ff7e9514d --- /dev/null +++ b/src/lib/trimmer.h @@ -0,0 +1,39 @@ +/* + Copyright (C) 2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "processor.h" + +class Trimmer : public AudioVideoProcessor +{ +public: + Trimmer (boost::shared_ptr, int, int, int, int, float, int); + + void process_video (boost::shared_ptr i, bool, boost::shared_ptr s); + void process_audio (boost::shared_ptr); + +private: + friend class trimmer_test; + + int _video_start; + int _video_end; + int _video_in; + int64_t _audio_start; + int64_t _audio_end; + int64_t _audio_in; +}; diff --git a/src/lib/writer.cc b/src/lib/writer.cc index c6ce4711d..ad81686d1 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -259,9 +259,14 @@ Writer::finish () } int const frames = _last_written_frame + 1; - int const duration = frames - _film->trim_start() - _film->trim_end(); + int duration = 0; + if (_film->trim_type() == Film::CPL) { + duration = frames - _film->trim_start() - _film->trim_end(); + _picture_asset->set_entry_point (_film->trim_start ()); + } else { + duration = frames; + } - _picture_asset->set_entry_point (_film->trim_start ()); _picture_asset->set_duration (duration); /* Hard-link the video MXF into the DCP */ @@ -288,7 +293,9 @@ Writer::finish () _picture_asset->set_file_name (_film->dcp_video_mxf_filename ()); if (_sound_asset) { - _sound_asset->set_entry_point (_film->trim_start ()); + if (_film->trim_type() == Film::CPL) { + _sound_asset->set_entry_point (_film->trim_start ()); + } _sound_asset->set_duration (duration); } diff --git a/src/lib/wscript b/src/lib/wscript index 8e9d34706..51b103afd 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -45,6 +45,7 @@ sources = """ timer.cc transcode_job.cc transcoder.cc + trimmer.cc ui_signaller.cc util.cc video_decoder.cc diff --git a/test/metadata.ref b/test/metadata.ref index 16e3837c8..b7a031883 100644 --- a/test/metadata.ref +++ b/test/metadata.ref @@ -14,6 +14,7 @@ filter unsharp scaler bicubic trim_start 42 trim_end 99 +trim_type cpl dcp_ab 1 use_content_audio 1 audio_gain 0 diff --git a/test/test.cc b/test/test.cc index 6fad0986b..ac7ab85fe 100644 --- a/test/test.cc +++ b/test/test.cc @@ -40,6 +40,7 @@ #include "scaler.h" #include "ffmpeg_decoder.h" #include "sndfile_decoder.h" +#include "trimmer.h" #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE dvdomatic_test #include @@ -123,6 +124,55 @@ BOOST_AUTO_TEST_CASE (make_black_test) } } +shared_ptr trimmer_test_last; + +void +trimmer_test_helper (shared_ptr audio) +{ + trimmer_test_last = audio; +} + +/** Test the audio handling of the Trimmer */ +BOOST_AUTO_TEST_CASE (trimmer_test) +{ + Trimmer trimmer (shared_ptr (), 25, 75, 200, 48000, 25, 25); + + trimmer.Audio.connect (bind (&trimmer_test_helper, _1)); + + /* 21 video frames-worth of audio frames; should be completely stripped */ + trimmer_test_last.reset (); + shared_ptr audio (new AudioBuffers (6, 21 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last == 0); + + /* 42 more video frames-worth, 4 should be stripped from the start */ + audio.reset (new AudioBuffers (6, 42 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last); + BOOST_CHECK_EQUAL (trimmer_test_last->frames(), 38 * 1920); + + /* 42 more video frames-worth, should be kept as-is */ + trimmer_test_last.reset (); + audio.reset (new AudioBuffers (6, 42 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last); + BOOST_CHECK_EQUAL (trimmer_test_last->frames(), 42 * 1920); + + /* 25 more video frames-worth, 5 should be trimmed from the end */ + trimmer_test_last.reset (); + audio.reset (new AudioBuffers (6, 25 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last); + BOOST_CHECK_EQUAL (trimmer_test_last->frames(), 20 * 1920); + + /* Now some more; all should be trimmed */ + trimmer_test_last.reset (); + audio.reset (new AudioBuffers (6, 100 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last == 0); +} + + BOOST_AUTO_TEST_CASE (film_metadata_test) { setup_test_config (); @@ -863,3 +913,4 @@ BOOST_AUTO_TEST_CASE (aligned_image_test) delete t; delete u; } + -- cgit v1.2.3 From 2cc70328d69fab3b08b368e3a2a93ab73c9fba16 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 15 Apr 2013 00:20:56 +0100 Subject: Try to fix problems with empty configured language. --- src/tools/dvdomatic.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index 6c7da4610..2dc4c4de1 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -463,9 +463,10 @@ setup_i18n () ofstream f ("c:/users/carl hetherington/foo", std::ios::app); f << "Hello.\n"; - if (Config::instance()->language()) { - f << "Configured language " << Config::instance()->language().get() << "\n"; - wxLanguageInfo const * li = wxLocale::FindLanguageInfo (std_to_wx (Config::instance()->language().get())); + boost::optional config_lang = Config::instance()->language (); + if (config_lang && !config_lang.empty ()) { + f << "Configured language " << config_lang.get() << "\n"; + wxLanguageInfo const * li = wxLocale::FindLanguageInfo (std_to_wx (config_lang.get ())); f << "LanguageInfo " << li << "\n"; if (li) { language = li->Language; -- cgit v1.2.3 From 09a0fa8b6b9af3a333ee1918ee711ccc0f75c781 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 15 Apr 2013 08:25:59 +0100 Subject: Fix typo. --- src/tools/dvdomatic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index 2dc4c4de1..2a995bee8 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -464,7 +464,7 @@ setup_i18n () f << "Hello.\n"; boost::optional config_lang = Config::instance()->language (); - if (config_lang && !config_lang.empty ()) { + if (config_lang && !config_lang->empty ()) { f << "Configured language " << config_lang.get() << "\n"; wxLanguageInfo const * li = wxLocale::FindLanguageInfo (std_to_wx (config_lang.get ())); f << "LanguageInfo " << li << "\n"; -- cgit v1.2.3 From 8ef3014198e46957d0a79d4e006e5f82a345bfa7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 15 Apr 2013 21:36:23 +0100 Subject: Set language for English rather than just using blank string. --- src/wx/config_dialog.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index 1d025f3fa..c32b03ec0 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -226,7 +226,7 @@ ConfigDialog::language_changed (wxCommandEvent &) { switch (_language->GetSelection ()) { case 0: - Config::instance()->set_language (""); + Config::instance()->set_language ("en"); break; case 1: Config::instance()->set_language ("fr"); -- cgit v1.2.3 From 9ad15a56a0c57b703ddb8236e6334785812dfb0d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 15 Apr 2013 21:51:30 +0100 Subject: ChangeLog. --- ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ChangeLog b/ChangeLog index a414cf32d..3499d97ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-04-15 Carl Hetherington + + * Fix error message on forcing language to English (#103). + 2013-04-13 Carl Hetherington * Use film-name-derived names for MXFs in DCPs (#54). -- cgit v1.2.3