From ea6240f349a27e1e8f4f03ee69640e3a2939d958 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 7 Jan 2014 09:29:06 +0000 Subject: [PATCH] Allow moving-still-image sources to have their frame rate specified. --- ChangeLog | 4 ++++ src/lib/content.cc | 4 ++++ src/lib/image_content.cc | 16 +++++++++++++ src/lib/image_content.h | 1 + src/lib/player.cc | 7 ++++-- src/lib/video_content.h | 2 +- src/wx/timing_panel.cc | 51 +++++++++++++++++++++++++++++++++++++++- src/wx/timing_panel.h | 4 ++++ 8 files changed, 85 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 67187d925..f46e8cfaa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2014-01-07 Carl Hetherington + + * Allow still-moving-image sources to have their frame rate specified. + 2014-01-06 Carl Hetherington * Basics of per-channel audio gain (#247). diff --git a/src/lib/content.cc b/src/lib/content.cc index d835a5b05..ccca46bc0 100644 --- a/src/lib/content.cc +++ b/src/lib/content.cc @@ -150,6 +150,10 @@ Content::set_position (Time p) { { boost::mutex::scoped_lock lm (_mutex); + if (p == _position) { + return; + } + _position = p; } diff --git a/src/lib/image_content.cc b/src/lib/image_content.cc index b05fa6b8d..2d29df0c4 100644 --- a/src/lib/image_content.cc +++ b/src/lib/image_content.cc @@ -144,3 +144,19 @@ ImageContent::still () const { return number_of_paths() == 1; } + +void +ImageContent::set_video_frame_rate (float r) +{ + { + boost::mutex::scoped_lock lm (_mutex); + if (_video_frame_rate == r) { + return; + } + + _video_frame_rate = r; + } + + signal_changed (VideoContentProperty::VIDEO_FRAME_RATE); +} + diff --git a/src/lib/image_content.h b/src/lib/image_content.h index 47c5a20e3..e5a0311d9 100644 --- a/src/lib/image_content.h +++ b/src/lib/image_content.h @@ -47,6 +47,7 @@ public: void set_video_length (VideoContent::Frame); bool still () const; + void set_video_frame_rate (float); }; #endif diff --git a/src/lib/player.cc b/src/lib/player.cc index e1bf1fdb5..9f8599693 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -524,7 +524,10 @@ Player::content_changed (weak_ptr w, int property, bool frequent) update_subtitle (); Changed (frequent); - } else if (property == VideoContentProperty::VIDEO_CROP || property == VideoContentProperty::VIDEO_RATIO) { + } else if ( + property == VideoContentProperty::VIDEO_CROP || property == VideoContentProperty::VIDEO_RATIO || + property == VideoContentProperty::VIDEO_FRAME_RATE + ) { Changed (frequent); @@ -617,7 +620,7 @@ Player::film_changed (Film::Property p) last time we were run. */ - if (p == Film::SCALER || p == Film::WITH_SUBTITLES || p == Film::CONTAINER) { + if (p == Film::SCALER || p == Film::WITH_SUBTITLES || p == Film::CONTAINER || p == Film::VIDEO_FRAME_RATE) { Changed (false); } } diff --git a/src/lib/video_content.h b/src/lib/video_content.h index effca5c61..141525e01 100644 --- a/src/lib/video_content.h +++ b/src/lib/video_content.h @@ -129,6 +129,7 @@ protected: void take_from_video_examiner (boost::shared_ptr); VideoContent::Frame _video_length; + float _video_frame_rate; private: friend class ffmpeg_pts_offset_test; @@ -139,7 +140,6 @@ private: void setup_default_colour_conversion (); libdcp::Size _video_size; - float _video_frame_rate; VideoFrameType _video_frame_type; Crop _crop; Ratio const * _ratio; diff --git a/src/wx/timing_panel.cc b/src/wx/timing_panel.cc index 79099b168..fdaf9c807 100644 --- a/src/wx/timing_panel.cc +++ b/src/wx/timing_panel.cc @@ -25,8 +25,10 @@ #include "film_editor.h" using std::cout; +using std::string; using boost::shared_ptr; using boost::dynamic_pointer_cast; +using boost::lexical_cast; TimingPanel::TimingPanel (FilmEditor* e) : FilmEditorPanel (e, _("Timing")) @@ -50,11 +52,24 @@ TimingPanel::TimingPanel (FilmEditor* e) _play_length = new Timecode (this); grid->Add (_play_length); + { + add_label_to_sizer (grid, this, _("Video frame rate"), true); + wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); + _video_frame_rate = new wxTextCtrl (this, wxID_ANY); + s->Add (_video_frame_rate, 1, wxEXPAND); + _set_video_frame_rate = new wxButton (this, wxID_ANY, _("Set")); + _set_video_frame_rate->Enable (false); + s->Add (_set_video_frame_rate, 0, wxLEFT | wxRIGHT, 8); + grid->Add (s, 1, wxEXPAND); + } + _position->Changed.connect (boost::bind (&TimingPanel::position_changed, this)); _full_length->Changed.connect (boost::bind (&TimingPanel::full_length_changed, this)); _trim_start->Changed.connect (boost::bind (&TimingPanel::trim_start_changed, this)); _trim_end->Changed.connect (boost::bind (&TimingPanel::trim_end_changed, this)); _play_length->Changed.connect (boost::bind (&TimingPanel::play_length_changed, this)); + _video_frame_rate->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&TimingPanel::video_frame_rate_changed, this)); + _set_video_frame_rate->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&TimingPanel::set_video_frame_rate, this)); } void @@ -96,11 +111,24 @@ TimingPanel::film_content_changed (int property) _trim_end->set (0, 24); _play_length->set (0, 24); } - } + } else if (property == VideoContentProperty::VIDEO_FRAME_RATE) { + if (content) { + shared_ptr vc = dynamic_pointer_cast (content); + if (vc) { + _video_frame_rate->SetValue (std_to_wx (lexical_cast (vc->video_frame_rate ()))); + } else { + _video_frame_rate->SetValue ("24"); + } + } else { + _video_frame_rate->SetValue ("24"); + } + } shared_ptr ic = dynamic_pointer_cast (content); _full_length->set_editable (ic && ic->still ()); _play_length->set_editable (!ic || !ic->still ()); + _video_frame_rate->Enable (ic && !ic->still ()); + _set_video_frame_rate->Enable (false); } void @@ -152,6 +180,25 @@ TimingPanel::play_length_changed () } } +void +TimingPanel::video_frame_rate_changed () +{ + _set_video_frame_rate->Enable (true); +} + +void +TimingPanel::set_video_frame_rate () +{ + ContentList c = _editor->selected_content (); + if (c.size() == 1) { + shared_ptr ic = dynamic_pointer_cast (c.front ()); + if (ic) { + ic->set_video_frame_rate (lexical_cast (wx_to_std (_video_frame_rate->GetValue ()))); + _set_video_frame_rate->Enable (false); + } + } +} + void TimingPanel::content_selection_changed () { @@ -164,9 +211,11 @@ TimingPanel::content_selection_changed () _trim_start->Enable (single); _trim_end->Enable (single); _play_length->Enable (single); + _video_frame_rate->Enable (single); film_content_changed (ContentProperty::POSITION); film_content_changed (ContentProperty::LENGTH); film_content_changed (ContentProperty::TRIM_START); film_content_changed (ContentProperty::TRIM_END); + film_content_changed (VideoContentProperty::VIDEO_FRAME_RATE); } diff --git a/src/wx/timing_panel.h b/src/wx/timing_panel.h index ab859a1be..d9696a201 100644 --- a/src/wx/timing_panel.h +++ b/src/wx/timing_panel.h @@ -35,10 +35,14 @@ private: void trim_start_changed (); void trim_end_changed (); void play_length_changed (); + void video_frame_rate_changed (); + void set_video_frame_rate (); Timecode* _position; Timecode* _full_length; Timecode* _trim_start; Timecode* _trim_end; Timecode* _play_length; + wxTextCtrl* _video_frame_rate; + wxButton* _set_video_frame_rate; }; -- 2.30.2