void back_frame ()
{
- _film_viewer->move (-_film_viewer->one_video_frame());
+ _film_viewer->seek_by (-_film_viewer->one_video_frame(), true);
}
void forward_frame ()
{
- _film_viewer->move (_film_viewer->one_video_frame());
+ _film_viewer->seek_by (_film_viewer->one_video_frame(), true);
}
FilmEditor* _film_editor;
}
_viewer->set_film (_film);
- _viewer->set_position (DCPTime ());
+ _viewer->seek (DCPTime(), true);
_info->triggered_update ();
Config::instance()->add_to_player_history (dir);
void back_frame ()
{
- _viewer->move (-_viewer->one_video_frame());
+ _viewer->seek_by (-_viewer->one_video_frame(), true);
}
void forward_frame ()
{
- _viewer->move (_viewer->one_video_frame());
+ _viewer->seek_by (_viewer->one_video_frame(), true);
}
private:
if (go_to && Config::instance()->jump_to_selected() && signal_manager) {
shared_ptr<FilmViewer> fv = _film_viewer.lock ();
DCPOMATIC_ASSERT (fv);
- signal_manager->when_idle(boost::bind(&FilmViewer::set_position, fv.get(), go_to.get().ceil(_film->video_frame_rate())));
+ signal_manager->when_idle(boost::bind(&FilmViewer::seek, fv.get(), go_to.get().ceil(_film->video_frame_rate()), true));
}
if (_timeline_dialog) {
DCPTime const len = _film->length ();
if (len.get ()) {
- int const new_slider_position = 4096 * _viewer->video_position().get() / len.get();
+ int const new_slider_position = 4096 * _viewer->position().get() / len.get();
if (new_slider_position != _slider->GetValue()) {
_slider->SetValue (new_slider_position);
}
double const fps = _film->video_frame_rate ();
/* Count frame number from 1 ... not sure if this is the best idea */
- _frame_number->SetLabel (wxString::Format (wxT("%ld"), lrint (_viewer->video_position().seconds() * fps) + 1));
- _timecode->SetLabel (time_to_timecode (_viewer->video_position(), fps));
+ _frame_number->SetLabel (wxString::Format (wxT("%ld"), lrint (_viewer->position().seconds() * fps) + 1));
+ _timecode->SetLabel (time_to_timecode (_viewer->position(), fps));
}
void
void
Controls::rewind_clicked (wxMouseEvent& ev)
{
- _viewer->go_to (DCPTime());
+ _viewer->seek (DCPTime(), true);
ev.Skip();
}
void
Controls::back_frame ()
{
- _viewer->move (-_viewer->one_video_frame());
+ _viewer->seek_by (-_viewer->one_video_frame(), true);
}
void
Controls::forward_frame ()
{
- _viewer->move (_viewer->one_video_frame());
+ _viewer->seek_by (_viewer->one_video_frame(), true);
}
void
Controls::back_clicked (wxKeyboardState& ev)
{
- _viewer->move (-nudge_amount(ev));
+ _viewer->seek_by (-nudge_amount(ev), true);
}
void
Controls::forward_clicked (wxKeyboardState& ev)
{
- _viewer->move (nudge_amount(ev));
+ _viewer->seek_by (nudge_amount(ev), true);
}
void
{
PlayheadToTimecodeDialog* dialog = new PlayheadToTimecodeDialog (this, _film->video_frame_rate ());
if (dialog->ShowModal() == wxID_OK) {
- _viewer->go_to (dialog->get ());
+ _viewer->seek (dialog->get(), true);
}
dialog->Destroy ();
}
{
PlayheadToFrameDialog* dialog = new PlayheadToFrameDialog (this, _film->video_frame_rate ());
if (dialog->ShowModal() == wxID_OK) {
- _viewer->go_to (dialog->get ());
+ _viewer->seek (dialog->get(), true);
}
dialog->Destroy ();
}
return true;
}
-void
-FilmViewer::go_to (DCPTime t)
-{
- if (t < DCPTime ()) {
- t = DCPTime ();
- }
-
- if (t >= _film->length ()) {
- t = _film->length ();
- }
-
- seek (t, true);
- PositionChanged ();
-}
-
void
FilmViewer::player_change (ChangeType type, int property, bool frequent)
{
}
void
-FilmViewer::set_position (DCPTime p)
-{
- _video_position = p;
- seek (p, true);
- PositionChanged ();
-}
-
-void
-FilmViewer::set_position (shared_ptr<Content> content, ContentTime t)
+FilmViewer::seek (shared_ptr<Content> content, ContentTime t, bool accurate)
{
optional<DCPTime> dt = _player->content_time_to_dcp (content, t);
if (dt) {
- set_position (*dt);
+ seek (*dt, accurate);
}
}
return;
}
+ if (t < DCPTime ()) {
+ t = DCPTime ();
+ }
+
+ if (t >= _film->length ()) {
+ t = _film->length ();
+ }
+
bool const was_running = stop ();
_closed_captions_dialog->clear ();
if (was_running) {
start ();
}
+
+ PositionChanged ();
}
void
return DCPTime::from_frames (1, _film->video_frame_rate());
}
+/** Open a dialog box showing our film's closed captions */
void
FilmViewer::show_closed_captions ()
{
}
void
-FilmViewer::move (DCPTime by)
+FilmViewer::seek_by (DCPTime by, bool accurate)
{
- if (!_film) {
- return;
- }
-
- go_to (_video_position + by);
+ seek (_video_position + by, accurate);
}
*/
/** @file src/film_viewer.h
- * @brief A wx widget to view `thumbnails' of a Film.
+ * @brief FilmViewer class.
*/
#include "lib/film.h"
class ClosedCaptionsDialog;
/** @class FilmViewer
- * @brief A wx widget to view a preview of a Film.
+ * @brief A wx widget to view a Film.
*/
class FilmViewer
{
FilmViewer (wxWindow *);
~FilmViewer ();
+ /** @return the panel showing the film's video */
wxPanel* panel () const {
return _panel;
}
+ void show_closed_captions ();
+
void set_film (boost::shared_ptr<Film>);
boost::shared_ptr<Film> film () const {
return _film;
}
+ void seek (DCPTime t, bool accurate);
+ void seek (boost::shared_ptr<Content> content, ContentTime p, bool accurate);
+ void seek_by (DCPTime by, bool accurate);
/** @return our `playhead' position; this may not lie exactly on a frame boundary */
DCPTime position () const {
return _video_position;
}
+ DCPTime one_video_frame () const;
+
+ void start ();
+ bool stop ();
+ bool playing () const {
+ return _playing;
+ }
- void set_position (DCPTime p);
- void set_position (boost::shared_ptr<Content> content, ContentTime p);
void set_coalesce_player_changes (bool c);
void set_dcp_decode_reduction (boost::optional<int> reduction);
boost::optional<int> dcp_decode_reduction () const;
+ void set_outline_content (bool o);
+ void set_eyes (Eyes e);
void slow_refresh ();
bool quick_refresh ();
return _dropped;
}
- void start ();
- bool stop ();
- bool playing () const {
- return _playing;
- }
-
- void move (DCPTime by);
- DCPTime one_video_frame () const;
- void seek (DCPTime t, bool accurate);
- DCPTime video_position () const {
- return _video_position;
- }
- void go_to (DCPTime t);
- void set_outline_content (bool o);
- void set_eyes (Eyes e);
-
int audio_callback (void* out, unsigned int frames);
- void show_closed_captions ();
-
boost::signals2::signal<void (boost::weak_ptr<PlayerVideo>)> ImageChanged;
boost::signals2::signal<void ()> PositionChanged;
boost::signals2::signal<void ()> Started;
DCPOMATIC_ASSERT (lc);
shared_ptr<FilmViewer> fv = _film_viewer.lock ();
DCPOMATIC_ASSERT (fv);
- fv->set_position (lc, _start_times[ev.GetIndex()]);
+ fv->seek (lc, _start_times[ev.GetIndex()], true);
}
}
if (ref) {
- fv->set_position (max (DCPTime(), ref_ph.get() + ref->position() - DCPTime (ref->trim_start(), ref_frc.get())));
+ fv->seek (max(DCPTime(), ref_ph.get() + ref->position() - DCPTime(ref->trim_start(), ref_frc.get())), true);
}
fv->set_coalesce_player_changes (false);
/* XXX: maybe playhead-off-the-end-of-the-film should be handled elsewhere */
if (fv->position() >= _parent->film()->length()) {
- fv->set_position (_parent->film()->length() - DCPTime::from_frames (1, _parent->film()->video_frame_rate()));
+ fv->seek (_parent->film()->length() - DCPTime::from_frames(1, _parent->film()->video_frame_rate()), true);
}
fv->set_coalesce_player_changes (true);
}
if (new_ph) {
- fv->set_position (new_ph.get());
+ fv->seek (new_ph.get(), true);
}
fv->set_coalesce_player_changes (false);