Add default audio language configuration (#2375).
[dcpomatic.git] / src / lib / ffmpeg_content.cc
index 516962936238824775970f5796dc97c10ca6f62e..515b58cd0fbaa82eac39ec95d2194525b2f39406 100644 (file)
@@ -90,9 +90,13 @@ get_optional_enum (cxml::ConstNodePtr node, string name)
 FFmpegContent::FFmpegContent (cxml::ConstNodePtr node, int version, list<string>& notes)
        : Content (node)
 {
-       video = VideoContent::from_xml (this, node, version);
+       _color_range = get_optional_enum<AVColorRange>(node, "ColorRange");
+
+       VideoRange const video_range_hint = (_color_range && *_color_range == AVCOL_RANGE_JPEG) ? VideoRange::FULL : VideoRange::VIDEO;
+
+       video = VideoContent::from_xml (this, node, version, video_range_hint);
        audio = AudioContent::from_xml (this, node, version);
-       text = TextContent::from_xml (this, node, version);
+       text = TextContent::from_xml (this, node, version, notes);
 
        for (auto i: node->node_children("SubtitleStream")) {
                _subtitle_streams.push_back (make_shared<FFmpegSubtitleStream>(i, version));
@@ -124,7 +128,6 @@ FFmpegContent::FFmpegContent (cxml::ConstNodePtr node, int version, list<string>
                _first_video = ContentTime (f.get ());
        }
 
-       _color_range = get_optional_enum<AVColorRange>(node, "ColorRange");
        _color_primaries = get_optional_enum<AVColorPrimaries>(node, "ColorPrimaries");
        _color_trc = get_optional_enum<AVColorTransferCharacteristic>(node, "ColorTransferCharacteristic");
        _colorspace = get_optional_enum<AVColorSpace>(node, "Colorspace");
@@ -270,7 +273,7 @@ FFmpegContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
 
        if (examiner->has_video ()) {
                video.reset (new VideoContent (this));
-               video->take_from_examiner (examiner);
+               video->take_from_examiner(film, examiner);
        }
 
        auto first_path = path (0);
@@ -317,6 +320,7 @@ FFmpegContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                        text.clear ();
                        text.push_back (make_shared<TextContent>(this, TextType::OPEN_SUBTITLE, TextType::UNKNOWN));
                        _subtitle_stream = _subtitle_streams.front ();
+                       text.front()->add_font(make_shared<dcpomatic::Font>(""));
                }
        }
 
@@ -328,7 +332,7 @@ FFmpegContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                /* 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);
+               set_video_frame_rate(film, 24000.0 / 1001);
                video->set_length (video->length() * 24.0 / 30);
        }
 }
@@ -534,10 +538,12 @@ FFmpegContent::add_properties (shared_ptr<const Film> film, list<UserProperty>&
                video->add_properties (p);
 
                if (_bits_per_pixel) {
-                       /* 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);
+                       auto pixel_quanta_product = video->pixel_quanta().x * video->pixel_quanta().y;
+                       auto bits_per_main_pixel = pixel_quanta_product * _bits_per_pixel.get() / (pixel_quanta_product + 2);
+
+                       int const lim_start = pow(2, bits_per_main_pixel - 4);
+                       int const lim_end = 235 * pow(2, bits_per_main_pixel - 8);
+                       int const total = pow(2, bits_per_main_pixel);
 
                        switch (_color_range.get_value_or(AVCOL_RANGE_UNSPECIFIED)) {
                        case AVCOL_RANGE_UNSPECIFIED:
@@ -550,14 +556,14 @@ 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)"), lim_start, lim_end)
+                                               UserProperty::VIDEO, _("Colour range"), String::compose(_("Limited / video (%1-%2)"), lim_start, lim_end)
                                                )
                                        );
                                break;
                        case AVCOL_RANGE_JPEG:
                                /// TRANSLATORS: this means that the range of pixel values used in this
                                /// file is full, so that all possible pixel values are valid.
-                               p.push_back (UserProperty (UserProperty::VIDEO, _("Colour range"), String::compose (_("Full (0-%1)"), total)));
+                               p.push_back(UserProperty(UserProperty::VIDEO, _("Colour range"), String::compose(_("Full (0-%1)"), total - 1)));
                                break;
                        default:
                                DCPOMATIC_ASSERT (false);