Factor out decoder creation to a factory method.
authorCarl Hetherington <cth@carlh.net>
Thu, 26 May 2016 09:57:06 +0000 (10:57 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 26 May 2016 09:57:06 +0000 (10:57 +0100)
src/lib/decoder_factory.cc [new file with mode: 0644]
src/lib/decoder_factory.h [new file with mode: 0644]
src/lib/player.cc
src/lib/wscript
src/wx/subtitle_panel.cc

diff --git a/src/lib/decoder_factory.cc b/src/lib/decoder_factory.cc
new file mode 100644 (file)
index 0000000..7f53c9a
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+    Copyright (C) 2016 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "ffmpeg_content.h"
+#include "ffmpeg_decoder.h"
+#include "dcp_content.h"
+#include "dcp_decoder.h"
+#include "image_content.h"
+#include "image_decoder.h"
+#include "text_subtitle_content.h"
+#include "text_subtitle_decoder.h"
+#include "dcp_subtitle_content.h"
+#include "dcp_subtitle_decoder.h"
+#include "video_mxf_content.h"
+#include "video_mxf_decoder.h"
+#include <boost/foreach.hpp>
+
+using std::list;
+using boost::shared_ptr;
+using boost::dynamic_pointer_cast;
+
+shared_ptr<Decoder>
+decoder_factory (shared_ptr<const Content> content, list<shared_ptr<ImageDecoder> > old_image_decoders, shared_ptr<Log> log, bool fast)
+{
+       shared_ptr<const FFmpegContent> fc = dynamic_pointer_cast<const FFmpegContent> (content);
+       if (fc) {
+               return shared_ptr<Decoder> (new FFmpegDecoder (fc, log, fast));
+       }
+
+       shared_ptr<const DCPContent> dc = dynamic_pointer_cast<const DCPContent> (content);
+       if (dc) {
+               return shared_ptr<Decoder> (new DCPDecoder (dc, log, fast));
+       }
+
+       shared_ptr<const ImageContent> ic = dynamic_pointer_cast<const ImageContent> (content);
+       if (ic) {
+               shared_ptr<Decoder> decoder;
+
+               /* See if we can re-use an old ImageDecoder */
+               BOOST_FOREACH (shared_ptr<ImageDecoder> i, old_image_decoders) {
+                       if (i->content() == ic) {
+                               decoder = i;
+                       }
+               }
+
+               if (!decoder) {
+                       decoder.reset (new ImageDecoder (ic, log));
+               }
+
+               return decoder;
+       }
+
+       shared_ptr<const TextSubtitleContent> rc = dynamic_pointer_cast<const TextSubtitleContent> (content);
+       if (rc) {
+               return shared_ptr<Decoder> (new TextSubtitleDecoder (rc));
+       }
+
+       shared_ptr<const DCPSubtitleContent> dsc = dynamic_pointer_cast<const DCPSubtitleContent> (content);
+       if (dsc) {
+               return shared_ptr<Decoder> (new DCPSubtitleDecoder (dsc));
+       }
+
+       shared_ptr<const VideoMXFContent> vmc = dynamic_pointer_cast<const VideoMXFContent> (content);
+       if (vmc) {
+               return shared_ptr<Decoder> (new VideoMXFDecoder (vmc, log));
+       }
+
+       return shared_ptr<Decoder> ();
+}
diff --git a/src/lib/decoder_factory.h b/src/lib/decoder_factory.h
new file mode 100644 (file)
index 0000000..6a4e55e
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+    Copyright (C) 2016 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+class ImageDecoder;
+
+extern boost::shared_ptr<Decoder> decoder_factory (
+       boost::shared_ptr<const Content> content,
+       std::list<boost::shared_ptr<ImageDecoder> > old_image_decoders,
+       boost::shared_ptr<Log> log,
+       bool fast
+       );
index 6d5b9f309d9a944a77a46461677a066a382cf32d..d437d5b1bf964e99cc3c3130b0035c26a95907ca 100644 (file)
 
 #include "player.h"
 #include "film.h"
-#include "ffmpeg_decoder.h"
-#include "video_decoder.h"
-#include "audio_decoder.h"
 #include "audio_buffers.h"
-#include "audio_content.h"
-#include "ffmpeg_content.h"
-#include "image_decoder.h"
 #include "content_audio.h"
-#include "image_content.h"
-#include "subtitle_content.h"
-#include "text_subtitle_decoder.h"
-#include "text_subtitle_content.h"
-#include "video_mxf_decoder.h"
-#include "video_mxf_content.h"
 #include "dcp_content.h"
 #include "job.h"
 #include "image.h"
 #include "content_video.h"
 #include "player_video.h"
 #include "frame_rate_change.h"
-#include "dcp_content.h"
-#include "dcp_decoder.h"
-#include "dcp_subtitle_content.h"
-#include "dcp_subtitle_decoder.h"
 #include "audio_processor.h"
 #include "playlist.h"
 #include "referenced_reel_asset.h"
+#include "decoder_factory.h"
+#include "decoder.h"
+#include "video_decoder.h"
+#include "audio_decoder.h"
+#include "subtitle_content.h"
+#include "subtitle_decoder.h"
+#include "ffmpeg_content.h"
+#include "audio_content.h"
+#include "content_subtitle.h"
+#include "dcp_decoder.h"
+#include "image_decoder.h"
 #include <dcp/reel.h>
 #include <dcp/reel_sound_asset.h>
 #include <dcp/reel_subtitle_asset.h>
@@ -120,7 +115,14 @@ Player::Player (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist
 void
 Player::setup_pieces ()
 {
-       list<shared_ptr<Piece> > old_pieces = _pieces;
+       list<shared_ptr<ImageDecoder> > old_image_decoders;
+       BOOST_FOREACH (shared_ptr<Piece> i, _pieces) {
+               shared_ptr<ImageDecoder> imd = dynamic_pointer_cast<ImageDecoder> (i->decoder);
+               if (imd) {
+                       old_image_decoders.push_back (imd);
+               }
+       }
+
        _pieces.clear ();
 
        BOOST_FOREACH (shared_ptr<Content> i, _playlist->content ()) {
@@ -129,65 +131,8 @@ Player::setup_pieces ()
                        continue;
                }
 
-               shared_ptr<Decoder> decoder;
-               optional<FrameRateChange> frc;
-
-               /* FFmpeg */
-               shared_ptr<const FFmpegContent> fc = dynamic_pointer_cast<const FFmpegContent> (i);
-               if (fc) {
-                       decoder.reset (new FFmpegDecoder (fc, _film->log(), _fast));
-                       frc = FrameRateChange (fc->active_video_frame_rate(), _film->video_frame_rate());
-               }
-
-               shared_ptr<const DCPContent> dc = dynamic_pointer_cast<const DCPContent> (i);
-               if (dc) {
-                       decoder.reset (new DCPDecoder (dc, _film->log(), _fast));
-                       frc = FrameRateChange (dc->active_video_frame_rate(), _film->video_frame_rate());
-               }
-
-               /* ImageContent */
-               shared_ptr<const ImageContent> ic = dynamic_pointer_cast<const ImageContent> (i);
-               if (ic) {
-                       /* See if we can re-use an old ImageDecoder */
-                       for (list<shared_ptr<Piece> >::const_iterator j = old_pieces.begin(); j != old_pieces.end(); ++j) {
-                               shared_ptr<ImageDecoder> imd = dynamic_pointer_cast<ImageDecoder> ((*j)->decoder);
-                               if (imd && imd->content() == ic) {
-                                       decoder = imd;
-                               }
-                       }
-
-                       if (!decoder) {
-                               decoder.reset (new ImageDecoder (ic, _film->log()));
-                       }
-
-                       frc = FrameRateChange (ic->active_video_frame_rate(), _film->video_frame_rate());
-               }
-
-               /* It's questionable whether subtitle content should have a video frame rate; perhaps
-                  it should be assumed that any subtitle content has been prepared at the same rate
-                  as simultaneous video content (like we do with audio).
-               */
-
-               /* TextSubtitleContent */
-               shared_ptr<const TextSubtitleContent> rc = dynamic_pointer_cast<const TextSubtitleContent> (i);
-               if (rc) {
-                       decoder.reset (new TextSubtitleDecoder (rc));
-                       frc = FrameRateChange (rc->active_video_frame_rate(), _film->video_frame_rate());
-               }
-
-               /* DCPSubtitleContent */
-               shared_ptr<const DCPSubtitleContent> dsc = dynamic_pointer_cast<const DCPSubtitleContent> (i);
-               if (dsc) {
-                       decoder.reset (new DCPSubtitleDecoder (dsc));
-                       frc = FrameRateChange (dsc->active_video_frame_rate(), _film->video_frame_rate());
-               }
-
-               /* VideoMXFContent */
-               shared_ptr<const VideoMXFContent> vmc = dynamic_pointer_cast<const VideoMXFContent> (i);
-               if (vmc) {
-                       decoder.reset (new VideoMXFDecoder (vmc, _film->log()));
-                       frc = FrameRateChange (vmc->active_video_frame_rate(), _film->video_frame_rate());
-               }
+               shared_ptr<Decoder> decoder = decoder_factory (i, old_image_decoders, _film->log(), _fast);
+               FrameRateChange frc (i->active_video_frame_rate(), _film->video_frame_rate());
 
                if (!decoder) {
                        /* Not something that we can decode; e.g. Atmos content */
@@ -202,7 +147,7 @@ Player::setup_pieces ()
                        decoder->audio->set_ignore ();
                }
 
-               _pieces.push_back (shared_ptr<Piece> (new Piece (i, decoder, frc.get ())));
+               _pieces.push_back (shared_ptr<Piece> (new Piece (i, decoder, frc)));
        }
 
        _have_valid_pieces = true;
index 6bfd21ce8ab2c49c15f731ce06e38c9d8738a93f..658abb98715a67609eb66f232e6aadc86833015f 100644 (file)
@@ -55,6 +55,7 @@ sources = """
           dcp_video.cc
           dcpomatic_socket.cc
           dcpomatic_time.cc
+          decoder_factory.cc
           dolby_cp750.cc
           emailer.cc
           encoder.cc
index 52b23f5a20069eab46138bbd436be696f45ef319..31ee2c4777686f9a172c6d676516824510595716 100644 (file)
@@ -34,6 +34,7 @@
 #include "lib/dcp_subtitle_decoder.h"
 #include "lib/dcp_content.h"
 #include "lib/subtitle_content.h"
+#include "lib/decoder_factory.h"
 #include <wx/spinctrl.h>
 #include <boost/foreach.hpp>
 
@@ -384,17 +385,8 @@ SubtitlePanel::subtitle_view_clicked ()
        ContentList c = _parent->selected_subtitle ();
        DCPOMATIC_ASSERT (c.size() == 1);
 
-       shared_ptr<Decoder> decoder;
-
-       shared_ptr<TextSubtitleContent> sr = dynamic_pointer_cast<TextSubtitleContent> (c.front ());
-       if (sr) {
-               decoder.reset (new TextSubtitleDecoder (sr));
-       }
-
-       shared_ptr<DCPSubtitleContent> dc = dynamic_pointer_cast<DCPSubtitleContent> (c.front ());
-       if (dc) {
-               decoder.reset (new DCPSubtitleDecoder (dc));
-       }
+       list<shared_ptr<ImageDecoder> > image_decoders;
+       shared_ptr<Decoder> decoder = decoder_factory (c.front(), image_decoders, _parent->film()->log(), false);
 
        if (decoder) {
                _subtitle_view = new SubtitleView (this, _parent->film(), decoder, c.front()->position ());