From 6198597b190c3c730057bee54e0421fcd7bcb795 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 3 Apr 2013 19:23:20 +0100 Subject: [PATCH 1/1] Film viewer kind of working. --- src/tools/dvdomatic.cc | 4 +++- src/wx/film_editor.cc | 11 +++++++++++ src/wx/film_viewer.cc | 14 +++++++++----- src/wx/film_viewer.h | 19 +++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index a78d03794..a0e7f0de8 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -449,7 +449,9 @@ setup_i18n () if (Config::instance()->language()) { wxLanguageInfo const * li = wxLocale::FindLanguageInfo (std_to_wx (Config::instance()->language().get())); - language = li->Language; + if (li) { + language = li->Language; + } } if (wxLocale::IsAvailable (language)) { diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index 5143bd370..33919d946 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -690,6 +690,13 @@ FilmEditor::film_changed (Film::Property p) void FilmEditor::film_content_changed (int p) { + if (!_film) { + /* We call this method ourselves (as well as using it as a signal handler) + so _film can be 0. + */ + return; + } + if (p == FFmpegContentProperty::SUBTITLE_STREAMS) { setup_subtitle_control_sensitivity (); setup_streams (); @@ -1033,6 +1040,10 @@ FilmEditor::edit_dci_button_clicked (wxCommandEvent &) void FilmEditor::setup_streams () { + if (!_film) { + return; + } + _ffmpeg_audio_stream->Clear (); vector a = _film->ffmpeg_audio_streams (); for (vector::iterator i = a.begin(); i != a.end(); ++i) { diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 54ef28ff0..76cff3f65 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -107,10 +107,12 @@ FilmViewer::film_changed (Film::Property p) break; } case Film::WITH_SUBTITLES: - setup_player (); - /* fall through */ case Film::SUBTITLE_OFFSET: case Film::SUBTITLE_SCALE: + raw_to_display (); + _panel->Refresh (); + _panel->Update (); + break; case Film::SCALER: case Film::FILTERS: case Film::CROP: @@ -126,10 +128,12 @@ FilmViewer::setup_player () { _player = _film->player (); _player->disable_audio (); - if (!_film->with_subtitles ()) { - _player->disable_subtitles (); - } _player->disable_video_sync (); + + /* Don't disable subtitles here as we may need them, and it's nice to be able to turn them + on and off without needing obtain a new Player. + */ + _player->Video.connect (bind (&FilmViewer::process_video, this, _1, _2, _3)); } diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index e28703fdd..bf956ef95 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -32,6 +32,25 @@ class Subtitle; /** @class FilmViewer * @brief A wx widget to view a preview of a Film. + * + * The film takes the following path through the viewer: + * + * 1. get_frame() asks our _player to decode some data. If it does, process_video() + * will be called. + * + * 2. process_video() takes the image and subtitle from the decoder (_raw_frame and _raw_sub) + * and calls raw_to_display(). + * + * 3. raw_to_display() copies _raw_frame to _display_frame, processing it and scaling it. + * + * 4. calling _panel->Refresh() and _panel->Update() results in paint_panel() being called; + * this creates frame_bitmap from _display_frame and blits it to the display. It also + * blits the subtitle, if required. + * + * update_from_decoder() asks the player to re-emit its current frame on the next pass(), and then + * starts from step #1. + * + * update_from_raw() starts at step #3, then calls _panel->Refresh and _panel->Update. */ class FilmViewer : public wxPanel { -- 2.30.2