diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-04-03 19:23:20 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-04-03 19:23:20 +0100 |
| commit | 6198597b190c3c730057bee54e0421fcd7bcb795 (patch) | |
| tree | 373a2b155e473687d502b6d4655c4eb75c91f7d0 /src | |
| parent | 9c3e4462d32c726a6c257b0a40e642ab23d9526a (diff) | |
Film viewer kind of working.
Diffstat (limited to 'src')
| -rw-r--r-- | src/tools/dvdomatic.cc | 4 | ||||
| -rw-r--r-- | src/wx/film_editor.cc | 11 | ||||
| -rw-r--r-- | src/wx/film_viewer.cc | 14 | ||||
| -rw-r--r-- | 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<FFmpegAudioStream> a = _film->ffmpeg_audio_streams (); for (vector<FFmpegAudioStream>::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 { |
