using std::vector;
using std::list;
using std::cout;
+using std::make_pair;
using namespace boost;
int const Encoder::_history_size = 25;
_film->log()->log (String::compose ("Local encode failed (%1)", e.what ()));
}
}
+
+ /* Now do links (or copies on windows) to duplicate frames */
+ for (list<pair<int, int> >::iterator i = _links_required.begin(); i != _links_required.end(); ++i) {
+ link (_opt->frame_out_path (i->first, false), _opt->frame_out_path (i->second, false));
+ link (_opt->hash_out_path (i->first, false), _opt->hash_out_path (i->second, false));
+ }
}
/** @return an estimate of the current number of frames we are encoding per second,
}
if (same && _last_real_frame) {
- /* Use the last frame that we encoded */
- link (_opt->frame_out_path (_last_real_frame.get(), false), _opt->frame_out_path (_video_frame, false));
- link (_opt->hash_out_path (_last_real_frame.get(), false), _opt->hash_out_path (_video_frame, false));
+ /* Use the last frame that we encoded. We need to postpone doing the actual link,
+ as on windows the link is really a copy and the reference frame might not have
+ finished encoding yet.
+ */
+ _links_required.push_back (make_pair (_last_real_frame.get(), _video_frame));
} else {
/* Queue this new frame for encoding */
pair<string, string> const s = Filter::ffmpeg_strings (_film->filters());
#if HAVE_SWRESAMPLE
SwrContext* _swr_context;
-#endif
+#endif
+
+ /** List of links that we need to create when all frames have been processed;
+ * such that we need to call link (first, second) for each member of this list.
+ * In other words, `first' is a `real' frame and `second' should be a link to `first'.
+ */
+ std::list<std::pair<int, int> > _links_required;
std::vector<SNDFILE*> _sound_files;
int64_t _audio_frames_written;