From 29790c6d88d028db7874e98f92ec5ec23a3310c8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 6 Jan 2013 23:43:40 +0000 Subject: [PATCH] Try to postpone linking of duplicate video frames to stop copies failing on Windows. --- src/lib/encoder.cc | 15 ++++++++++++--- src/lib/encoder.h | 8 +++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 6e1209d83..693bd5bc8 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -42,6 +42,7 @@ using std::stringstream; using std::vector; using std::list; using std::cout; +using std::make_pair; using namespace boost; int const Encoder::_history_size = 25; @@ -207,6 +208,12 @@ Encoder::process_end () _film->log()->log (String::compose ("Local encode failed (%1)", e.what ())); } } + + /* Now do links (or copies on windows) to duplicate frames */ + for (list >::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, @@ -305,9 +312,11 @@ Encoder::process_video (shared_ptr image, bool same, boost::shared_ptrframe_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 const s = Filter::ffmpeg_strings (_film->filters()); diff --git a/src/lib/encoder.h b/src/lib/encoder.h index e5916ad3a..52ccfc166 100644 --- a/src/lib/encoder.h +++ b/src/lib/encoder.h @@ -121,7 +121,13 @@ private: #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 > _links_required; std::vector _sound_files; int64_t _audio_frames_written; -- 2.30.2