#include "cross.h"
#include "compose.hpp"
#include "exceptions.h"
-#include <boost/weak_ptr.hpp>
-#include <boost/shared_ptr.hpp>
+#include "video_content.h"
+
using std::cout;
using std::pair;
using std::make_pair;
using std::string;
-using boost::weak_ptr;
-using boost::shared_ptr;
+using std::weak_ptr;
+using std::shared_ptr;
using boost::bind;
using boost::optional;
using boost::function;
/* The butler must hear about things first, otherwise it might not sort out suspensions in time for
get_video() to be called in response to this signal.
*/
- _player_change_connection = _player->Change.connect (bind (&Butler::player_change, this, _1), boost::signals2::at_front);
+ _player_change_connection = _player->Change.connect (bind (&Butler::player_change, this, _1, _2), boost::signals2::at_front);
_thread = boost::thread (bind(&Butler::thread, this));
#ifdef DCPOMATIC_LINUX
pthread_setname_np (_thread.native_handle(), "butler");
{
boost::mutex::scoped_lock lm (_mutex);
- if (_suspended || (_video.empty() && !blocking)) {
+ auto setup_error = [this](Error* e, Error::Code fallback) {
if (e) {
- e->code = Error::AGAIN;
+ if (_died) {
+ e->code = Error::DIED;
+ e->message = _died_message;
+ } else if (_finished) {
+ e->code = Error::FINISHED;
+ } else {
+ e->code = fallback;
+ }
}
+ };
+
+ if (_video.empty() && (_finished || _died || (_suspended && !blocking))) {
+ setup_error (e, Error::AGAIN);
return make_pair(shared_ptr<PlayerVideo>(), DCPTime());
}
}
if (_video.empty()) {
- if (e) {
- if (_died) {
- e->code = Error::DIED;
- e->message = _died_message;
- } else if (_finished) {
- e->code = Error::FINISHED;
- } else {
- e->code = Error::NONE;
- }
- }
+ setup_error (e, Error::NONE);
return make_pair(shared_ptr<PlayerVideo>(), DCPTime());
}
- pair<shared_ptr<PlayerVideo>, DCPTime> const r = _video.get ();
+ auto const r = _video.get ();
_summon.notify_all ();
return r;
}
}
void
-Butler::player_change (ChangeType type)
+Butler::player_change (ChangeType type, int property)
{
+ if (property == VideoContentProperty::CROP) {
+ if (type == ChangeType::DONE) {
+ auto film = _film.lock();
+ if (film) {
+ _video.reset_metadata (film, _player->video_container_size());
+ }
+ }
+ return;
+ }
+
boost::mutex::scoped_lock lm (_mutex);
- if (type == CHANGE_TYPE_PENDING) {
+ if (type == ChangeType::PENDING) {
++_suspended;
- } else if (type == CHANGE_TYPE_DONE) {
+ } else if (type == ChangeType::DONE) {
--_suspended;
if (_died || _pending_seek_position) {
lm.unlock ();
}
DCPTime seek_to;
- DCPTime next = _video.get().second;
+ auto next = _video.get().second;
if (_awaiting && _awaiting > next) {
/* We have recently done a player_changed seek and our buffers haven't been refilled yet,
so assume that we're seeking to the same place as last time.
seek_unlocked (seek_to, true);
_awaiting = seek_to;
- } else if (type == CHANGE_TYPE_CANCELLED) {
+ } else if (type == ChangeType::CANCELLED) {
--_suspended;
}
void
Butler::text (PlayerText pt, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period)
{
- if (type != TEXT_CLOSED_CAPTION) {
+ if (type != TextType::CLOSED_CAPTION) {
return;
}