/*
- Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2013-2020 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#ifndef DCPOMATIC_PLAYER_H
#define DCPOMATIC_PLAYER_H
+#include "atmos_metadata.h"
#include "player_text.h"
#include "active_text.h"
#include "content_text.h"
#include "film.h"
#include "content.h"
+#include "content_atmos.h"
#include "position_image.h"
#include "piece.h"
#include "content_video.h"
class Font;
}
+class AtmosContent;
class PlayerVideo;
class Playlist;
class AudioBuffers;
class Player : public boost::enable_shared_from_this<Player>, public boost::noncopyable
{
public:
- Player (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist> playlist, dcpomatic::DCPTime playback_length);
+ Player (boost::shared_ptr<const Film>);
+ Player (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist> playlist);
~Player ();
bool pass ();
return _video_container_size;
}
- void set_playback_length (dcpomatic::DCPTime len);
void set_video_container_size (dcp::Size);
void set_ignore_video ();
void set_ignore_audio ();
* after the corresponding Video.
*/
boost::signals2::signal<void (PlayerText, TextType, boost::optional<DCPTextTrack>, dcpomatic::DCPTimePeriod)> Text;
+ boost::signals2::signal<void (boost::shared_ptr<const dcp::AtmosFrame>, dcpomatic::DCPTime, AtmosMetadata)> Atmos;
private:
friend class PlayerWrapper;
friend struct empty_test2;
friend struct check_reuse_old_data_test;
+ void construct ();
void setup_pieces ();
void setup_pieces_unlocked ();
void flush ();
dcpomatic::ContentTime dcp_to_content_time (boost::shared_ptr<const Piece> piece, dcpomatic::DCPTime t) const;
dcpomatic::DCPTime content_time_to_dcp (boost::shared_ptr<const Piece> piece, dcpomatic::ContentTime t) const;
boost::shared_ptr<PlayerVideo> black_player_video_frame (Eyes eyes) const;
+
void video (boost::weak_ptr<Piece>, ContentVideo);
void audio (boost::weak_ptr<Piece>, AudioStreamPtr, ContentAudio);
void bitmap_text_start (boost::weak_ptr<Piece>, boost::weak_ptr<const TextContent>, ContentBitmapText);
void plain_text_start (boost::weak_ptr<Piece>, boost::weak_ptr<const TextContent>, ContentStringText);
void subtitle_stop (boost::weak_ptr<Piece>, boost::weak_ptr<const TextContent>, dcpomatic::ContentTime);
+ void atmos (boost::weak_ptr<Piece>, ContentAtmos);
+
dcpomatic::DCPTime one_video_frame () const;
void fill_audio (dcpomatic::DCPTimePeriod period);
std::pair<boost::shared_ptr<AudioBuffers>, dcpomatic::DCPTime> discard_audio (
void emit_video (boost::shared_ptr<PlayerVideo> pv, dcpomatic::DCPTime time);
void do_emit_video (boost::shared_ptr<PlayerVideo> pv, dcpomatic::DCPTime time);
void emit_audio (boost::shared_ptr<AudioBuffers> data, dcpomatic::DCPTime time);
+ boost::shared_ptr<const Playlist> playlist () const;
/** Mutex to protect the whole Player state. When it's used for the preview we have
seek() and pass() called from the Butler thread and lots of other stuff called
mutable boost::mutex _mutex;
boost::shared_ptr<const Film> _film;
+ /** Playlist, or 0 if we are using the one from the _film */
boost::shared_ptr<const Playlist> _playlist;
/** > 0 if we are suspended (i.e. pass() and seek() do nothing) */
boost::atomic<int> _suspended;
std::list<boost::shared_ptr<Piece> > _pieces;
- /** Size of the image in the DCP (e.g. 1990x1080 for flat) */
+ /** Size of the image we are rendering to; this may be the DCP frame size, or
+ * the size of preview in a window.
+ */
dcp::Size _video_container_size;
boost::shared_ptr<Image> _black_image;