, _clear_required (false)
{
_panel->SetDoubleBuffered (true);
-#if wxMAJOR_VERSION == 2 && wxMINOR_VERSION >= 9
- _panel->SetBackgroundStyle (wxBG_STYLE_PAINT);
-#endif
_v_sizer = new wxBoxSizer (wxVERTICAL);
SetSizer (_v_sizer);
h_sizer->Add (_play_button, 0, wxEXPAND);
h_sizer->Add (_slider, 1, wxEXPAND);
- _v_sizer->Add (h_sizer, 0, wxEXPAND);
+ _v_sizer->Add (h_sizer, 0, wxEXPAND | wxALL, 6);
_panel->Connect (wxID_ANY, wxEVT_PAINT, wxPaintEventHandler (FilmViewer::paint_panel), 0, this);
_panel->Connect (wxID_ANY, wxEVT_SIZE, wxSizeEventHandler (FilmViewer::panel_sized), 0, this);
o.decode_audio = false;
o.decode_subtitles = true;
o.video_sync = false;
- _decoders = decoder_factory (_film, o, 0);
+ _decoders = decoder_factory (_film, o);
+ if (_decoders.video == 0) {
+ break;
+ }
_decoders.video->Video.connect (bind (&FilmViewer::process_video, this, _1, _2, _3));
_decoders.video->OutputChanged.connect (boost::bind (&FilmViewer::decoder_changed, this));
_decoders.video->set_subtitle_stream (_film->subtitle_stream());
update_from_raw ();
break;
case Film::SUBTITLE_STREAM:
- _decoders.video->set_subtitle_stream (_film->subtitle_stream ());
+ if (_decoders.video) {
+ _decoders.video->set_subtitle_stream (_film->subtitle_stream ());
+ }
break;
default:
break;
_film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1));
film_changed (Film::CONTENT);
- film_changed (Film::CROP);
film_changed (Film::FORMAT);
film_changed (Film::WITH_SUBTITLES);
film_changed (Film::SUBTITLE_OFFSET);
void
FilmViewer::decoder_changed ()
{
- if (_decoders.video->seek_to_last ()) {
+ if (_decoders.video == 0 || _decoders.video->seek_to_last ()) {
return;
}
void
FilmViewer::timer (wxTimerEvent &)
{
- if (!_film) {
+ if (!_film || !_decoders.video) {
return;
}
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);
+ dc.DrawRectangle (_display_frame_x + _film_size.width, 0, _display_frame_x, _film_size.height);
}
wxImage frame (_film_size.width, _film_size.height, _display_frame->data()[0], true);
void
FilmViewer::slider_moved (wxScrollEvent &)
{
- if (!_film || !_film->length()) {
+ if (!_film || !_film->length() || !_decoders.video) {
return;
}
}
if (_raw_sub) {
+
+ /* Our output is already cropped by the decoder, so we need to account for that
+ when working out the scale that we are applying.
+ */
+
+ Size const cropped_size = _film->cropped_size (_film->size ());
+
Rect tx = subtitle_transformed_area (
- float (_film_size.width) / _film->size().width,
- float (_film_size.height) / _film->size().height,
+ float (_film_size.width) / cropped_size.width,
+ float (_film_size.height) / cropped_size.height,
_raw_sub->area(), _film->subtitle_offset(), _film->subtitle_scale()
);
{
/* Clear our raw frame in case we don't get a new one */
_raw_frame.reset ();
+
+ if (_decoders.video == 0) {
+ _display_frame.reset ();
+ return;
+ }
try {
_got_frame = false;