/*
- Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
- This program is free software; you can redistribute it and/or modify
+ 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.
- This program is distributed in the hope that it will be useful,
+ 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 this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <cmath>
-#include "frame_rate_change.h"
+
#include "compose.hpp"
+#include "content.h"
+#include "film.h"
+#include "frame_rate_change.h"
+#include <cmath>
#include "i18n.h"
-static bool
-about_equal (float a, float b)
+
+using std::shared_ptr;
+using std::string;
+
+
+FrameRateChange::FrameRateChange ()
{
- /* A film of F seconds at f FPS will be Ff frames;
- Consider some delta FPS d, so if we run the same
- film at (f + d) FPS it will last F(f + d) seconds.
-
- Hence the difference in length over the length of the film will
- be F(f + d) - Ff frames
- = Ff + Fd - Ff frames
- = Fd frames
- = Fd/f seconds
-
- So if we accept a difference of 1 frame, ie 1/f seconds, we can
- say that
-
- 1/f = Fd/f
- ie 1 = Fd
- ie d = 1/F
-
- So for a 3hr film, ie F = 3 * 60 * 60 = 10800, the acceptable
- FPS error is 1/F ~= 0.0001 ~= 10-e4
- */
-
- return (fabs (a - b) < 1e-4);
+
}
-FrameRateChange::FrameRateChange (float source, int dcp)
- : skip (false)
- , repeat (1)
- , change_speed (false)
+FrameRateChange::FrameRateChange (double source_, int dcp_)
{
- if (fabs (source / 2.0 - dcp) < fabs (source - dcp)) {
+ source = source_;
+ dcp = dcp_;
+
+ if (fabs(source / 2.0 - dcp) < fabs(source - dcp)) {
/* The difference between source and DCP frame rate will be lower
(i.e. better) if we skip.
*/
skip = true;
- } else if (fabs (source * 2 - dcp) < fabs (source - dcp)) {
+ } else if (fabs(source * 2 - dcp) < fabs(source - dcp)) {
/* The difference between source and DCP frame rate would be better
if we repeated each frame once; it may be better still if we
repeated more than once. Work out the required repeat.
}
speed_up = dcp / (source * factor());
+
+ auto about_equal = [](double a, double b) {
+ return (fabs (a - b) < VIDEO_FRAME_RATE_EPSILON);
+ };
+
change_speed = !about_equal (speed_up, 1.0);
+}
+
+
+FrameRateChange::FrameRateChange (shared_ptr<const Film> film, shared_ptr<const Content> content)
+ : FrameRateChange (content->active_video_frame_rate(film), film->video_frame_rate())
+{
+
+}
+
+
+FrameRateChange::FrameRateChange (shared_ptr<const Film> film, Content const * content)
+ : FrameRateChange (content->active_video_frame_rate(film), film->video_frame_rate())
+{
+
+}
+
+
+string
+FrameRateChange::description () const
+{
+ string description;
if (!skip && repeat == 1 && !change_speed) {
description = _("Content and DCP have the same rate.\n");
}
if (change_speed) {
- float const pc = dcp * 100 / (source * factor());
- description += String::compose (_("DCP will run at %1%% of the content speed.\n"), pc);
+ double const pc = dcp * 100 / (source * factor());
+ char buffer[256];
+ snprintf (buffer, sizeof(buffer), _("DCP will run at %.1f%% of the content speed.\n"), pc);
+ description += buffer;
}
}
+
+ return description;
}