Film viewer kind of working.
authorCarl Hetherington <cth@carlh.net>
Wed, 3 Apr 2013 18:23:20 +0000 (19:23 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 3 Apr 2013 18:23:20 +0000 (19:23 +0100)
src/tools/dvdomatic.cc
src/wx/film_editor.cc
src/wx/film_viewer.cc
src/wx/film_viewer.h

index a78d037941bd5ab004d358fa343eaf5988a81d08..a0e7f0de85e2f0f1f1b73487eaf8bcc742406715 100644 (file)
@@ -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)) {
index 5143bd3704eb6a83424391fe96f09888710fcddc..33919d946bf153e4240f8e00a696dc90d9ac437a 100644 (file)
@@ -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) {
index 54ef28ff06706ce1c64a3136006938b1d3da9327..76cff3f6543af6511ce5f78bcc776f82c966f4bd 100644 (file)
@@ -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));
 }
 
index e28703fdd89ea9e3cbd9981ac39ead1edbbb103f..bf956ef95d3dc29ce2378d9261aaefbf5ac64f8e 100644 (file)
@@ -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
 {