Fix crash when amending commits with video open

The video source's copy of the subtitle file was being discarded once it
was fully loaded (as it was previously never needed again), so amending
it only worked if the user had made a non-amend commit after the last
seek.
This commit is contained in:
Thomas Goyne 2012-12-29 08:40:10 -08:00
parent d5f36af87e
commit 2bf92fec6e

View file

@ -36,6 +36,11 @@
#include "video_frame.h" #include "video_frame.h"
#include "video_provider_manager.h" #include "video_provider_manager.h"
enum {
NEW_SUBS_FILE = -1,
SUBS_FILE_ALREADY_LOADED = -2
};
// Test if a line is a dialogue line which is not visible at the given time // Test if a line is a dialogue line which is not visible at the given time
struct invisible_line : public std::unary_function<AssEntry const&, bool> { struct invisible_line : public std::unary_function<AssEntry const&, bool> {
double time; double time;
@ -65,14 +70,18 @@ std::shared_ptr<AegiVideoFrame> ThreadedFrameSource::ProcFrame(int frameNum, dou
if (!raw && provider) { if (!raw && provider) {
try { try {
wxMutexLocker locker(fileMutex); wxMutexLocker locker(fileMutex);
if (subs.get() && singleFrame != frameNum) { if (subs && singleFrame != frameNum && singleFrame != SUBS_FILE_ALREADY_LOADED) {
// Generally edits and seeks come in groups; if the last thing done // Generally edits and seeks come in groups; if the last thing done
// was seek it is more likely that the user will seek again and // was seek it is more likely that the user will seek again and
// vice versa. As such, if this is the first frame requested after // vice versa. As such, if this is the first frame requested after
// an edit, only export the currently visible lines (because the // an edit, only export the currently visible lines (because the
// other lines will probably not be viewed before the file changes // other lines will probably not be viewed before the file changes
// again), and if it's a different frame, export the entire file. // again), and if it's a different frame, export the entire file.
if (singleFrame == -1) { if (singleFrame != NEW_SUBS_FILE) {
provider->LoadSubtitles(subs.get());
singleFrame = SUBS_FILE_ALREADY_LOADED;
}
else {
// This will crash if any of the export filters try to use // This will crash if any of the export filters try to use
// anything but the subtitles, but that wouldn't be safe to // anything but the subtitles, but that wouldn't be safe to
// do anyway // do anyway
@ -99,16 +108,12 @@ std::shared_ptr<AegiVideoFrame> ThreadedFrameSource::ProcFrame(int frameNum, dou
subs->Line.clear(); subs->Line.clear();
boost::push_back(subs->Line, full | boost::adaptors::indirected); boost::push_back(subs->Line, full | boost::adaptors::indirected);
} }
catch(...) { catch (...) {
subs->Line.clear(); subs->Line.clear();
boost::push_back(subs->Line, full | boost::adaptors::indirected); boost::push_back(subs->Line, full | boost::adaptors::indirected);
throw; throw;
} }
} }
else {
provider->LoadSubtitles(subs.get());
subs.reset();
}
} }
} }
catch (wxString const& err) { throw SubtitlesProviderErrorEvent(err); } catch (wxString const& err) { throw SubtitlesProviderErrorEvent(err); }
@ -160,7 +165,7 @@ void *ThreadedFrameSource::Entry() {
} }
} }
singleFrame = -1; singleFrame = NEW_SUBS_FILE;
} }
try { try {