X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fmatcher.cc;h=c56a563015b6eb617bf38535ff81be81c7cffeb0;hb=f861018389acd9d277fe34d7621182b9b54f977f;hp=b2bef0269d68a5b52d0bb2b8d5de689c5a01a7de;hpb=4de9464d7547954bcc74d4c1337c202dc50f588a;p=dcpomatic.git diff --git a/src/lib/matcher.cc b/src/lib/matcher.cc index b2bef0269..c56a56301 100644 --- a/src/lib/matcher.cc +++ b/src/lib/matcher.cc @@ -28,28 +28,38 @@ using std::cout; using std::list; using boost::shared_ptr; -Matcher::Matcher (Log* log, int sample_rate, float frames_per_second) +Matcher::Matcher (shared_ptr log, int sample_rate, float frames_per_second) : Processor (log) , _sample_rate (sample_rate) , _frames_per_second (frames_per_second) , _video_frames (0) , _audio_frames (0) + , _had_first_video (false) + , _had_first_audio (false) { } void -Matcher::process_video (boost::shared_ptr image, bool same, boost::shared_ptr sub, double t) +Matcher::process_video (shared_ptr image, bool same, boost::shared_ptr sub, double t) { _pixel_format = image->pixel_format (); _size = image->size (); - _log->log(String::compose("Matcher video @ %1 (same=%2)", t, same)); + _log->log(String::compose("Matcher video @ %1 [audio=%2, video=%3, pending_audio=%4]", t, _audio_frames, _video_frames, _pending_audio.size())); if (!_first_input) { _first_input = t; } + bool const this_is_first_video = !_had_first_video; + _had_first_video = true; + + if (this_is_first_video && _had_first_audio) { + /* First video since we got audio */ + fix_start (t); + } + /* Video before audio is fine, since we can make up an arbitrary difference with audio samples (contrasting with video which is quantised to frames) */ @@ -75,31 +85,35 @@ Matcher::process_video (boost::shared_ptr image, bool same, boost::shared _log->log (String::compose ("Frame removed at %1s", t)); } - if (!_pending_audio.empty() && _video_frames == 1) { - /* First video since we got audio */ - fix_start (); - } - _last_image = image; _last_subtitle = sub; } void -Matcher::process_audio (boost::shared_ptr b, double t) +Matcher::process_audio (shared_ptr b, double t) { _channels = b->channels (); - + + _log->log (String::compose ( + "Matcher audio (%1 frames) @ %2 [video=%3, audio=%4, pending_audio=%5]", + b->frames(), t, _video_frames, _audio_frames, _pending_audio.size() + ) + ); + if (!_first_input) { _first_input = t; } + + bool const this_is_first_audio = _had_first_audio; + _had_first_audio = true; - if (_video_frames == 0) { + if (!_had_first_video) { /* No video yet; we must postpone these data until we have some */ _pending_audio.push_back (AudioRecord (b, t)); - } else if (_video_frames > 0 && _audio_frames == 0) { + } else if (this_is_first_audio && !_had_first_video) { /* First audio since we got video */ _pending_audio.push_back (AudioRecord (b, t)); - fix_start (); + fix_start (_first_input.get ()); } else { /* Normal running. We assume audio time stamps are consecutive */ Audio (b); @@ -122,17 +136,13 @@ Matcher::process_end () } void -Matcher::fix_start () +Matcher::fix_start (double first_video) { assert (!_pending_audio.empty ()); - assert (_first_input); - _log->log (String::compose ("Fixing start; start at %1, audio at %2", _first_input.get(), _pending_audio.front().time)); + _log->log (String::compose ("Fixing start; video at %1, audio at %2", first_video, _pending_audio.front().time)); - /* This will not add any video frames, since the input parameter will always be -ve. - Indeed, it cannot add any, since we've already started adding "real" video. - */ - match (_first_input.get() - _pending_audio.front().time); + match (first_video - _pending_audio.front().time); for (list::iterator i = _pending_audio.begin(); i != _pending_audio.end(); ++i) { process_audio (i->audio, i->time); @@ -144,6 +154,8 @@ Matcher::fix_start () void Matcher::match (double extra_video_needed) { + _log->log (String::compose ("Match %1", extra_video_needed)); + if (extra_video_needed > 0) { /* Emit black video frames */ @@ -167,7 +179,7 @@ Matcher::match (double extra_video_needed) /* Emit silence */ int64_t to_do = -extra_video_needed * _sample_rate; - _log->log (String::compose (N_("Emitted %1 frames of silence"), to_do)); + _log->log (String::compose (N_("Emitting %1 frames of silence"), to_do)); /* Do things in half second blocks as I think there may be limits to what FFmpeg (and in particular the resampler) can cope with. @@ -190,8 +202,9 @@ void Matcher::repeat_last_video () { if (!_last_image) { - _last_image.reset (new SimpleImage (_pixel_format.get(), _size.get(), true)); - _last_image->make_black (); + shared_ptr im (new SimpleImage (_pixel_format.get(), _size.get(), true)); + im->make_black (); + _last_image = im; } Video (_last_image, true, _last_subtitle);