#include "wx_util.h"
#include "film_viewer.h"
#include "lib/butler.h"
+#include "lib/dcpomatic_log.h"
#include <boost/optional.hpp>
-using boost::shared_ptr;
+using std::pair;
+using std::shared_ptr;
using boost::optional;
VideoView::VideoView (FilmViewer* viewer)
: _viewer (viewer)
-#ifdef DCPOMATIC_VARIANT_SWAROOP
- , _in_watermark (false)
-#endif
, _state_timer ("viewer")
, _video_frame_rate (0)
, _eyes (EYES_LEFT)
, _three_d (false)
, _dropped (0)
+ , _errored (0)
, _gets (0)
{
/** Could be called from any thread.
* @param non_blocking true to return false quickly if no video is available quickly.
- * @return false if we gave up because it would take too long, otherwise true.
+ * @return FAIL if there's no frame, AGAIN if the method should be called again, or SUCCESS
+ * if there is a frame.
*/
-bool
+VideoView::NextFrameResult
VideoView::get_next_frame (bool non_blocking)
{
if (length() == dcpomatic::DCPTime()) {
- return true;
+ return FAIL;
}
shared_ptr<Butler> butler = _viewer->butler ();
if (!butler) {
- return false;
+ return FAIL;
}
add_get ();
do {
Butler::Error e;
- _player_video = butler->get_video (!non_blocking, &e);
- if (!_player_video.first && e == Butler::AGAIN) {
- return false;
+ pair<shared_ptr<PlayerVideo>, dcpomatic::DCPTime> pv = butler->get_video (!non_blocking, &e);
+ if (e.code == Butler::Error::DIED) {
+ LOG_ERROR ("Butler died with %1", e.summary());
}
+ if (!pv.first) {
+ return e.code == Butler::Error::AGAIN ? AGAIN : FAIL;
+ }
+ _player_video = pv;
} while (
_player_video.first &&
_three_d &&
_player_video.first->eyes() != EYES_BOTH
);
- return true;
+ if (_player_video.first && _player_video.first->error()) {
+ ++_errored;
+ }
+
+ return SUCCESS;
}
dcpomatic::DCPTime
{
boost::mutex::scoped_lock lm (_mutex);
_dropped = 0;
+ _errored = 0;
}
bool
-VideoView::refresh_metadata (shared_ptr<const Film> film, dcp::Size video_container_size, dcp::Size film_frame_size)
+VideoView::reset_metadata (shared_ptr<const Film> film, dcp::Size player_video_container_size)
{
- boost::mutex::scoped_lock lm (_mutex);
- if (!_player_video.first) {
+ pair<shared_ptr<PlayerVideo>, dcpomatic::DCPTime> pv = player_video ();
+ if (!pv.first) {
return false;
}
- if (!_player_video.first->reset_metadata (film, video_container_size, film_frame_size)) {
+ if (!pv.first->reset_metadata(film, player_video_container_size)) {
return false;
}