From: Carl Hetherington Date: Tue, 14 Jun 2016 11:10:59 +0000 (+0100) Subject: Fix some confusion with filling and VideoFrame. X-Git-Tag: v2.8.10~23 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=b19543a036c389c9970a65f77606afb55d9fd11d Fix some confusion with filling and VideoFrame. --- diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc index ec5ae8884..fc3bcac39 100644 --- a/src/lib/video_decoder.cc +++ b/src/lib/video_decoder.cc @@ -282,7 +282,10 @@ VideoDecoder::give (shared_ptr image, Frame frame) optional 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 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; } diff --git a/src/lib/video_frame.cc b/src/lib/video_frame.cc index e2223ff9e..e7c6a226a 100644 --- a/src/lib/video_frame.cc +++ b/src/lib/video_frame.cc @@ -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); +} diff --git a/src/lib/video_frame.h b/src/lib/video_frame.h index abb25ec37..ac9a345af 100644 --- a/src/lib/video_frame.h +++ b/src/lib/video_frame.h @@ -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 index 000000000..65a443d5a --- /dev/null +++ b/test/video_frame_test.cc @@ -0,0 +1,40 @@ +/* + Copyright (C) 2016 Carl Hetherington + + 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 . + +*/ + +#include "lib/video_frame.h" +#include "lib/exceptions.h" +#include + +/** 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); +} diff --git a/test/wscript b/test/wscript index 771651236..211ead9c2 100644 --- a/test/wscript +++ b/test/wscript @@ -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 """