Always make a full copy of the subtitles for ThreadedFrameSource after a save

Saving can add new lines to the file without making a commit, resulting
in the rendering thread's copy of the file getting out of sync.
This commit is contained in:
Thomas Goyne 2013-01-14 08:15:12 -08:00
parent 9a69ca9de4
commit c08a9d4d7d
2 changed files with 12 additions and 3 deletions

View file

@ -63,8 +63,6 @@
#include "video_context.h" #include "video_context.h"
#include "video_frame.h" #include "video_frame.h"
/// @brief Constructor
///
VideoContext::VideoContext() VideoContext::VideoContext()
: playback(this) : playback(this)
, startMS(0) , startMS(0)
@ -74,6 +72,7 @@ VideoContext::VideoContext()
, arType(0) , arType(0)
, hasSubtitles(false) , hasSubtitles(false)
, playAudioOnStep(OPT_GET("Audio/Plays When Stepping Video")) , playAudioOnStep(OPT_GET("Audio/Plays When Stepping Video"))
, no_amend(false)
{ {
Bind(EVT_VIDEO_ERROR, &VideoContext::OnVideoError, this); Bind(EVT_VIDEO_ERROR, &VideoContext::OnVideoError, this);
Bind(EVT_SUBTITLES_ERROR, &VideoContext::OnSubtitlesError, this); Bind(EVT_SUBTITLES_ERROR, &VideoContext::OnSubtitlesError, this);
@ -236,15 +235,19 @@ void VideoContext::Reload() {
void VideoContext::OnSubtitlesCommit(int type, std::set<const AssEntry *> const& changed) { void VideoContext::OnSubtitlesCommit(int type, std::set<const AssEntry *> const& changed) {
if (!IsLoaded()) return; if (!IsLoaded()) return;
if (changed.empty()) if (changed.empty() || no_amend)
provider->LoadSubtitles(context->ass); provider->LoadSubtitles(context->ass);
else else
provider->UpdateSubtitles(context->ass, changed); provider->UpdateSubtitles(context->ass, changed);
if (!IsPlaying()) if (!IsPlaying())
GetFrameAsync(frame_n); GetFrameAsync(frame_n);
no_amend = false;
} }
void VideoContext::OnSubtitlesSave() { void VideoContext::OnSubtitlesSave() {
no_amend = true;
context->ass->SetScriptInfo("VFR File", MakeRelativePath(GetTimecodesName(), context->ass->filename)); context->ass->SetScriptInfo("VFR File", MakeRelativePath(GetTimecodesName(), context->ass->filename));
context->ass->SetScriptInfo("Keyframes File", MakeRelativePath(GetKeyFramesName(), context->ass->filename)); context->ass->SetScriptInfo("Keyframes File", MakeRelativePath(GetKeyFramesName(), context->ass->filename));

View file

@ -130,6 +130,12 @@ class VideoContext : public wxEvtHandler {
/// Cached option for audio playing when frame stepping /// Cached option for audio playing when frame stepping
const agi::OptionValue* playAudioOnStep; const agi::OptionValue* playAudioOnStep;
/// Amending the frame source's copy of the subtitle file requires that it
/// be kept in perfect sync. Saving the file can add lines to the file
/// without a commit, breaking this sync, so force a non-amend after each
/// save.
bool no_amend;
void OnPlayTimer(wxTimerEvent &event); void OnPlayTimer(wxTimerEvent &event);
/// The timecodes from the video file /// The timecodes from the video file