Give DCPDecoder its own ::position which just returns its internal
[dcpomatic.git] / src / wx / timing_panel.cc
index 7e7dd6fbdade58d1fd75a24b2858235e4e0e9d16..2c9b88e83fe1c9ff9be1349ce467bfd74142dfd9 100644 (file)
@@ -33,6 +33,8 @@
 #include "lib/audio_content.h"
 #include "lib/string_text_file_content.h"
 #include "lib/video_content.h"
+#include "lib/dcp_content.h"
+#include "lib/ffmpeg_content.h"
 #include <dcp/locale_convert.h>
 #include <boost/foreach.hpp>
 #include <set>
@@ -402,7 +404,6 @@ TimingPanel::trim_start_changed ()
        optional<FrameRateChange> ref_frc;
        optional<DCPTime> ref_ph;
 
-       ContentTime const trim = _trim_start->get (_parent->film()->video_frame_rate ());
 
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
                if (i->position() <= ph && ph < i->end(_parent->film())) {
@@ -415,6 +416,7 @@ TimingPanel::trim_start_changed ()
                        ref_ph = ph - i->position() + DCPTime (i->trim_start(), ref_frc.get());
                }
 
+               ContentTime const trim = _trim_start->get (i->video_frame_rate().get_value_or(_parent->film()->video_frame_rate()));
                i->set_trim_start (trim);
        }
 
@@ -435,8 +437,8 @@ TimingPanel::trim_end_changed ()
 
        fv->set_coalesce_player_changes (true);
 
-       ContentTime const trim = _trim_end->get (_parent->film()->video_frame_rate ());
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
+               ContentTime const trim = _trim_end->get (i->video_frame_rate().get_value_or(_parent->film()->video_frame_rate()));
                i->set_trim_end (trim);
        }
 
@@ -445,7 +447,7 @@ TimingPanel::trim_end_changed ()
                fv->seek (_parent->film()->length() - DCPTime::from_frames(1, _parent->film()->video_frame_rate()), true);
        }
 
-       fv->set_coalesce_player_changes (true);
+       fv->set_coalesce_player_changes (false);
 }
 
 void
@@ -463,7 +465,22 @@ TimingPanel::play_length_changed ()
 void
 TimingPanel::video_frame_rate_changed ()
 {
-       _set_video_frame_rate->Enable (true);
+       bool enable = true;
+       if (_video_frame_rate->GetValue() == wxT("")) {
+               /* No frame rate has been entered; if the user clicks "set" now it would unset the video
+                  frame rate in the selected content.  This can't be allowed for some content types.
+               */
+               BOOST_FOREACH (shared_ptr<Content> i, _parent->selected()) {
+                       if (
+                               dynamic_pointer_cast<DCPContent>(i) ||
+                               dynamic_pointer_cast<FFmpegContent>(i)
+                               ) {
+                               enable = false;
+                       }
+               }
+       }
+
+       _set_video_frame_rate->Enable (enable);
 }
 
 void