Fix DCP content font ID allocation to cope with DCPs that have multiple fonts
[dcpomatic.git] / src / lib / dcp_decoder.cc
index 0f4e1afa1fadb2ff535294e3ca014d672466fbd3..0a57ce7f5922ccb810a19f73be3606b38f79d931 100644 (file)
@@ -23,6 +23,7 @@
 #include "audio_content.h"
 #include "audio_decoder.h"
 #include "config.h"
+#include "constants.h"
 #include "dcp_content.h"
 #include "dcp_decoder.h"
 #include "digester.h"
@@ -136,6 +137,9 @@ DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent
 
        _reel = _reels.begin ();
        get_readers ();
+
+       _font_id_allocator.add_fonts_from_reels(_reels);
+       _font_id_allocator.allocate();
 }
 
 
@@ -304,13 +308,13 @@ DCPDecoder::pass_texts (
                                                        ContentTime::from_frames(_offset - entry_point, vfr) + ContentTime::from_seconds(b.out().as_seconds())
                                                        ),
                                                strings,
-                                               _dcp_content->standard()
+                                               asset->subtitle_standard()
                                                );
                                        strings.clear ();
                                }
 
                                dcp::SubtitleString is_copy = *is;
-                               is_copy.set_font(id_for_font_in_reel(is_copy.font().get_value_or(""), _reel - _reels.begin()));
+                               is_copy.set_font(_font_id_allocator.font_id(_reel - _reels.begin(), asset->id(), is_copy.font().get_value_or("")));
                                strings.push_back(is_copy);
                        }
 
@@ -340,7 +344,7 @@ DCPDecoder::pass_texts (
                                        ContentTime::from_frames(_offset - entry_point, vfr) + ContentTime::from_seconds(b.out().as_seconds())
                                        ),
                                strings,
-                               _dcp_content->standard()
+                               asset->subtitle_standard()
                                );
                        strings.clear ();
                }
@@ -368,6 +372,7 @@ DCPDecoder::get_readers ()
                return;
        }
 
+       DCPOMATIC_ASSERT(video);
        if (!video->ignore() && (*_reel)->main_picture()) {
                auto asset = (*_reel)->main_picture()->asset ();
                auto mono = dynamic_pointer_cast<dcp::MonoPictureAsset> (asset);
@@ -387,6 +392,7 @@ DCPDecoder::get_readers ()
                _stereo_reader.reset ();
        }
 
+       DCPOMATIC_ASSERT(audio);
        if (!audio->ignore() && (*_reel)->main_sound()) {
                _sound_reader = (*_reel)->main_sound()->asset()->start_read ();
                _sound_reader->set_check_hmac (false);