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:
parent
9a69ca9de4
commit
c08a9d4d7d
2 changed files with 12 additions and 3 deletions
|
@ -63,8 +63,6 @@
|
|||
#include "video_context.h"
|
||||
#include "video_frame.h"
|
||||
|
||||
/// @brief Constructor
|
||||
///
|
||||
VideoContext::VideoContext()
|
||||
: playback(this)
|
||||
, startMS(0)
|
||||
|
@ -74,6 +72,7 @@ VideoContext::VideoContext()
|
|||
, arType(0)
|
||||
, hasSubtitles(false)
|
||||
, playAudioOnStep(OPT_GET("Audio/Plays When Stepping Video"))
|
||||
, no_amend(false)
|
||||
{
|
||||
Bind(EVT_VIDEO_ERROR, &VideoContext::OnVideoError, 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) {
|
||||
if (!IsLoaded()) return;
|
||||
|
||||
if (changed.empty())
|
||||
if (changed.empty() || no_amend)
|
||||
provider->LoadSubtitles(context->ass);
|
||||
else
|
||||
provider->UpdateSubtitles(context->ass, changed);
|
||||
if (!IsPlaying())
|
||||
GetFrameAsync(frame_n);
|
||||
|
||||
no_amend = false;
|
||||
}
|
||||
|
||||
void VideoContext::OnSubtitlesSave() {
|
||||
no_amend = true;
|
||||
|
||||
context->ass->SetScriptInfo("VFR File", MakeRelativePath(GetTimecodesName(), context->ass->filename));
|
||||
context->ass->SetScriptInfo("Keyframes File", MakeRelativePath(GetKeyFramesName(), context->ass->filename));
|
||||
|
||||
|
|
|
@ -130,6 +130,12 @@ class VideoContext : public wxEvtHandler {
|
|||
/// Cached option for audio playing when frame stepping
|
||||
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);
|
||||
|
||||
/// The timecodes from the video file
|
||||
|
|
Loading…
Reference in a new issue