Maybe re-sequence video when DCP frame rate changes.
[dcpomatic.git] / src / lib / playlist.cc
index 9cc1789d135d5c38a66e416b4c90888421d7142e..703a14663448c5468dc10910a3ca5c978d3a96df 100644 (file)
@@ -94,19 +94,14 @@ Playlist::content_changed (weak_ptr<Content> c, int p)
 }
 
 string
-Playlist::video_digest () const
+Playlist::video_identifier () const
 {
        string t;
        
        for (ContentList::const_iterator i = _content.begin(); i != _content.end(); ++i) {
-               if (!dynamic_pointer_cast<const VideoContent> (*i)) {
-                       continue;
-               }
-               
-               t += (*i)->digest ();
-               shared_ptr<const FFmpegContent> fc = dynamic_pointer_cast<const FFmpegContent> (*i);
-               if (fc && fc->subtitle_stream()) {
-                       t += fc->subtitle_stream()->id;
+               shared_ptr<const VideoContent> vc = dynamic_pointer_cast<const VideoContent> (*i);
+               if (vc) {
+                       t += vc->identifier ();
                }
        }
 
@@ -226,20 +221,21 @@ Playlist::best_dcp_frame_rate () const
                candidates.push_back (FrameRateCandidate (float (*i) * 2, *i));
        }
 
-       /* Pick the best one, bailing early if we hit an exact match */
+       /* Pick the best one */
        float error = std::numeric_limits<float>::max ();
        optional<FrameRateCandidate> best;
        list<FrameRateCandidate>::iterator i = candidates.begin();
        while (i != candidates.end()) {
 
-               float this_error = std::numeric_limits<float>::max ();
+               float this_error = 0;
                for (ContentList::const_iterator j = _content.begin(); j != _content.end(); ++j) {
                        shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (*j);
                        if (!vc) {
                                continue;
                        }
 
-                       this_error += fabs (i->source - vc->video_frame_rate ());
+                       /* Use the largest difference between DCP and source as the "error" */
+                       this_error = max (this_error, float (fabs (i->source - vc->video_frame_rate ())));
                }
 
                if (this_error < error) {