diff options
| author | Carl Hetherington <cth@carlh.net> | 2019-05-21 01:47:22 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2019-05-21 01:47:22 +0100 |
| commit | 11c07c6fd98620c859c7d3dcf6a4bbf6a05e567e (patch) | |
| tree | d25e61214ab447b2481a5dd5be733ffc1208ee88 /src/lib | |
| parent | 402aeb2d6301503f83f7912147b2d2ebe02354f5 (diff) | |
Give an error if 2D content is set to 3D (#1565). Also run
3D tests with more parallel jobs to speed them up.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/job_manager.h | 2 | ||||
| -rw-r--r-- | src/lib/video_decoder.cc | 27 | ||||
| -rw-r--r-- | src/lib/video_decoder.h | 5 |
3 files changed, 27 insertions, 7 deletions
diff --git a/src/lib/job_manager.h b/src/lib/job_manager.h index e0b72994d..2788fc657 100644 --- a/src/lib/job_manager.h +++ b/src/lib/job_manager.h @@ -32,6 +32,7 @@ class Job; class Film; class Playlist; +struct threed_test7; extern bool wait_for_jobs (); @@ -73,6 +74,7 @@ public: private: /* This function is part of the test suite */ friend bool ::wait_for_jobs (); + friend struct threed_test7; JobManager (); ~JobManager (); diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc index 9f29a03bf..0b97e5e87 100644 --- a/src/lib/video_decoder.cc +++ b/src/lib/video_decoder.cc @@ -66,12 +66,28 @@ VideoDecoder::emit (shared_ptr<const Film> film, shared_ptr<const ImageProxy> im break; case VIDEO_FRAME_TYPE_3D: { - /* We receive the same frame index twice for 3D; hence we know which + /* We should receive the same frame index twice for 3D; hence we know which frame this one is. */ - bool const same = (_last_emitted && _last_emitted.get() == frame); - Data (ContentVideo (image, frame, same ? EYES_RIGHT : EYES_LEFT, PART_WHOLE)); - _last_emitted = frame; + bool const same = (_last_emitted_frame && _last_emitted_frame.get() == frame); + if (!same && _last_emitted_eyes && *_last_emitted_eyes == EYES_LEFT) { + /* We just got a new frame index but the last frame was left-eye; it looks like + this content is not really 3D. + */ + boost::throw_exception ( + DecodeError( + String::compose( + _("The content file %1 is set as 3D but does not appear to contain 3D images. Please set it to 2D. " + "You can still make a 3D DCP from this content by ticking the 3D option in the DCP video tab."), + _content->path(0) + ) + ) + ); + } + Eyes const eyes = same ? EYES_RIGHT : EYES_LEFT; + Data (ContentVideo (image, frame, eyes, PART_WHOLE)); + _last_emitted_frame = frame; + _last_emitted_eyes = eyes; break; } case VIDEO_FRAME_TYPE_3D_ALTERNATE: @@ -103,5 +119,6 @@ void VideoDecoder::seek () { _position = ContentTime(); - _last_emitted.reset (); + _last_emitted_frame.reset (); + _last_emitted_eyes.reset (); } diff --git a/src/lib/video_decoder.h b/src/lib/video_decoder.h index c2ba8386e..76a91c525 100644 --- a/src/lib/video_decoder.h +++ b/src/lib/video_decoder.h @@ -62,9 +62,10 @@ public: boost::signals2::signal<void (ContentVideo)> Data; private: - /** Time of last thing to be emitted */ boost::shared_ptr<const Content> _content; - boost::optional<Frame> _last_emitted; + /** Frame of last thing to be emitted */ + boost::optional<Frame> _last_emitted_frame; + boost::optional<Eyes> _last_emitted_eyes; dcpomatic::ContentTime _position; }; |
