Make repeat a number rather than a bool.
authorCarl Hetherington <cth@carlh.net>
Tue, 22 Oct 2013 13:15:19 +0000 (14:15 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 22 Oct 2013 13:15:19 +0000 (14:15 +0100)
src/lib/player.cc
src/lib/util.cc
src/lib/util.h
test/frame_rate_test.cc

index f792655586362cac6b637e91358be4f2dd0ebfd6..8f6a8bb355bdc447504e261c69a3beaa68114f71 100644 (file)
@@ -247,11 +247,6 @@ Player::process_video (weak_ptr<Piece> weak_piece, shared_ptr<const Image> image
        Video (work_image, eyes, content->colour_conversion(), same, time);
        time += TIME_HZ / _film->video_frame_rate();
 
-       if (frc.repeat) {
-               Video (work_image, eyes, content->colour_conversion(), true, time);
-               time += TIME_HZ / _film->video_frame_rate();
-       }
-
        _last_emit_was_black = false;
 
        _video_position = piece->video_position = time;
index 1c4347233965279203a494dbde8fde06141b9ed8..4880e5ced50aff09ee504c8fcf68288a3d8e94ec 100644 (file)
@@ -744,7 +744,7 @@ audio_channel_name (int c)
        assert (MAX_AUDIO_CHANNELS == 6);
 
        /* TRANSLATORS: these are the names of audio channels; Lfe (sub) is the low-frequency
-          enhancement channel (sub-woofer)./
+          enhancement channel (sub-woofer).
        */
        string const channels[] = {
                _("Left"),
@@ -760,24 +760,28 @@ audio_channel_name (int c)
 
 FrameRateConversion::FrameRateConversion (float source, int dcp)
        : skip (false)
-       , repeat (false)
+       , repeat (1)
        , change_speed (false)
 {
-       if (fabs (source / 2.0 - dcp) < (fabs (source - dcp))) {
+       if (source > (dcp * 2)) {
                skip = true;
-       } else if (fabs (source * 2 - dcp) < fabs (source - dcp)) {
-               repeat = true;
+       }
+
+       if (source < dcp) {
+               repeat = floor (source / dcp);
        }
 
        change_speed = !about_equal (source * factor(), dcp);
 
-       if (!skip && !repeat && !change_speed) {
+       if (!skip && repeat == 1 && !change_speed) {
                description = _("Content and DCP have the same rate.\n");
        } else {
                if (skip) {
                        description = _("DCP will use every other frame of the content.\n");
-               } else if (repeat) {
+               } else if (repeat == 2) {
                        description = _("Each content frame will be doubled in the DCP.\n");
+               } else if (repeat > 2) {
+                       description = String::compose (_("Each content frame will be repeated %1 more times in the DCP.\n"), repeat - 1);
                }
 
                if (change_speed) {
index b8ea6ebec0d6798e2daf07e05b32c5975ee93262..70cb3bb0c9ec820973996c7573d3e4353b1f1bfa 100644 (file)
@@ -88,17 +88,15 @@ struct FrameRateConversion
        float factor () const {
                if (skip) {
                        return 0.5;
-               } else if (repeat) {
-                       return 2;
                }
 
-               return 1;
+               return repeat;
        }
 
        /** true to skip every other frame */
        bool skip;
-       /** true to repeat every frame once */
-       bool repeat;
+       /** number of times to use each frame (e.g. 1 is normal, 2 means repeat each frame once, and so on) */
+       int repeat;
        /** true if this DCP will run its video faster or slower than the source
         *  without taking into account `repeat' nor `skip'.
         *  (e.g. change_speed will be true if
index 1cae59ed12b77d562c73e76821334da46def161a..fdfdcf4529739f126ffab9da192aafeec44f8503 100644 (file)
@@ -50,7 +50,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        FrameRateConversion frc = FrameRateConversion (60, best);
        BOOST_CHECK_EQUAL (best, 30);
        BOOST_CHECK_EQUAL (frc.skip, true);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
        
        content->_video_frame_rate = 50;
@@ -58,7 +58,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (50, best);
        BOOST_CHECK_EQUAL (best, 25);
        BOOST_CHECK_EQUAL (frc.skip, true);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
 
        content->_video_frame_rate = 48;
@@ -66,7 +66,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (48, best);
        BOOST_CHECK_EQUAL (best, 24);
        BOOST_CHECK_EQUAL (frc.skip, true);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
 
        content->_video_frame_rate = 30;
@@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (30, best);
        BOOST_CHECK_EQUAL (best, 30);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
 
        content->_video_frame_rate = 29.97;
@@ -82,7 +82,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (29.97, best);
        BOOST_CHECK_EQUAL (best, 30);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, true);
        
        content->_video_frame_rate = 25;
@@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (25, best);
        BOOST_CHECK_EQUAL (best, 25);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
 
        content->_video_frame_rate = 24;
@@ -98,7 +98,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (24, best);
        BOOST_CHECK_EQUAL (best, 24);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
 
        content->_video_frame_rate = 14.5;
@@ -106,7 +106,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (14.5, best);
        BOOST_CHECK_EQUAL (best, 30);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, true);
+       BOOST_CHECK_EQUAL (frc.repeat, 2);
        BOOST_CHECK_EQUAL (frc.change_speed, true);
 
        content->_video_frame_rate = 12.6;
@@ -114,7 +114,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (12.6, best);
        BOOST_CHECK_EQUAL (best, 25);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, true);
+       BOOST_CHECK_EQUAL (frc.repeat, 2);
        BOOST_CHECK_EQUAL (frc.change_speed, true);
 
        content->_video_frame_rate = 12.4;
@@ -122,7 +122,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (12.4, best);
        BOOST_CHECK_EQUAL (best, 25);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, true);
+       BOOST_CHECK_EQUAL (frc.repeat, 2);
        BOOST_CHECK_EQUAL (frc.change_speed, true);
 
        content->_video_frame_rate = 12;
@@ -130,7 +130,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (12, best);
        BOOST_CHECK_EQUAL (best, 24);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, true);
+       BOOST_CHECK_EQUAL (frc.repeat, 2);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
 
        /* Now add some more rates and see if it will use them
@@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (60, best);
        BOOST_CHECK_EQUAL (best, 60);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
        
        content->_video_frame_rate = 50;
@@ -155,7 +155,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (50, best);
        BOOST_CHECK_EQUAL (best, 50);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
 
        content->_video_frame_rate = 48;
@@ -163,14 +163,14 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (48, best);
        BOOST_CHECK_EQUAL (best, 48);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, false);
 
        /* Check some out-there conversions (not the best) */
        
        frc = FrameRateConversion (14.99, 24);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, true);
+       BOOST_CHECK_EQUAL (frc.repeat, 2);
        BOOST_CHECK_EQUAL (frc.change_speed, true);
 
        /* Check some conversions with limited DCP targets */
@@ -184,7 +184,7 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single)
        frc = FrameRateConversion (25, best);
        BOOST_CHECK_EQUAL (best, 24);
        BOOST_CHECK_EQUAL (frc.skip, false);
-       BOOST_CHECK_EQUAL (frc.repeat, false);
+       BOOST_CHECK_EQUAL (frc.repeat, 1);
        BOOST_CHECK_EQUAL (frc.change_speed, true);
 }