From bbf6f8f9f96e16bdfc540f321b63598424e58552 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sun, 29 May 2022 10:15:32 -0700 Subject: [PATCH] export: fixed stills --- app/common/timerange.cpp | 2 +- app/core.cpp | 14 +++++++++----- app/core.h | 2 +- app/dialog/export/export.cpp | 2 +- app/dialog/export/export.h | 8 ++++++++ app/widget/viewer/viewer.cpp | 5 +++-- app/widget/viewer/viewer.h | 7 +++++++ 7 files changed, 30 insertions(+), 10 deletions(-) diff --git a/app/common/timerange.cpp b/app/common/timerange.cpp index 7326794ef..6c70ec748 100644 --- a/app/common/timerange.cpp +++ b/app/common/timerange.cpp @@ -368,7 +368,7 @@ void TimeRangeListFrameIterator::UpdateIndexIfNecessary() range_index_++; if (range_index_ < list_.size()) { - current_ = Timecode::snap_time_to_timebase(list_.at(range_index_).in(), timebase_, Timecode::kCeil); + current_ = Timecode::snap_time_to_timebase(list_.at(range_index_).in(), timebase_, Timecode::kRound); } } } diff --git a/app/core.cpp b/app/core.cpp index f5bea63d4..f6f18e2fe 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -390,10 +390,12 @@ void Core::DialogProjectPropertiesShow() void Core::DialogExportShow() { - ViewerOutput* viewer = GetSequenceToExport(); + ViewerOutput* viewer; + rational time; - if (viewer) { + if (GetSequenceToExport(&viewer, &time)) { ExportDialog* ed = new ExportDialog(viewer, main_window_); + ed->SetTime(time); connect(ed, &ExportDialog::finished, ed, &ExportDialog::deleteLater); ed->open(); } @@ -857,7 +859,7 @@ void Core::SaveProjectInternal(Project* project, const QString& override_filenam psm->deleteLater(); } -ViewerOutput* Core::GetSequenceToExport() +bool Core::GetSequenceToExport(ViewerOutput **viewer, rational *time) { // First try the most recently focused time based window TimeBasedPanel* time_panel = PanelManager::instance()->MostRecentlyFocused(); @@ -875,7 +877,9 @@ ViewerOutput* Core::GetSequenceToExport() tr("This Sequence is empty. There is nothing to export."), QMessageBox::Ok); } else { - return time_panel->GetConnectedViewer(); + *viewer = time_panel->GetConnectedViewer(); + *time = time_panel->GetTime(); + return true; } } else { QMessageBox::critical(main_window_, @@ -884,7 +888,7 @@ ViewerOutput* Core::GetSequenceToExport() QMessageBox::Ok); } - return nullptr; + return false; } QString Core::GetAutoRecoveryIndexFilename() diff --git a/app/core.h b/app/core.h index 429fbb549..1c7a923ef 100644 --- a/app/core.h +++ b/app/core.h @@ -545,7 +545,7 @@ private: /** * @brief Retrieves the currently most active sequence for exporting */ - ViewerOutput *GetSequenceToExport(); + bool GetSequenceToExport(ViewerOutput **viewer, rational *time); static QString GetAutoRecoveryIndexFilename(); diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index be37d2f10..d805f8726 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -526,7 +526,7 @@ ExportParams ExportDialog::GenerateParams() const if (ExportCodec::IsCodecAStillImage(video_tab_->GetSelectedCodec()) && !video_tab_->IsImageSequenceSet()) { // Exporting as image without exporting image sequence, only export one frame rational export_time = video_tab_->GetStillImageTime(); - params.set_custom_range(TimeRange(export_time, export_time)); + params.set_custom_range(TimeRange(export_time, export_time + GetSelectedTimebase())); } else if (range_combobox_->currentIndex() == kRangeInToOut) { // Assume if this combobox is enabled, workarea is enabled - a check that we make in this dialog's constructor params.set_custom_range(viewer_node_->GetTimelinePoints()->workarea()->range()); diff --git a/app/dialog/export/export.h b/app/dialog/export/export.h index dae5ee996..df16c4850 100644 --- a/app/dialog/export/export.h +++ b/app/dialog/export/export.h @@ -46,6 +46,14 @@ public: rational GetSelectedTimebase() const; + void SetTime(const rational &time) + { + preview_viewer_->SetAudioScrubbingEnabled(false); + preview_viewer_->SetTime(time); + video_tab_->SetTime(time); + preview_viewer_->SetAudioScrubbingEnabled(true); + } + protected: virtual void closeEvent(QCloseEvent *e) override; diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index a32c5df02..41681b009 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -68,7 +68,8 @@ ViewerWidget::ViewerWidget(QWidget *parent) : prequeuing_video_(false), prequeuing_audio_(0), record_armed_(false), - recording_(false) + recording_(false), + enable_audio_scrubbing_(true) { // Set up main layout QVBoxLayout* layout = new QVBoxLayout(this); @@ -838,7 +839,7 @@ void ViewerWidget::PauseInternal() void ViewerWidget::PushScrubbedAudio() { - if (!IsPlaying() && GetConnectedNode() && OLIVE_CONFIG("AudioScrubbing").toBool()) { + if (!IsPlaying() && GetConnectedNode() && OLIVE_CONFIG("AudioScrubbing").toBool() && enable_audio_scrubbing_) { // Get audio src device from renderer const AudioParams& params = GetConnectedNode()->audio_playback_cache()->GetParameters(); diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index bc998748c..b19e8f1f5 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -89,6 +89,11 @@ public: void StartCapture(TimelineWidget *source, const TimeRange &time, const Track::Reference &track); + void SetAudioScrubbingEnabled(bool e) + { + enable_audio_scrubbing_ = e; + } + public slots: void Play(bool in_to_out_only); @@ -276,6 +281,8 @@ private: qint64 queue_starved_start_; + bool enable_audio_scrubbing_; + private slots: void PlaybackTimerUpdate();