diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-07-28 15:37:50 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-07-28 15:37:50 +0100 |
| commit | 333e8c59f591c14f7ba9a67ed890bd635fdfecb7 (patch) | |
| tree | d7256ef876b03a26adae145300d61da32adaf7e9 /src/lib | |
| parent | 960ade12d9db8439f1cf7e114c7ddb04548e1997 (diff) | |
Fix bug causing frames to be missed when encoding.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/j2k_wav_encoder.cc | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/lib/j2k_wav_encoder.cc b/src/lib/j2k_wav_encoder.cc index 3bcb1e5fd..2f29f9021 100644 --- a/src/lib/j2k_wav_encoder.cc +++ b/src/lib/j2k_wav_encoder.cc @@ -174,7 +174,7 @@ J2KWAVEncoder::encoder_thread (Server* server) remote_backoff += 10; } stringstream s; - s << "Remote encode on " << server->host_name() << " failed (" << e.what() << "); thread sleeping for " << remote_backoff << "s."; + s << "Remote encode of " << vf->frame() << " on " << server->host_name() << " failed (" << e.what() << "); thread sleeping for " << remote_backoff << "s."; _log->log (s.str ()); } @@ -236,6 +236,31 @@ J2KWAVEncoder::process_end () lock.unlock (); terminate_worker_threads (); + + /* The following sequence of events can occur in the above code: + 1. a remote worker takes the last image off the queue + 2. the loop above terminates + 3. the remote worker fails to encode the image and puts it back on the queue + 4. the remote worker is then terminated by terminate_worker_threads + + So just mop up anything left in the queue here. + */ + + for (list<shared_ptr<DCPVideoFrame> >::iterator i = _queue.begin(); i != _queue.end(); ++i) { + stringstream s; + s << "Encode left-over frame " << (*i)->frame(); + _log->log (s.str ()); + try { + shared_ptr<EncodedData> e = (*i)->encode_locally (); + e->write (_opt, (*i)->frame ()); + frame_done (); + } catch (std::exception& e) { + stringstream s; + s << "Local encode failed " << e.what() << "."; + _log->log (s.str ()); + } + } + close_sound_files (); /* Rename .wav.tmp files to .wav */ |
