/*
- Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
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
* @brief A wx widget to view a preview of a Film.
*/
-#include <iostream>
-#include <iomanip>
-#include <wx/tglbtn.h>
-#include <dcp/exceptions.h>
#include "lib/film.h"
#include "lib/ratio.h"
#include "lib/util.h"
#include "lib/job_manager.h"
#include "lib/image.h"
-#include "lib/scaler.h"
#include "lib/exceptions.h"
#include "lib/examine_content_job.h"
#include "lib/filter.h"
#include "lib/video_content.h"
#include "lib/video_decoder.h"
#include "lib/timer.h"
+#include "lib/log.h"
#include "film_viewer.h"
#include "wx_util.h"
+#include <dcp/exceptions.h>
+#include <wx/tglbtn.h>
+#include <iostream>
+#include <iomanip>
using std::string;
using std::pair;
using std::list;
using std::bad_alloc;
using std::make_pair;
+using std::exception;
using boost::shared_ptr;
using boost::dynamic_pointer_cast;
using boost::weak_ptr;
_frame.reset ();
- _slider->SetValue (0);
- set_position_text ();
+ update_position_slider ();
+ update_position_label ();
if (!_film) {
return;
_film.reset ();
return;
}
+
+ /* Always burn in subtitles, even if we are set not to, otherwise we won't see them
+ in the preview.
+ */
+ _player->set_burn_subtitles (true);
_film_connection = _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1));
- _player->set_approximate_size ();
_player_connection = _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1));
calculate_sizes ();
return;
}
- list<shared_ptr<PlayerVideo> > pvf = _player->get_video (p, accurate);
+ list<shared_ptr<PlayerVideo> > pvf;
+ try {
+ pvf = _player->get_video (p, accurate);
+ } catch (exception& e) {
+ error_dialog (this, wxString::Format (_("Could not get video for view (%s)"), std_to_wx(e.what()).data()));
+ }
+
if (!pvf.empty ()) {
try {
- _frame = pvf.front()->image (PIX_FMT_RGB24, true);
- _frame = _frame->scale (_frame->size(), Scaler::from_id ("fastbilinear"), PIX_FMT_RGB24, false);
+ _frame = pvf.front()->image (PIX_FMT_RGB24, true, boost::bind (&Log::dcp_log, _film->log().get(), _1, _2));
+
+ dcp::YUVToRGB yuv_to_rgb = dcp::YUV_TO_RGB_REC601;
+ if (pvf.front()->colour_conversion()) {
+ yuv_to_rgb = pvf.front()->colour_conversion().get().yuv_to_rgb();
+ }
+
+ _frame = _frame->scale (_frame->size(), yuv_to_rgb, PIX_FMT_RGB24, false);
_position = pvf.front()->time ();
_inter_position = pvf.front()->inter_position ();
_inter_size = pvf.front()->inter_size ();
_position = p;
}
- set_position_text ();
refresh_panel ();
_last_get_accurate = accurate;
FilmViewer::timer ()
{
get (_position + DCPTime::from_frames (1, _film->video_frame_rate ()), true);
-
- DCPTime const len = _film->length ();
-
- if (len.get ()) {
- int const new_slider_position = 4096 * _position.get() / len.get();
- if (new_slider_position != _slider->GetValue()) {
- _slider->SetValue (new_slider_position);
- }
- }
+ update_position_label ();
+ update_position_slider ();
}
-
void
FilmViewer::paint_panel ()
{
t = _film->length() - DCPTime::from_frames (1, _film->video_frame_rate ());
}
get (t, false);
+ update_position_label ();
}
void
calculate_sizes ();
get (_position, _last_get_accurate);
+ update_position_label ();
+ update_position_slider ();
}
void
_out_size.width = max (64, _out_size.width);
_out_size.height = max (64, _out_size.height);
- /* The player will round its image size down to the next lowest 4 pixels
- to speed up its scale, so do similar here to avoid black borders
- around things. This is a bit of a hack.
- */
- _out_size.width &= ~3;
- _out_size.height &= ~3;
-
_player->set_video_container_size (_out_size);
}
}
void
-FilmViewer::set_position_text ()
+FilmViewer::update_position_slider ()
+{
+ if (!_film) {
+ _slider->SetValue (0);
+ return;
+ }
+
+ DCPTime const len = _film->length ();
+
+ if (len.get ()) {
+ int const new_slider_position = 4096 * _position.get() / len.get();
+ if (new_slider_position != _slider->GetValue()) {
+ _slider->SetValue (new_slider_position);
+ }
+ }
+}
+
+void
+FilmViewer::update_position_label ()
{
if (!_film) {
_frame_number->SetLabel ("0");
_timecode->SetLabel ("0:0:0.0");
return;
}
-
+
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("%d"), int (rint (_position.seconds() * fps)) + 1));
-
- double w = _position.seconds ();
- int const h = (w / 3600);
- w -= h * 3600;
- int const m = (w / 60);
- w -= m * 60;
- int const s = floor (w);
- w -= s;
- int const f = rint (w * fps);
- _timecode->SetLabel (wxString::Format (wxT("%02d:%02d:%02d.%02d"), h, m, s, f));
+ _timecode->SetLabel (time_to_timecode (_position, fps));
}
void
}
get (p, true);
+ update_position_label ();
+ update_position_slider ();
}
void
FilmViewer::forward_clicked ()
{
get (_position + DCPTime::from_frames (1, _film->video_frame_rate ()), true);
+ update_position_label ();
+ update_position_slider ();
}
void
calculate_sizes ();
get (_position, _last_get_accurate);
+ update_position_label ();
+ update_position_slider ();
}
void