Fix some confusion with filling and VideoFrame.
authorCarl Hetherington <cth@carlh.net>
Tue, 14 Jun 2016 11:10:59 +0000 (12:10 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 14 Jun 2016 11:10:59 +0000 (12:10 +0100)
src/lib/video_decoder.cc
src/lib/video_frame.cc
src/lib/video_frame.h
test/video_frame_test.cc [new file with mode: 0644]
test/wscript

index ec5ae8884b730cfc5f02c40f30e03ff3da2add29..fc3bcac39eda019d7037b2059d0e2cb605b52816 100644 (file)
@@ -282,7 +282,10 @@ VideoDecoder::give (shared_ptr<const ImageProxy> image, Frame frame)
        optional<VideoFrame> from;
 
        if (_decoded.empty() && _last_seek_time && _last_seek_accurate) {
-               from = VideoFrame (_last_seek_time->frames_round (_content->active_video_frame_rate ()), EYES_LEFT);
+               from = VideoFrame (
+                       _last_seek_time->frames_round (_content->active_video_frame_rate ()),
+                       _content->video->frame_type() == VIDEO_FRAME_TYPE_2D ? EYES_BOTH : EYES_LEFT
+                       );
        } else if (!_decoded.empty ()) {
                from = _decoded.back().frame;
                ++(*from);
@@ -292,7 +295,7 @@ VideoDecoder::give (shared_ptr<const ImageProxy> image, Frame frame)
           (frames before the last seek time) which we can just ignore.
        */
 
-       if (from && from->index() > to_push.front().frame.index()) {
+       if (from && (*from) > to_push.front().frame) {
                return;
        }
 
index e2223ff9ec2132d65f3b8a85d3c4d6e2122ba7ba..e7c6a226aed47355f272aaf6d052bad7915d482e 100644 (file)
@@ -19,6 +19,7 @@
 */
 
 #include "video_frame.h"
+#include "dcpomatic_assert.h"
 
 VideoFrame &
 VideoFrame::operator++ ()
@@ -46,3 +47,31 @@ operator!= (VideoFrame const & a, VideoFrame const & b)
 {
        return !(a == b);
 }
+
+bool
+operator> (VideoFrame const & a, VideoFrame const & b)
+{
+       if (a.index() != b.index()) {
+               return a.index() > b.index();
+       }
+
+       /* indexes are the same */
+
+       if (a.eyes() == b.eyes()) {
+               return false;
+       }
+
+       /* eyes are not the same */
+
+       if (a.eyes() == EYES_LEFT && b.eyes() == EYES_RIGHT) {
+               return false;
+       }
+
+       if (a.eyes() == EYES_RIGHT && b.eyes() == EYES_LEFT) {
+               return true;
+       }
+
+       /* should never get here; we are comparing 2D with 3D */
+
+       DCPOMATIC_ASSERT (false);
+}
index abb25ec3742142059525d0cc82cd786f6a3b520e..ac9a345af1d9c7d3837e51e4f0ed7f94bdc6ea8f 100644 (file)
@@ -58,5 +58,6 @@ private:
 
 extern bool operator== (VideoFrame const & a, VideoFrame const & b);
 extern bool operator!= (VideoFrame const & a, VideoFrame const & b);
+extern bool operator> (VideoFrame const & a, VideoFrame const & b);
 
 #endif
diff --git a/test/video_frame_test.cc b/test/video_frame_test.cc
new file mode 100644 (file)
index 0000000..65a443d
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+    Copyright (C) 2016 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "lib/video_frame.h"
+#include "lib/exceptions.h"
+#include <boost/test/unit_test.hpp>
+
+/** Test VideoFrame */
+BOOST_AUTO_TEST_CASE (video_frame_test)
+{
+       BOOST_CHECK_EQUAL (VideoFrame (0, EYES_BOTH) > VideoFrame (0, EYES_BOTH), false);
+       BOOST_CHECK_EQUAL (VideoFrame (1, EYES_BOTH) > VideoFrame (0, EYES_BOTH), true);
+       BOOST_CHECK_EQUAL (VideoFrame (0, EYES_BOTH) > VideoFrame (1, EYES_BOTH), false);
+
+       BOOST_CHECK_EQUAL (VideoFrame (0, EYES_LEFT) > VideoFrame (0, EYES_LEFT), false);
+       BOOST_CHECK_EQUAL (VideoFrame (0, EYES_LEFT) > VideoFrame (0, EYES_RIGHT), false);
+       BOOST_CHECK_EQUAL (VideoFrame (0, EYES_RIGHT) > VideoFrame (0, EYES_LEFT), true);
+       BOOST_CHECK_EQUAL (VideoFrame (0, EYES_RIGHT) > VideoFrame (1, EYES_LEFT), false);
+       BOOST_CHECK_EQUAL (VideoFrame (1, EYES_LEFT) > VideoFrame (0, EYES_RIGHT), true);
+
+       BOOST_CHECK_THROW (VideoFrame (0, EYES_LEFT) > VideoFrame (0, EYES_BOTH), ProgrammingError);
+       BOOST_CHECK_THROW (VideoFrame (0, EYES_BOTH) > VideoFrame (0, EYES_RIGHT), ProgrammingError);
+}
index 771651236d4f5f30afb4587582b23d7d3e71c9f4..211ead9c26852ecd9d21b1451cd3ae6a24251e94 100644 (file)
@@ -96,6 +96,7 @@ def build(bld):
                  vf_test.cc
                  video_content_scale_test.cc
                  video_decoder_fill_test.cc
+                 video_frame_test.cc
                  video_mxf_content_test.cc
                  xml_subtitle_test.cc
                  """