From aa6b77f800a360a0c1cc151fae235a9c5274e882 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Wed, 1 Feb 2023 00:40:06 -0800 Subject: [PATCH] exporttask: snap to timebase when exporting video This is a bit of a hack to prevent #2119 from causing problems. The reality is this probably requires a deeper re-think of how the timeline should and shouldn't work - this issue is more of a symptom of something deeper than a simple bug in and of itself. --- app/task/export/export.cpp | 28 +++++++++++----------------- app/task/export/export.h | 2 ++ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index 12ebf2ba6..0ab71cc09 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -51,8 +51,6 @@ ExportTask::ExportTask(ViewerOutput *viewer_node, bool ExportTask::Run() { - TimeRange range; - // For safety, if we're overwriting, we save to a temporary filename and then only overwrite it // at the end QString real_filename = params_.filename(); @@ -111,10 +109,10 @@ bool ExportTask::Run() if (params_.has_custom_range()) { // Render custom range only - range = params_.custom_range(); + export_range_ = params_.custom_range(); } else { // Render entire sequence - range = TimeRange(0, viewer()->GetLength()); + export_range_ = TimeRange(0, viewer()->GetLength()); } frame_time_ = 0; @@ -152,15 +150,19 @@ bool ExportTask::Run() TimeRange subtitle_range; if (params_.video_enabled()) { - video_range = {range}; + if (export_range_.in() > 0) { + export_range_.set_in(Timecode::snap_time_to_timebase(export_range_.in(), video_params().frame_rate_as_time_base())); + } + + video_range = {export_range_}; } if (params_.audio_enabled()) { - audio_range = {range}; + audio_range = {export_range_}; } if (subtitles_enabled) { - subtitle_range = range; + subtitle_range = export_range_; } Render(color_manager_, video_range, audio_range, subtitle_range, RenderMode::kOnline, nullptr, @@ -201,11 +203,7 @@ bool ExportTask::Run() bool ExportTask::FrameDownloaded(FramePtr f, const rational &time) { - rational actual_time = time; - - if (params_.has_custom_range()) { - actual_time -= params_.custom_range().in(); - } + rational actual_time = time - export_range_.in(); time_map_.insert(actual_time, f); @@ -233,11 +231,7 @@ bool ExportTask::FrameDownloaded(FramePtr f, const rational &time) bool ExportTask::AudioDownloaded(const TimeRange &range, const SampleBuffer &samples) { - TimeRange adjusted_range = range; - - if (params_.has_custom_range()) { - adjusted_range -= params_.custom_range().in(); - } + TimeRange adjusted_range = range - export_range_.in(); if (adjusted_range.in() == audio_time_) { if (!WriteAudioLoop(adjusted_range, samples)) { diff --git a/app/task/export/export.h b/app/task/export/export.h index 7a367c6b2..08cfdd69b 100644 --- a/app/task/export/export.h +++ b/app/task/export/export.h @@ -73,6 +73,8 @@ private: rational audio_time_; + TimeRange export_range_; + }; }