}
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 ();
}
}
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) {