summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-10-19 23:40:31 +0100
committerCarl Hetherington <cth@carlh.net>2016-10-19 23:40:31 +0100
commit8c2d83b42b14b52310fdd8b7709d961e4e48aac5 (patch)
tree69a30935f4349726cc308f8dd260f7bf3c221ada
parent11ce310370ec99c0e382fa60f7b39157c1f0b4a4 (diff)
Fix misunderstandings in decoder frame handling for 3D/3D-alternate.
-rw-r--r--ChangeLog5
-rw-r--r--src/lib/video_decoder.cc14
-rw-r--r--test/threed_test.cc27
3 files changed, 40 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index c84c3801c..4eecb76d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-10-19 Carl Hetherington <cth@carlh.net>
+
+ * Fix various problems with 3D DCP creation
+ from 3D DCP and 3D-alernate-frame sources.
+
2016-10-18 Carl Hetherington <cth@carlh.net>
* Updated de_DE translation from Carsten Kurz.
diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc
index f87e41086..8c1b27653 100644
--- a/src/lib/video_decoder.cc
+++ b/src/lib/video_decoder.cc
@@ -90,15 +90,19 @@ VideoDecoder::get (Frame frame, bool accurate)
_parent->seek (ContentTime::from_frames (frame, _content->active_video_frame_rate()), accurate);
}
+ /* Work out the number of frames that we should return; we
+ must return all frames in our content at the requested `time'
+ (i.e. frame)
+ */
unsigned int frames_wanted = 0;
switch (_content->video->frame_type()) {
case VIDEO_FRAME_TYPE_2D:
- case VIDEO_FRAME_TYPE_3D:
- case VIDEO_FRAME_TYPE_3D_ALTERNATE:
case VIDEO_FRAME_TYPE_3D_LEFT:
case VIDEO_FRAME_TYPE_3D_RIGHT:
frames_wanted = 1;
break;
+ case VIDEO_FRAME_TYPE_3D:
+ case VIDEO_FRAME_TYPE_3D_ALTERNATE:
case VIDEO_FRAME_TYPE_3D_LEFT_RIGHT:
case VIDEO_FRAME_TYPE_3D_TOP_BOTTOM:
frames_wanted = 2;
@@ -263,15 +267,17 @@ VideoDecoder::give (shared_ptr<const ImageProxy> image, Frame frame)
to_push.push_back (ContentVideo (image, VideoFrame (frame, EYES_BOTH), PART_WHOLE));
break;
case VIDEO_FRAME_TYPE_3D:
- case VIDEO_FRAME_TYPE_3D_ALTERNATE:
{
- /* We receive the same frame index twice for 3D-alternate; hence we know which
+ /* We receive the same frame index twice for 3D; hence we know which
frame this one is.
*/
bool const same = (!_decoded.empty() && frame == _decoded.back().frame.index());
to_push.push_back (ContentVideo (image, VideoFrame (frame, same ? EYES_RIGHT : EYES_LEFT), PART_WHOLE));
break;
}
+ case VIDEO_FRAME_TYPE_3D_ALTERNATE:
+ to_push.push_back (ContentVideo (image, VideoFrame (frame / 2, (frame % 2) ? EYES_RIGHT : EYES_LEFT), PART_WHOLE));
+ break;
case VIDEO_FRAME_TYPE_3D_LEFT_RIGHT:
to_push.push_back (ContentVideo (image, VideoFrame (frame, EYES_LEFT), PART_LEFT_HALF));
to_push.push_back (ContentVideo (image, VideoFrame (frame, EYES_RIGHT), PART_RIGHT_HALF));
diff --git a/test/threed_test.cc b/test/threed_test.cc
index 5a28122c0..4ffbdf0e6 100644
--- a/test/threed_test.cc
+++ b/test/threed_test.cc
@@ -34,9 +34,9 @@
using std::cout;
using boost::shared_ptr;
-BOOST_AUTO_TEST_CASE (threed_test)
+BOOST_AUTO_TEST_CASE (threed_test1)
{
- shared_ptr<Film> film = new_test_film ("threed_test");
+ shared_ptr<Film> film = new_test_film ("threed_test2");
film->set_name ("test_film2");
shared_ptr<FFmpegContent> c (new FFmpegContent (film, "test/data/test.mp4"));
film->examine_and_add_content (c);
@@ -53,3 +53,26 @@ BOOST_AUTO_TEST_CASE (threed_test)
wait_for_jobs ();
}
+
+/** Basic sanity check of 3D-alternate; at the moment this is just to make sure
+ * that such a transcode completes without error.
+ */
+BOOST_AUTO_TEST_CASE (threed_test2)
+{
+ shared_ptr<Film> film = new_test_film ("threed_test2");
+ film->set_name ("test_film2");
+ shared_ptr<FFmpegContent> c (new FFmpegContent (film, "test/data/test.mp4"));
+ film->examine_and_add_content (c);
+ wait_for_jobs ();
+
+ c->video->set_frame_type (VIDEO_FRAME_TYPE_3D_ALTERNATE);
+ c->video->set_scale (VideoContentScale (Ratio::from_id ("185")));
+
+ film->set_container (Ratio::from_id ("185"));
+ film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST"));
+ film->set_three_d (true);
+ film->make_dcp ();
+ film->write_metadata ();
+
+ wait_for_jobs ();
+}