From fceb1e8d3ebf9e97d90e5bb5f2bd8f4a16cbd736 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 24 Feb 2020 11:57:39 +1100 Subject: [PATCH] viewer: re-render both video and audio if parameters change --- app/render/videoparams.cpp | 20 ++++++++++++++++++++ app/render/videoparams.h | 3 +++ app/widget/viewer/viewer.cpp | 23 ++++++++++++++++------- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/app/render/videoparams.cpp b/app/render/videoparams.cpp index 4b26766eb..b81fd6059 100644 --- a/app/render/videoparams.cpp +++ b/app/render/videoparams.cpp @@ -77,6 +77,26 @@ const RenderMode::Mode &VideoRenderingParams::mode() const return mode_; } +bool VideoRenderingParams::operator==(const VideoRenderingParams &rhs) const +{ + return width() == rhs.width() + && height() == rhs.height() + && time_base() == rhs.time_base() + && format() == rhs.format() + && mode() == rhs.mode() + && divider() == rhs.divider(); +} + +bool VideoRenderingParams::operator!=(const VideoRenderingParams &rhs) const +{ + return width() != rhs.width() + || height() != rhs.height() + || time_base() != rhs.time_base() + || format() != rhs.format() + || mode() != rhs.mode() + || divider() != rhs.divider(); +} + void VideoRenderingParams::calculate_effective_size() { effective_width_ = width() / divider_; diff --git a/app/render/videoparams.h b/app/render/videoparams.h index 3e9bb52c9..68b6efb4e 100644 --- a/app/render/videoparams.h +++ b/app/render/videoparams.h @@ -36,6 +36,9 @@ public: const PixelFormat::Format& format() const; const RenderMode::Mode& mode() const; + bool operator==(const VideoRenderingParams& rhs) const; + bool operator!=(const VideoRenderingParams& rhs) const; + private: void calculate_effective_size(); diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 8df623845..81add9f61 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -295,14 +295,23 @@ void ViewerWidget::UpdateRendererParameters() RenderMode::Mode render_mode = RenderMode::kOffline; - video_renderer_->SetParameters(VideoRenderingParams(GetConnectedNode()->video_params(), - PixelService::instance()->GetConfiguredFormatForMode(render_mode), - render_mode, - divider_)); - audio_renderer_->SetParameters(AudioRenderingParams(GetConnectedNode()->audio_params(), - SampleFormat::GetConfiguredFormatForMode(render_mode))); + VideoRenderingParams vparam(GetConnectedNode()->video_params(), + PixelService::instance()->GetConfiguredFormatForMode(render_mode), + render_mode, + divider_); - video_renderer_->InvalidateCache(TimeRange(0, GetConnectedNode()->Length())); + if (video_renderer_->params() != vparam) { + video_renderer_->SetParameters(vparam); + video_renderer_->InvalidateCache(TimeRange(0, GetConnectedNode()->Length())); + } + + AudioRenderingParams aparam(GetConnectedNode()->audio_params(), + SampleFormat::GetConfiguredFormatForMode(render_mode)); + + if (audio_renderer_->params() != aparam) { + audio_renderer_->SetParameters(aparam); + audio_renderer_->InvalidateCache(TimeRange(0, GetConnectedNode()->Length())); + } } void ViewerWidget::ShowContextMenu(const QPoint &pos)