Recover subtitle language metadata from the places is was written
[dcpomatic.git] / src / lib / ffmpeg_content.cc
index 29ff7e80baeb3f5550f28b674122121f230d381a..03763fc289b0135e91cb764ff736cb9591e2853f 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #include "filter.h"
 #include "film.h"
 #include "log.h"
+#include "config.h"
 #include "exceptions.h"
 #include "frame_rate_change.h"
 #include "text_content.h"
+#include "decrypted_ecinema_kdm.h"
 #include <dcp/raw_convert.h>
 #include <libcxml/cxml.h>
 extern "C" {
@@ -335,6 +337,14 @@ FFmpegContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                set_default_colour_conversion ();
        }
 
+       if (examiner->has_video() && examiner->pulldown() && video_frame_rate() && fabs(*video_frame_rate() - 29.97) < 0.001) {
+               /* FFmpeg has detected this file as 29.97 and the examiner thinks it is using "soft" 2:3 pulldown (telecine).
+                * This means we can treat it as a 23.976fps file.
+                */
+               set_video_frame_rate (24000.0 / 1001);
+               video->set_length (video->length() * 24.0 / 30);
+       }
+
 #ifdef DCPOMATIC_VARIANT_SWAROOP
        _id = examiner->id ();
 #endif
@@ -530,8 +540,10 @@ FFmpegContent::add_properties (shared_ptr<const Film> film, list<UserProperty>&
                video->add_properties (p);
 
                if (_bits_per_pixel) {
-                       int const sub = 219 * pow (2, _bits_per_pixel.get() - 8);
-                       int const total = pow (2, _bits_per_pixel.get());
+                       /* Assuming there's three components, so bits per pixel component is _bits_per_pixel / 3 */
+                       int const lim_start = pow(2, _bits_per_pixel.get() / 3 - 4);
+                       int const lim_end = 235 * pow(2, _bits_per_pixel.get() / 3 - 8);
+                       int const total = pow(2, _bits_per_pixel.get() / 3);
 
                        switch (_color_range.get_value_or(AVCOL_RANGE_UNSPECIFIED)) {
                        case AVCOL_RANGE_UNSPECIFIED:
@@ -544,7 +556,7 @@ FFmpegContent::add_properties (shared_ptr<const Film> film, list<UserProperty>&
                                /// file is limited, so that not all possible values are valid.
                                p.push_back (
                                        UserProperty (
-                                               UserProperty::VIDEO, _("Colour range"), String::compose (_("Limited (%1-%2)"), (total - sub) / 2, (total + sub) / 2)
+                                               UserProperty::VIDEO, _("Colour range"), String::compose(_("Limited (%1-%2)"), lim_start, lim_end)
                                                )
                                        );
                                break;
@@ -710,4 +722,21 @@ FFmpegContent::add_kdm (EncryptedECinemaKDM kdm)
        _kdm = kdm;
 
 }
+
+bool
+FFmpegContent::kdm_timing_window_valid () const
+{
+       if (!_kdm) {
+               return true;
+       }
+
+       DCPOMATIC_ASSERT (Config::instance()->decryption_chain()->key());
+
+       DecryptedECinemaKDM decrypted (*_kdm, *Config::instance()->decryption_chain()->key());
+
+       dcp::LocalTime now;
+       return (!decrypted.not_valid_before() || *decrypted.not_valid_before() < now) &&
+               (!decrypted.not_valid_after() || now < *decrypted.not_valid_after());
+}
+
 #endif