Fix implementation of delay in 7758260; it needs to apply to
authorCarl Hetherington <cth@carlh.net>
Fri, 23 Feb 2018 00:57:04 +0000 (00:57 +0000)
committerCarl Hetherington <cth@carlh.net>
Fri, 23 Feb 2018 00:58:08 +0000 (00:58 +0000)
anything passed to emit_video(), not just things that come from
decoders.

src/lib/delay.cc [deleted file]
src/lib/delay.h [deleted file]
src/lib/player.cc
src/lib/player.h
src/lib/shuffler.cc
src/lib/shuffler.h
src/lib/video_adjuster.cc [deleted file]
src/lib/video_adjuster.h [deleted file]
src/lib/wscript

diff --git a/src/lib/delay.cc b/src/lib/delay.cc
deleted file mode 100644 (file)
index 6f98b3b..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-    Copyright (C) 2018 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 "delay.h"
-#include "content_video.h"
-#include "dcpomatic_assert.h"
-#include <boost/foreach.hpp>
-#include <iostream>
-
-using std::make_pair;
-using boost::weak_ptr;
-using boost::shared_ptr;
-using boost::optional;
-
-void
-Delay::video (weak_ptr<Piece> weak_piece, ContentVideo video)
-{
-       _store.push_back (make_pair (weak_piece, video));
-       /* Delay by 2 frames */
-       while (_store.size() > 2) {
-               Video (_store.front().first, _store.front().second);
-               _store.pop_front ();
-       }
-}
diff --git a/src/lib/delay.h b/src/lib/delay.h
deleted file mode 100644 (file)
index fa08b05..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-    Copyright (C) 2018 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/>.
-
-*/
-
-#ifndef DCPOMATIC_DELAY_H
-#define DCPOMATIC_DELAY_H
-
-#include "types.h"
-#include "video_adjuster.h"
-#include "content_video.h"
-#include <boost/signals2.hpp>
-
-class Piece;
-
-/** A class which `delays' received video by 2 frames; i.e. when it receives
- *  a video frame it emits the last-but-one it received.
- */
-class Delay : public VideoAdjuster
-{
-public:
-       void video (boost::weak_ptr<Piece>, ContentVideo video);
-
-private:
-       boost::optional<ContentVideo> _last;
-};
-
-#endif
index a8a72a229a2b756e5e9e03d3fe3b6de228ef409b..87a294042cb05f6a5f3680b736fd7a16804ff4c0 100644 (file)
@@ -49,7 +49,6 @@
 #include "image_decoder.h"
 #include "compose.hpp"
 #include "shuffler.h"
-#include "delay.h"
 #include <dcp/reel.h>
 #include <dcp/reel_sound_asset.h>
 #include <dcp/reel_subtitle_asset.h>
@@ -90,7 +89,6 @@ Player::Player (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist
        , _play_referenced (false)
        , _audio_merger (_film->audio_frame_rate())
        , _shuffler (0)
-       , _delay (0)
 {
        _film_changed_connection = _film->Changed.connect (bind (&Player::film_changed, this, _1));
        _playlist_changed_connection = _playlist->Changed.connect (bind (&Player::playlist_changed, this));
@@ -105,7 +103,6 @@ Player::Player (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist
 Player::~Player ()
 {
        delete _shuffler;
-       delete _delay;
 }
 
 void
@@ -117,10 +114,6 @@ Player::setup_pieces ()
        _shuffler = new Shuffler();
        _shuffler->Video.connect(bind(&Player::video, this, _1, _2));
 
-       delete _delay;
-       _delay = new Delay();
-       _delay->Video.connect(bind(&Player::video, this, _1, _2));
-
        BOOST_FOREACH (shared_ptr<Content> i, _playlist->content ()) {
 
                if (!i->paths_valid ()) {
@@ -159,10 +152,7 @@ Player::setup_pieces ()
                                /* We need a Shuffler to cope with 3D L/R video data arriving out of sequence */
                                decoder->video->Data.connect (bind (&Shuffler::video, _shuffler, weak_ptr<Piece>(piece), _1));
                        } else {
-                               /* We need a Delay to give a little wiggle room to ensure that relevent subtitles arrive at the
-                                  player before the video that requires them.
-                               */
-                               decoder->video->Data.connect (bind (&Delay::video, _delay, weak_ptr<Piece>(piece), _1));
+                               decoder->video->Data.connect (bind (&Player::video, this, weak_ptr<Piece>(piece), _1));
                        }
                }
 
@@ -660,8 +650,11 @@ Player::pass ()
 
        if (done) {
                _shuffler->flush ();
-               _delay->flush ();
+               for (list<pair<shared_ptr<PlayerVideo>, DCPTime> >::const_iterator i = _delay.begin(); i != _delay.end(); ++i) {
+                       do_emit_video(i->first, i->second);
+               }
        }
+
        return done;
 }
 
@@ -943,9 +936,7 @@ Player::seek (DCPTime time, bool accurate)
                _shuffler->clear ();
        }
 
-       if (_delay) {
-               _delay->clear ();
-       }
+       _delay.clear ();
 
        if (_audio_processor) {
                _audio_processor->flush ();
@@ -987,6 +978,22 @@ Player::seek (DCPTime time, bool accurate)
 
 void
 Player::emit_video (shared_ptr<PlayerVideo> pv, DCPTime time)
+{
+       /* We need a delay to give a little wiggle room to ensure that relevent subtitles arrive at the
+          player before the video that requires them.
+       */
+       _delay.push_back (make_pair (pv, time));
+       if (_delay.size() < 2) {
+               return;
+       }
+
+       pair<shared_ptr<PlayerVideo>, DCPTime> to_do = _delay.front();
+       _delay.pop_front();
+       do_emit_video (to_do.first, to_do.second);
+}
+
+void
+Player::do_emit_video (shared_ptr<PlayerVideo> pv, DCPTime time)
 {
        optional<PositionImage> subtitles = subtitles_for_frame (time);
        if (subtitles) {
index 58ed4e36959611b8d32618a462506b85f83ed46a..8142f8e7f7df29cac429cb1042dad67c2cfa1d86 100644 (file)
@@ -33,7 +33,6 @@
 #include "audio_stream.h"
 #include "audio_merger.h"
 #include "empty.h"
-#include "delay.h"
 #include <boost/shared_ptr.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <list>
@@ -121,6 +120,7 @@ private:
                ) const;
        boost::optional<PositionImage> subtitles_for_frame (DCPTime time) const;
        void emit_video (boost::shared_ptr<PlayerVideo> pv, DCPTime time);
+       void do_emit_video (boost::shared_ptr<PlayerVideo> pv, DCPTime time);
        void emit_audio (boost::shared_ptr<AudioBuffers> data, DCPTime time);
 
        boost::shared_ptr<const Film> _film;
@@ -160,7 +160,7 @@ private:
 
        AudioMerger _audio_merger;
        Shuffler* _shuffler;
-       Delay* _delay;
+       std::list<std::pair<boost::shared_ptr<PlayerVideo>, DCPTime> > _delay;
 
        class StreamState
        {
index 4b8474ab3028eeb5b99e091aba9d426e15302c8b..0ec4daf5ad654bab9a1c8ef17f17eddfca96bb49 100644 (file)
@@ -78,6 +78,14 @@ Shuffler::video (weak_ptr<Piece> weak_piece, ContentVideo video)
 void
 Shuffler::clear ()
 {
-       VideoAdjuster::clear ();
+       _store.clear ();
        _last = optional<ContentVideo>();
 }
+
+void
+Shuffler::flush ()
+{
+       BOOST_FOREACH (Store i, _store) {
+               Video (i.first, i.second);
+       }
+}
index 2c1d0677f9747000de688cf5e70428b8e744e996..3eed3e4f005a1db2bfb92d80d91a07877a127c4d 100644 (file)
 
 #include "types.h"
 #include "content_video.h"
-#include "video_adjuster.h"
 #include <boost/signals2.hpp>
 
 class Piece;
 
-class Shuffler : public VideoAdjuster
+class Shuffler
 {
 public:
        void clear ();
-
+       void flush ();
        void video (boost::weak_ptr<Piece>, ContentVideo video);
 
+       boost::signals2::signal<void (boost::weak_ptr<Piece>, ContentVideo)> Video;
+
+       typedef std::pair<boost::weak_ptr<Piece>, ContentVideo> Store;
+
 private:
+       std::list<Store> _store;
        boost::optional<ContentVideo> _last;
 };
diff --git a/src/lib/video_adjuster.cc b/src/lib/video_adjuster.cc
deleted file mode 100644 (file)
index c945c66..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-    Copyright (C) 2018 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 "video_adjuster.h"
-#include "content_video.h"
-#include <boost/foreach.hpp>
-
-void
-VideoAdjuster::flush ()
-{
-       BOOST_FOREACH (Store i, _store) {
-               Video (i.first, i.second);
-       }
-}
-
-void
-VideoAdjuster::clear ()
-{
-       _store.clear ();
-}
diff --git a/src/lib/video_adjuster.h b/src/lib/video_adjuster.h
deleted file mode 100644 (file)
index 6fde2ba..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-    Copyright (C) 2018 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/>.
-
-*/
-
-#ifndef DCPOMATIC_VIDEO_ADJUSTER_H
-#define DCPOMATIC_VIDEO_ADJUSTER_H
-
-#include <boost/signals2.hpp>
-
-class Piece;
-class ContentVideo;
-
-/** Parent class for short delays of video content done by the Player
- *  to work around various problems.
- */
-class VideoAdjuster
-{
-public:
-       virtual ~VideoAdjuster() {}
-
-       virtual void clear ();
-       void flush ();
-
-       boost::signals2::signal<void (boost::weak_ptr<Piece>, ContentVideo)> Video;
-
-       typedef std::pair<boost::weak_ptr<Piece>, ContentVideo> Store;
-
-protected:
-       std::list<Store> _store;
-};
-
-#endif
index 46ced80ab661fd92e93f0290b54fce6d9382be1b..ae8ab30cba195e1ca4589a8e59f96629f61541e6 100644 (file)
@@ -63,7 +63,6 @@ sources = """
           decoder.cc
           decoder_factory.cc
           decoder_part.cc
-          delay.cc
           digester.cc
           dkdm_wrapper.cc
           dolby_cp750.cc
@@ -147,7 +146,6 @@ sources = """
           upmixer_a.cc
           upmixer_b.cc
           util.cc
-          video_adjuster.cc
           video_content.cc
           video_content_scale.cc
           video_decoder.cc