From c1da77c1eac00998617cf3c50b6997251e8bd40e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 24 Jan 2013 11:31:57 +0000 Subject: Fix lack of audio with trimmed DCPs. --- src/lib/encoder.cc | 1 + 1 file changed, 1 insertion(+) (limited to 'src/lib') diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 693bd5bc8..f396e3cf2 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -350,6 +350,7 @@ Encoder::process_audio (shared_ptr data) if (this_range.second < required_range.first || required_range.second < this_range.first) { /* No part of this audio is within the required range */ + _audio_frame += data->frames(); return; } else if (required_range.first >= this_range.first && required_range.first < this_range.second) { /* Trim start */ -- cgit v1.2.3 From feea01f6109e00fddaacc9ae23f4cf6f55b4cabf Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 24 Jan 2013 15:15:16 +0000 Subject: Fix incorrect assert(). --- src/lib/subtitle.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/subtitle.cc b/src/lib/subtitle.cc index 8a9998d6a..b4ac14285 100644 --- a/src/lib/subtitle.cc +++ b/src/lib/subtitle.cc @@ -34,7 +34,7 @@ using namespace boost; */ TimedSubtitle::TimedSubtitle (AVSubtitle const & sub) { - assert (sub.rects > 0); + assert (sub.num_rects > 0); /* Subtitle PTS in seconds (within the source, not taking into account any of the source that we may have chopped off for the DCP) -- cgit v1.2.3 From 8657b4ad0776366f58fe4e7fba07bab78fa749a1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 25 Jan 2013 12:48:47 +0000 Subject: Check for liblzma during configure (#7). --- src/lib/wscript | 2 +- wscript | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/wscript b/src/lib/wscript index b2b639f06..4d93a31aa 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -6,7 +6,7 @@ def build(bld): obj.name = 'libdvdomatic' obj.export_includes = ['.'] - obj.uselib = 'AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE SWRESAMPLE SNDFILE BOOST_FILESYSTEM BOOST_THREAD BOOST_DATETIME BOOST_SIGNALS2 OPENJPEG POSTPROC TIFF MAGICK SSH DCP GLIB' + obj.uselib = 'AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE SWRESAMPLE SNDFILE BOOST_FILESYSTEM BOOST_THREAD BOOST_DATETIME BOOST_SIGNALS2 OPENJPEG POSTPROC TIFF MAGICK SSH DCP GLIB LZMA' if bld.env.TARGET_WINDOWS: obj.uselib += ' WINSOCK2' obj.source = """ diff --git a/wscript b/wscript index 9acb61262..bf5cf1daa 100644 --- a/wscript +++ b/wscript @@ -89,6 +89,7 @@ def configure(conf): conf.check_cfg(package = 'sndfile', args = '--cflags --libs', uselib_store = 'SNDFILE', mandatory = True) conf.check_cfg(package = 'glib-2.0', args = '--cflags --libs', uselib_store = 'GLIB', mandatory = True) + conf.check_cfg(package = 'liblzma', args = '--cflags --libs', uselib_store = 'LZMA', mandatory = True) conf.check_cfg(package = '', path = 'Magick++-config', args = '--cppflags --cxxflags --libs', uselib_store = 'MAGICK', mandatory = True) if conf.options.static: -- cgit v1.2.3 From be1b34275e14d2584e233ac2a81d3dc44a97c208 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 25 Jan 2013 17:16:13 +0000 Subject: Make DCIMetadata class and use it. --- src/lib/dci_metadata.cc | 55 ++++++++++++++++++++ src/lib/dci_metadata.h | 40 +++++++++++++++ src/lib/film.cc | 127 ++++++++-------------------------------------- src/lib/film.h | 55 +++----------------- src/lib/wscript | 1 + src/wx/dci_name_dialog.cc | 76 ++++++++++----------------- src/wx/dci_name_dialog.h | 8 +-- 7 files changed, 152 insertions(+), 210 deletions(-) create mode 100644 src/lib/dci_metadata.cc create mode 100644 src/lib/dci_metadata.h (limited to 'src/lib') diff --git a/src/lib/dci_metadata.cc b/src/lib/dci_metadata.cc new file mode 100644 index 000000000..2b4cc3ae7 --- /dev/null +++ b/src/lib/dci_metadata.cc @@ -0,0 +1,55 @@ +/* + Copyright (C) 2012 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 "dci_metadata.h" + +using namespace std; + +void +DCIMetadata::write (ostream& f) const +{ + f << "audio_language " << audio_language << "\n"; + f << "subtitle_language " << subtitle_language << "\n"; + f << "territory " << territory << "\n"; + f << "rating " << rating << "\n"; + f << "studio " << studio << "\n"; + f << "facility " << facility << "\n"; + f << "package_type " << package_type << "\n"; +} + +void +DCIMetadata::read (string k, string v) +{ + if (k == "audio_language") { + audio_language = v; + } else if (k == "subtitle_language") { + subtitle_language = v; + } else if (k == "territory") { + territory = v; + } else if (k == "rating") { + rating = v; + } else if (k == "studio") { + studio = v; + } else if (k == "facility") { + facility = v; + } else if (k == "package_type") { + package_type = v; + } +} diff --git a/src/lib/dci_metadata.h b/src/lib/dci_metadata.h new file mode 100644 index 000000000..eecdc7655 --- /dev/null +++ b/src/lib/dci_metadata.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2012 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. + +*/ + +#ifndef DVDOMATIC_DCI_METADATA_H +#define DVDOMATIC_DCI_METADATA_H + +#include + +class DCIMetadata +{ +public: + void read (std::string, std::string); + void write (std::ostream &) const; + + std::string audio_language; + std::string subtitle_language; + std::string territory; + std::string rating; + std::string studio; + std::string facility; + std::string package_type; +}; + +#endif diff --git a/src/lib/film.cc b/src/lib/film.cc index 5a11b0ca9..df89a2552 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -170,13 +170,7 @@ Film::Film (Film const & o) , _subtitle_scale (o._subtitle_scale) , _colour_lut (o._colour_lut) , _j2k_bandwidth (o._j2k_bandwidth) - , _audio_language (o._audio_language) - , _subtitle_language (o._subtitle_language) - , _territory (o._territory) - , _rating (o._rating) - , _studio (o._studio) - , _facility (o._facility) - , _package_type (o._package_type) + , _dci_metadata (o._dci_metadata) , _size (o._size) , _length (o._length) , _content_digest (o._content_digest) @@ -432,14 +426,7 @@ Film::write_metadata () const f << "subtitle_scale " << _subtitle_scale << "\n"; f << "colour_lut " << _colour_lut << "\n"; f << "j2k_bandwidth " << _j2k_bandwidth << "\n"; - f << "audio_language " << _audio_language << "\n"; - f << "subtitle_language " << _subtitle_language << "\n"; - f << "territory " << _territory << "\n"; - f << "rating " << _rating << "\n"; - f << "studio " << _studio << "\n"; - f << "facility " << _facility << "\n"; - f << "package_type " << _package_type << "\n"; - + _dci_metadata.write (f); f << "width " << _size.width << "\n"; f << "height " << _size.height << "\n"; f << "length " << _length.get_value_or(0) << "\n"; @@ -561,21 +548,9 @@ Film::read_metadata () _colour_lut = atoi (v.c_str ()); } else if (k == "j2k_bandwidth") { _j2k_bandwidth = atoi (v.c_str ()); - } else if (k == "audio_language") { - _audio_language = v; - } else if (k == "subtitle_language") { - _subtitle_language = v; - } else if (k == "territory") { - _territory = v; - } else if (k == "rating") { - _rating = v; - } else if (k == "studio") { - _studio = v; - } else if (k == "facility") { - _facility = v; - } else if (k == "package_type") { - _package_type = v; } + + _dci_metadata.read (k, v); /* Cached stuff */ if (k == "width") { @@ -752,10 +727,12 @@ Film::dci_name () const d << format()->dci_name() << "_"; } - if (!audio_language().empty ()) { - d << audio_language(); - if (!subtitle_language().empty() && with_subtitles()) { - d << "-" << subtitle_language(); + DCIMetadata const dm = dci_metadata (); + + if (!dm.audio_language.empty ()) { + d << dm.audio_language; + if (!dm.subtitle_language.empty() && with_subtitles()) { + d << "-" << dm.subtitle_language; } else { d << "-XX"; } @@ -763,10 +740,10 @@ Film::dci_name () const d << "_"; } - if (!territory().empty ()) { - d << territory(); - if (!rating().empty ()) { - d << "-" << rating(); + if (!dm.territory.empty ()) { + d << dm.territory; + if (!dm.rating.empty ()) { + d << "-" << dm.rating; } d << "_"; } @@ -788,18 +765,18 @@ Film::dci_name () const d << "2K_"; - if (!studio().empty ()) { - d << studio() << "_"; + if (!dm.studio.empty ()) { + d << dm.studio << "_"; } d << boost::gregorian::to_iso_string (_dci_date) << "_"; - if (!facility().empty ()) { - d << facility() << "_"; + if (!dm.facility.empty ()) { + d << dm.facility << "_"; } - if (!package_type().empty ()) { - d << package_type(); + if (!dm.package_type.empty ()) { + d << dm.package_type; } return d.str (); @@ -1227,71 +1204,11 @@ Film::set_j2k_bandwidth (int b) } void -Film::set_audio_language (string l) -{ - { - boost::mutex::scoped_lock lm (_state_mutex); - _audio_language = l; - } - signal_changed (DCI_METADATA); -} - -void -Film::set_subtitle_language (string l) -{ - { - boost::mutex::scoped_lock lm (_state_mutex); - _subtitle_language = l; - } - signal_changed (DCI_METADATA); -} - -void -Film::set_territory (string t) -{ - { - boost::mutex::scoped_lock lm (_state_mutex); - _territory = t; - } - signal_changed (DCI_METADATA); -} - -void -Film::set_rating (string r) -{ - { - boost::mutex::scoped_lock lm (_state_mutex); - _rating = r; - } - signal_changed (DCI_METADATA); -} - -void -Film::set_studio (string s) -{ - { - boost::mutex::scoped_lock lm (_state_mutex); - _studio = s; - } - signal_changed (DCI_METADATA); -} - -void -Film::set_facility (string f) -{ - { - boost::mutex::scoped_lock lm (_state_mutex); - _facility = f; - } - signal_changed (DCI_METADATA); -} - -void -Film::set_package_type (string p) +Film::set_dci_metadata (DCIMetadata m) { { boost::mutex::scoped_lock lm (_state_mutex); - _package_type = p; + _dci_metadata = m; } signal_changed (DCI_METADATA); } diff --git a/src/lib/film.h b/src/lib/film.h index d3530b817..af7ec6701 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -38,6 +38,7 @@ extern "C" { #include "dcp_content_type.h" #include "util.h" #include "stream.h" +#include "dci_metadata.h" class Format; class Job; @@ -265,41 +266,11 @@ public: return _j2k_bandwidth; } - std::string audio_language () const { + DCIMetadata dci_metadata () const { boost::mutex::scoped_lock lm (_state_mutex); - return _audio_language; + return _dci_metadata; } - std::string subtitle_language () const { - boost::mutex::scoped_lock lm (_state_mutex); - return _subtitle_language; - } - - std::string territory () const { - boost::mutex::scoped_lock lm (_state_mutex); - return _territory; - } - - std::string rating () const { - boost::mutex::scoped_lock lm (_state_mutex); - return _rating; - } - - std::string studio () const { - boost::mutex::scoped_lock lm (_state_mutex); - return _studio; - } - - std::string facility () const { - boost::mutex::scoped_lock lm (_state_mutex); - return _facility; - } - - std::string package_type () const { - boost::mutex::scoped_lock lm (_state_mutex); - return _package_type; - } - libdcp::Size size () const { boost::mutex::scoped_lock lm (_state_mutex); return _size; @@ -368,13 +339,7 @@ public: void set_subtitle_scale (float); void set_colour_lut (int); void set_j2k_bandwidth (int); - void set_audio_language (std::string); - void set_subtitle_language (std::string); - void set_territory (std::string); - void set_rating (std::string); - void set_studio (std::string); - void set_facility (std::string); - void set_package_type (std::string); + void set_dci_metadata (DCIMetadata); void set_size (libdcp::Size); void set_length (SourceFrame); void unset_length (); @@ -472,15 +437,9 @@ private: int _colour_lut; /** bandwidth for J2K files in bits per second */ int _j2k_bandwidth; - - /* DCI naming stuff */ - std::string _audio_language; - std::string _subtitle_language; - std::string _territory; - std::string _rating; - std::string _studio; - std::string _facility; - std::string _package_type; + + /** DCI naming stuff */ + DCIMetadata _dci_metadata; /* Data which are cached to speed things up */ diff --git a/src/lib/wscript b/src/lib/wscript index 4d93a31aa..cada2b0c3 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -18,6 +18,7 @@ def build(bld): config.cc combiner.cc cross.cc + dci_metadata.cc dcp_content_type.cc dcp_video_frame.cc decoder.cc diff --git a/src/wx/dci_name_dialog.cc b/src/wx/dci_name_dialog.cc index 6927d6c9e..41d93576f 100644 --- a/src/wx/dci_name_dialog.cc +++ b/src/wx/dci_name_dialog.cc @@ -59,21 +59,23 @@ DCINameDialog::DCINameDialog (wxWindow* parent, shared_ptr film) _package_type = new wxTextCtrl (this, wxID_ANY); table->Add (_package_type, 1, wxEXPAND); - _audio_language->SetValue (std_to_wx (_film->audio_language ())); - _subtitle_language->SetValue (std_to_wx (_film->subtitle_language ())); - _territory->SetValue (std_to_wx (_film->territory ())); - _rating->SetValue (std_to_wx (_film->rating ())); - _studio->SetValue (std_to_wx (_film->studio ())); - _facility->SetValue (std_to_wx (_film->facility ())); - _package_type->SetValue (std_to_wx (_film->package_type ())); + DCIMetadata dm = _film->dci_metadata (); + + _audio_language->SetValue (std_to_wx (dm.audio_language)); + _subtitle_language->SetValue (std_to_wx (dm.subtitle_language)); + _territory->SetValue (std_to_wx (dm.territory)); + _rating->SetValue (std_to_wx (dm.rating)); + _studio->SetValue (std_to_wx (dm.studio)); + _facility->SetValue (std_to_wx (dm.facility)); + _package_type->SetValue (std_to_wx (dm.package_type)); - _audio_language->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::audio_language_changed), 0, this); - _subtitle_language->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::subtitle_language_changed), 0, this); - _territory->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::territory_changed), 0, this); - _rating->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::rating_changed), 0, this); - _studio->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::studio_changed), 0, this); - _facility->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::facility_changed), 0, this); - _package_type->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::package_type_changed), 0, this); + _audio_language->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::changed), 0, this); + _subtitle_language->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::changed), 0, this); + _territory->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::changed), 0, this); + _rating->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::changed), 0, this); + _studio->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::changed), 0, this); + _facility->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::changed), 0, this); + _package_type->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DCINameDialog::changed), 0, this); wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); overall_sizer->Add (table, 1, wxEXPAND | wxALL, 6); @@ -89,43 +91,17 @@ DCINameDialog::DCINameDialog (wxWindow* parent, shared_ptr film) } void -DCINameDialog::audio_language_changed (wxCommandEvent &) +DCINameDialog::changed (wxCommandEvent &) { - _film->set_audio_language (wx_to_std (_audio_language->GetValue ())); -} - -void -DCINameDialog::subtitle_language_changed (wxCommandEvent &) -{ - _film->set_subtitle_language (wx_to_std (_subtitle_language->GetValue ())); -} - -void -DCINameDialog::territory_changed (wxCommandEvent &) -{ - _film->set_territory (wx_to_std (_territory->GetValue ())); -} - -void -DCINameDialog::rating_changed (wxCommandEvent &) -{ - _film->set_rating (wx_to_std (_rating->GetValue ())); -} + DCIMetadata dm; -void -DCINameDialog::studio_changed (wxCommandEvent &) -{ - _film->set_studio (wx_to_std (_studio->GetValue ())); -} + dm.audio_language = wx_to_std (_audio_language->GetValue ()); + dm.subtitle_language = wx_to_std (_subtitle_language->GetValue ()); + dm.territory = wx_to_std (_territory->GetValue ()); + dm.rating = wx_to_std (_rating->GetValue ()); + dm.studio = wx_to_std (_studio->GetValue ()); + dm.facility = wx_to_std (_facility->GetValue ()); + dm.package_type = wx_to_std (_package_type->GetValue ()); -void -DCINameDialog::facility_changed (wxCommandEvent &) -{ - _film->set_facility (wx_to_std (_facility->GetValue ())); -} - -void -DCINameDialog::package_type_changed (wxCommandEvent &) -{ - _film->set_package_type (wx_to_std (_package_type->GetValue ())); + _film->set_dci_metadata (dm); } diff --git a/src/wx/dci_name_dialog.h b/src/wx/dci_name_dialog.h index 1fd5436b8..dc96deed6 100644 --- a/src/wx/dci_name_dialog.h +++ b/src/wx/dci_name_dialog.h @@ -29,13 +29,7 @@ public: DCINameDialog (wxWindow *, boost::shared_ptr); private: - void audio_language_changed (wxCommandEvent &); - void subtitle_language_changed (wxCommandEvent &); - void territory_changed (wxCommandEvent &); - void rating_changed (wxCommandEvent &); - void studio_changed (wxCommandEvent &); - void facility_changed (wxCommandEvent &); - void package_type_changed (wxCommandEvent &); + void changed (wxCommandEvent &); wxTextCtrl* _audio_language; wxTextCtrl* _subtitle_language; -- cgit v1.2.3 From 7101dd05ddcde66600bded064e28b491d79e3ebc Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 25 Jan 2013 19:29:50 +0000 Subject: Provide option of default DCI name details (#42). --- ChangeLog | 6 ++++++ src/lib/config.cc | 6 +++++- src/lib/config.h | 11 +++++++++++ src/lib/film.cc | 1 + src/wx/config_dialog.cc | 17 +++++++++++++++++ src/wx/config_dialog.h | 4 +++- 6 files changed, 43 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/ChangeLog b/ChangeLog index 73e7eb85f..96813f774 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-01-25 Carl Hetherington + + * Add option to specify default details + for the DCI name details dialog in new + Films (#42). + 2013-01-24 Carl Hetherington * Version 0.72 released. diff --git a/src/lib/config.cc b/src/lib/config.cc index 65d01bf00..c4659eecf 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -86,6 +86,8 @@ Config::Config () } else if (k == "sound_processor") { _sound_processor = SoundProcessor::from_id (v); } + + _default_dci_metadata.read (k, v); } } @@ -132,7 +134,9 @@ Config::write () const f << "tms_path " << _tms_path << "\n"; f << "tms_user " << _tms_user << "\n"; f << "tms_password " << _tms_password << "\n"; - f << "sound_processor " << _sound_processor->id (); + f << "sound_processor " << _sound_processor->id () << "\n"; + + _default_dci_metadata.write (f); } string diff --git a/src/lib/config.h b/src/lib/config.h index c84ce76b5..98cbf67e5 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -27,6 +27,7 @@ #include #include #include +#include "dci_metadata.h" class ServerDescription; class Scaler; @@ -94,6 +95,10 @@ public: return _sound_processor; } + DCIMetadata default_dci_metadata () const { + return _default_dci_metadata; + } + /** @param n New number of local encoding threads */ void set_num_local_encoding_threads (int n) { _num_local_encoding_threads = n; @@ -140,6 +145,10 @@ public: void set_tms_password (std::string p) { _tms_password = p; } + + void set_default_dci_metadata (DCIMetadata d) { + _default_dci_metadata = d; + } void write () const; @@ -172,6 +181,8 @@ private: std::string _tms_password; /** Our sound processor */ SoundProcessor const * _sound_processor; + /** Default DCI metadata for newly-created Films */ + DCIMetadata _default_dci_metadata; /** Singleton instance, or 0 */ static Config* _instance; diff --git a/src/lib/film.cc b/src/lib/film.cc index df89a2552..f5522b74a 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -101,6 +101,7 @@ Film::Film (string d, bool must_exist) , _subtitle_scale (1) , _colour_lut (0) , _j2k_bandwidth (200000000) + , _dci_metadata (Config::instance()->default_dci_metadata ()) , _frames_per_second (0) , _dirty (false) { diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index 9de8e7001..8886fa160 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -35,6 +35,7 @@ #include "filter_dialog.h" #include "server_dialog.h" #include "dir_picker_ctrl.h" +#include "dci_metadata_dialog.h" using namespace std; using boost::bind; @@ -79,6 +80,11 @@ ConfigDialog::ConfigDialog (wxWindow* parent) table->Add (_default_directory, 1, wxEXPAND); table->AddSpacer (0); + add_label_to_sizer (table, this, "Default DCI name details"); + _default_dci_metadata_button = new wxButton (this, wxID_ANY, _("Edit...")); + table->Add (_default_dci_metadata_button); + table->AddSpacer (1); + add_label_to_sizer (table, this, "Reference scaler for A/B"); _reference_scaler = new wxComboBox (this, wxID_ANY); vector const sc = Scaler::all (); @@ -142,6 +148,8 @@ ConfigDialog::ConfigDialog (wxWindow* parent) _default_directory->SetPath (std_to_wx (config->default_directory_or (wx_to_std (wxStandardPaths::Get().GetDocumentsDir())))); _default_directory->Connect (wxID_ANY, wxEVT_COMMAND_DIRPICKER_CHANGED, wxCommandEventHandler (ConfigDialog::default_directory_changed), 0, this); + _default_dci_metadata_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (ConfigDialog::edit_default_dci_metadata_clicked), 0, this); + _reference_scaler->SetSelection (Scaler::as_index (config->reference_scaler ())); _reference_scaler->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (ConfigDialog::reference_scaler_changed), 0, this); @@ -307,3 +315,12 @@ ConfigDialog::reference_filters_changed (vector f) pair p = Filter::ffmpeg_strings (Config::instance()->reference_filters ()); _reference_filters->SetLabel (std_to_wx (p.first + " " + p.second)); } + +void +ConfigDialog::edit_default_dci_metadata_clicked (wxCommandEvent &) +{ + DCIMetadataDialog* d = new DCIMetadataDialog (this, Config::instance()->default_dci_metadata ()); + d->ShowModal (); + Config::instance()->set_default_dci_metadata (d->dci_metadata ()); + d->Destroy (); +} diff --git a/src/wx/config_dialog.h b/src/wx/config_dialog.h index 32123a0d7..fdbe99a4c 100644 --- a/src/wx/config_dialog.h +++ b/src/wx/config_dialog.h @@ -45,6 +45,7 @@ private: void tms_password_changed (wxCommandEvent &); void num_local_encoding_threads_changed (wxCommandEvent &); void default_directory_changed (wxCommandEvent &); + void edit_default_dci_metadata_clicked (wxCommandEvent &); void reference_scaler_changed (wxCommandEvent &); void edit_reference_filters_clicked (wxCommandEvent &); void reference_filters_changed (std::vector); @@ -64,7 +65,8 @@ private: DirPickerCtrl* _default_directory; #else wxDirPickerCtrl* _default_directory; -#endif +#endif + wxButton* _default_dci_metadata_button; wxComboBox* _reference_scaler; wxStaticText* _reference_filters; wxButton* _reference_filters_button; -- cgit v1.2.3 From 9e92f4742708e8b1516623647ee458211fdd68c1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 25 Jan 2013 20:54:29 +0000 Subject: Fix signalling of wxChoices that used to be ComboBoxes. Use Size a little more. Show any padding of films into larger frames in the preview (#33). --- src/lib/format.cc | 9 +++++++ src/lib/format.h | 3 +++ src/wx/config_dialog.cc | 2 +- src/wx/film_editor.cc | 10 ++++---- src/wx/film_viewer.cc | 64 +++++++++++++++++++++++++++++++++---------------- src/wx/film_viewer.h | 11 +++++---- 6 files changed, 69 insertions(+), 30 deletions(-) (limited to 'src/lib') diff --git a/src/lib/format.cc b/src/lib/format.cc index 088a16059..6615e16e0 100644 --- a/src/lib/format.cc +++ b/src/lib/format.cc @@ -147,6 +147,9 @@ FixedFormat::FixedFormat (int r, libdcp::Size dcp, string id, string n, string d } +/** @return Number of pixels (int the DCP image) to pad either side of the film + * (so there are dcp_padding() pixels on the left and dcp_padding() on the right) + */ int Format::dcp_padding (shared_ptr f) const { @@ -160,6 +163,12 @@ Format::dcp_padding (shared_ptr f) const return p; } +float +Format::container_ratio_as_float () const +{ + return static_cast (_dcp_size.width) / _dcp_size.height; +} + VariableFormat::VariableFormat (libdcp::Size dcp, string id, string n, string d) : Format (dcp, id, n, d) { diff --git a/src/lib/format.h b/src/lib/format.h index b4c691e56..783ff25ce 100644 --- a/src/lib/format.h +++ b/src/lib/format.h @@ -46,6 +46,9 @@ public: /** @return the ratio as a floating point number */ virtual float ratio_as_float (boost::shared_ptr f) const = 0; + /** @return the ratio of the container (including any padding) as a floating point number */ + float container_ratio_as_float () const; + int dcp_padding (boost::shared_ptr f) const; /** @return size in pixels of the images that we should diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index 99527ffe7..b656a5278 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -151,7 +151,7 @@ ConfigDialog::ConfigDialog (wxWindow* parent) _default_dci_metadata_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (ConfigDialog::edit_default_dci_metadata_clicked), 0, this); _reference_scaler->SetSelection (Scaler::as_index (config->reference_scaler ())); - _reference_scaler->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (ConfigDialog::reference_scaler_changed), 0, this); + _reference_scaler->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (ConfigDialog::reference_scaler_changed), 0, this); pair p = Filter::ffmpeg_strings (config->reference_filters ()); _reference_filters->SetLabel (std_to_wx (p.first + " " + p.second)); diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index 1e5765ae8..f058afa54 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -177,7 +177,7 @@ 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_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::format_changed), 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); @@ -185,7 +185,7 @@ FilmEditor::connect_to_widgets () _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_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::scaler_changed), 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_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); @@ -194,10 +194,10 @@ FilmEditor::connect_to_widgets () _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_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::colour_lut_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_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::subtitle_stream_changed), 0, this); - _audio_stream->Connect (wxID_ANY, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler (FilmEditor::audio_stream_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 diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index e014a8731..16b3ccd9a 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -50,11 +50,8 @@ FilmViewer::FilmViewer (shared_ptr f, wxWindow* p) , _panel (new wxPanel (this)) , _slider (new wxSlider (this, wxID_ANY, 0, 0, 4096)) , _play_button (new wxToggleButton (this, wxID_ANY, wxT ("Play"))) + , _display_frame_x (0) , _got_frame (false) - , _out_width (0) - , _out_height (0) - , _panel_width (0) - , _panel_height (0) , _clear_required (false) { _panel->SetDoubleBuffered (true); @@ -195,14 +192,21 @@ FilmViewer::paint_panel (wxPaintEvent &) _clear_required = false; } - if (!_display_frame || !_film || !_out_width || !_out_height) { + if (!_display_frame || !_film || !_out_size.width || !_out_size.height) { dc.Clear (); return; } - wxImage frame (_out_width, _out_height, _display_frame->data()[0], true); + if (_display_frame_x) { + dc.SetPen(*wxBLACK_PEN); + dc.SetBrush(*wxBLACK_BRUSH); + dc.DrawRectangle (0, 0, _display_frame_x, _film_size.height); + dc.DrawRectangle (_display_frame_x + _film_size.width, 0, _display_frame_x * 2 + _film_size.width, _film_size.height); + } + + wxImage frame (_film_size.width, _film_size.height, _display_frame->data()[0], true); wxBitmap frame_bitmap (frame); - dc.DrawBitmap (frame_bitmap, 0, 0); + dc.DrawBitmap (frame_bitmap, _display_frame_x, 0); if (_film->with_subtitles() && _display_sub) { wxImage sub (_display_sub->size().width, _display_sub->size().height, _display_sub->data()[0], _display_sub->alpha(), true); @@ -231,8 +235,8 @@ FilmViewer::slider_moved (wxScrollEvent &) void FilmViewer::panel_sized (wxSizeEvent& ev) { - _panel_width = ev.GetSize().GetWidth(); - _panel_height = ev.GetSize().GetHeight(); + _panel_size.width = ev.GetSize().GetWidth(); + _panel_size.height = ev.GetSize().GetHeight(); calculate_sizes (); update_from_raw (); } @@ -253,7 +257,7 @@ FilmViewer::update_from_raw () void FilmViewer::raw_to_display () { - if (!_raw_frame || _out_width < 64 || _out_height < 64 || !_film) { + if (!_raw_frame || _out_size.width < 64 || _out_size.height < 64 || !_film) { return; } @@ -263,7 +267,7 @@ FilmViewer::raw_to_display () } /* Get a compacted image as we have to feed it to wxWidgets */ - _display_frame = _raw_frame->scale_and_convert_to_rgb (libdcp::Size (_out_width, _out_height), 0, _film->scaler(), false); + _display_frame = _raw_frame->scale_and_convert_to_rgb (_film_size, 0, _film->scaler(), false); if (old_size != _display_frame->size()) { _clear_required = true; @@ -271,13 +275,14 @@ FilmViewer::raw_to_display () if (_raw_sub) { Rect tx = subtitle_transformed_area ( - float (_out_width) / _film->size().width, - float (_out_height) / _film->size().height, + float (_film_size.width) / _film->size().width, + float (_film_size.height) / _film->size().height, _raw_sub->area(), _film->subtitle_offset(), _film->subtitle_scale() ); _display_sub.reset (new RGBPlusAlphaImage (_raw_sub->image()->scale (tx.size(), _film->scaler(), false))); _display_sub_position = tx.position(); + _display_sub_position.x += _display_frame_x; } else { _display_sub.reset (); } @@ -289,17 +294,36 @@ FilmViewer::calculate_sizes () if (!_film) { return; } + + Format const * format = _film->format (); - float const panel_ratio = static_cast (_panel_width) / _panel_height; - float const film_ratio = _film->format() ? _film->format()->ratio_as_float(_film) : 1.78; + float const panel_ratio = static_cast (_panel_size.width) / _panel_size.height; + float const film_ratio = format ? format->container_ratio_as_float () : 1.78; + if (panel_ratio < film_ratio) { /* panel is less widscreen than the film; clamp width */ - _out_width = _panel_width; - _out_height = _out_width / film_ratio; + _out_size.width = _panel_size.width; + _out_size.height = _out_size.width / film_ratio; } else { - /* panel is more widescreen than the film; clamp heignt */ - _out_height = _panel_height; - _out_width = _out_height * film_ratio; + /* panel is more widescreen than the film; clamp height */ + _out_size.height = _panel_size.height; + _out_size.width = _out_size.height * film_ratio; + } + + /* Work out how much padding there is in terms of our display; this will be the x position + of our _display_frame. + */ + _display_frame_x = 0; + if (format) { + _display_frame_x = static_cast (format->dcp_padding (_film)) * _out_size.width / format->dcp_size().width; + } + + _film_size = _out_size; + _film_size.width -= _display_frame_x * 2; + + /* Catch silly values */ + if (_out_size.width < 64) { + _out_size.width = 64; } } diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index c6b5e7c0c..456301eb4 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -69,14 +69,17 @@ private: boost::shared_ptr _raw_frame; boost::shared_ptr _raw_sub; boost::shared_ptr _display_frame; + int _display_frame_x; boost::shared_ptr _display_sub; Position _display_sub_position; bool _got_frame; - int _out_width; - int _out_height; - int _panel_width; - int _panel_height; + /** Size of our output (including padding if we have any) */ + libdcp::Size _out_size; + /** Size that we will make our film (equal to _out_size unless we have padding) */ + libdcp::Size _film_size; + /** Size of the panel that we have available */ + libdcp::Size _panel_size; bool _clear_required; }; -- cgit v1.2.3