/*
- Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2021 Carl Hetherington <cth@carlh.net>
- This program is free software; you can redistribute it and/or modify
+ 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.
- This program is distributed in the hope that it will be useful,
+ 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 this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
*/
+
+#include "audio_content.h"
+#include "content.h"
#include "piece.h"
-#include "player.h"
-using boost::shared_ptr;
-Piece::Piece (shared_ptr<Content> c)
- : content (c)
- , video_position (c->position ())
- , audio_position (c->position ())
- , repeat_to_do (0)
- , repeat_done (0)
-{
+using std::shared_ptr;
+using namespace dcpomatic;
-}
-Piece::Piece (shared_ptr<Content> c, shared_ptr<Decoder> d)
+Piece::Piece (shared_ptr<Content> c, shared_ptr<Decoder> d, FrameRateChange f)
: content (c)
, decoder (d)
- , video_position (c->position ())
- , audio_position (c->position ())
- , repeat_to_do (0)
- , repeat_done (0)
+ , frc (f)
{
-
+ if (content->audio) {
+ for (auto j: content->audio->streams()) {
+ _stream_last_push_end[j] = content->position();
+ }
+ }
}
-/** Set this piece to repeat a video frame a given number of times */
-void
-Piece::set_repeat (IncomingVideo video, int num)
-{
- repeat_video = video;
- repeat_to_do = num;
- repeat_done = 0;
-}
+
void
-Piece::reset_repeat ()
+Piece::update_pull_to (DCPTime& pull_to) const
{
- repeat_video.image.reset ();
- repeat_to_do = 0;
- repeat_done = 0;
-}
+ if (done) {
+ return;
+ }
-bool
-Piece::repeating () const
-{
- return repeat_done != repeat_to_do;
+ for (auto const& i: _stream_last_push_end) {
+ pull_to = std::min(pull_to, i.second);
+ }
}
+
void
-Piece::repeat (Player* player)
+Piece::set_last_push_end (AudioStreamPtr stream, DCPTime end)
{
- player->process_video (
- repeat_video.weak_piece,
- repeat_video.image,
- repeat_video.eyes,
- repeat_video.part,
- repeat_done > 0,
- repeat_video.frame,
- (repeat_done + 1) * (TIME_HZ / player->_film->video_frame_rate ())
- );
-
- ++repeat_done;
+ DCPOMATIC_ASSERT (_stream_last_push_end.find(stream) != _stream_last_push_end.end());
+ _stream_last_push_end[stream] = end;
}