From 61fa062794ca55614b9ccf37092dd559a3c371f0 Mon Sep 17 00:00:00 2001 From: Bruno Date: Tue, 25 May 2021 20:20:43 +0200 Subject: [PATCH] Correct implementation of DeviceSource resize previous commit was bad... --- DeviceSource.cpp | 5 +++-- FrameBuffer.cpp | 25 +++++++++++++++++++++++++ FrameBuffer.h | 1 + Source.cpp | 8 -------- Source.h | 1 - 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/DeviceSource.cpp b/DeviceSource.cpp index 5001758..616411f 100644 --- a/DeviceSource.cpp +++ b/DeviceSource.cpp @@ -384,13 +384,14 @@ void DeviceSource::setDevice(const std::string &devicename) pipeline << " ! videoconvert"; - dettach(); + // resize render buffer + if (renderbuffer_) + renderbuffer_->resize(best.width, best.height); // open gstreamer stream_->open( pipeline.str(), best.width, best.height); stream_->play(true); - // will be ready after init and one frame rendered ready_ = false; } diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index 793b7b6..f1af503 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -171,6 +171,31 @@ glm::vec3 FrameBuffer::resolution() const return glm::vec3(attrib_.viewport.x, attrib_.viewport.y, 0.f); } +void FrameBuffer::resize(int width, int height) +{ + if (framebufferid_) { + if (attrib_.viewport.x != width || attrib_.viewport.y != height) + { + // de-init + glDeleteFramebuffers(1, &framebufferid_); + framebufferid_ = 0; + + if (intermediate_framebufferid_) + glDeleteFramebuffers(1, &intermediate_framebufferid_); + intermediate_framebufferid_ = 0; + if (textureid_) + glDeleteTextures(1, &textureid_); + textureid_ = 0; + if (intermediate_textureid_) + glDeleteTextures(1, &intermediate_textureid_); + intermediate_textureid_ = 0; + + // change resolution + attrib_.viewport = glm::ivec2(width, height); + } + } +} + void FrameBuffer::begin(bool clear) { if (!framebufferid_) diff --git a/FrameBuffer.h b/FrameBuffer.h index ff5bdeb..5caf8a1 100644 --- a/FrameBuffer.h +++ b/FrameBuffer.h @@ -69,6 +69,7 @@ public: inline uint width() const { return attrib_.viewport.x; } inline uint height() const { return attrib_.viewport.y; } glm::vec3 resolution() const; + void resize(int width, int height); float aspectRatio() const; std::string info() const; diff --git a/Source.cpp b/Source.cpp index 340f46b..0e44e36 100644 --- a/Source.cpp +++ b/Source.cpp @@ -425,14 +425,6 @@ void Source::render() } } -void Source::dettach() -{ - // replace renderbuffer_ - if (renderbuffer_) - delete renderbuffer_; - renderbuffer_ = nullptr; -} - void Source::attach(FrameBuffer *renderbuffer) { // invalid argument diff --git a/Source.h b/Source.h index d9e7978..99f1c4c 100644 --- a/Source.h +++ b/Source.h @@ -246,7 +246,6 @@ protected: // NB: rendershader_ is applied at render() FrameBuffer *renderbuffer_; void attach(FrameBuffer *renderbuffer); - void dettach() ; // the rendersurface draws the renderbuffer in the scene // It is associated to the rendershader for mixing effects