diff --git a/src/private/shmrenderer.cpp b/src/private/shmrenderer.cpp index 1a20a5aa37d450fb2a8b6917b47c966842b64ff2..3d8b040ebfd32df85a5ae183a1ef699e151e4c6e 100644 --- a/src/private/shmrenderer.cpp +++ b/src/private/shmrenderer.cpp @@ -77,7 +77,7 @@ public: //Attributes QString m_ShmPath ; - int fd ; + int m_fd ; SHMHeader* m_pShmArea ; unsigned m_ShmAreaLen ; uint m_BufferGen ; @@ -99,6 +99,7 @@ public: bool shmLock (); void shmUnlock (); bool renderToBitmap(); + bool resizeShm(); private: Video::ShmRenderer* q_ptr; @@ -110,7 +111,7 @@ private Q_SLOTS: } Video::ShmRendererPrivate::ShmRendererPrivate(Video::ShmRenderer* parent) : QObject(parent), q_ptr(parent), - fd(-1),m_fpsC(0),m_Fps(0), + m_fd(-1),m_fpsC(0),m_Fps(0), m_pShmArea((SHMHeader*)MAP_FAILED), m_ShmAreaLen(0), m_BufferGen(0), m_pTimer(nullptr) #ifdef DEBUG_FPS @@ -134,12 +135,15 @@ Video::ShmRenderer::~ShmRenderer() } ///Get the data from shared memory and transform it into a QByteArray -bool Video::ShmRendererPrivate::renderToBitmap() +bool +Video::ShmRendererPrivate::renderToBitmap() { QMutexLocker locker {q_ptr->mutex()}; #ifdef Q_OS_LINUX - if (!q_ptr->isRendering()) + auto& renderer = static_cast<Video::Renderer*>(q_ptr)->d_ptr; + auto& frame = renderer->otherFrame(); + if (frame.isEmpty()) return false; if (!shmLock()) @@ -161,13 +165,11 @@ bool Video::ShmRendererPrivate::renderToBitmap() if (not m_pShmArea->frameSize) return false; - if (!q_ptr->resizeShm()) { + if (!resizeShm()) { qDebug() << "Could not resize shared memory"; return false; } - auto& renderer = static_cast<Video::Renderer*>(q_ptr)->d_ptr; - auto& frame = renderer->otherFrame(); if ((unsigned)frame.size() != m_pShmArea->frameSize) frame.resize(m_pShmArea->frameSize); std::copy_n(m_pShmArea->data + m_pShmArea->readOffset, m_pShmArea->frameSize, frame.data()); @@ -192,16 +194,42 @@ bool Video::ShmRendererPrivate::renderToBitmap() #endif } +///Resize the shared memory +bool +Video::ShmRendererPrivate::resizeShm() +{ + const auto areaSize = sizeof(SHMHeader) + 2 * m_pShmArea->frameSize + 15; + if (m_ShmAreaLen == areaSize) + return true; + + shmUnlock(); + if (::munmap(m_pShmArea, m_ShmAreaLen)) { + qDebug() << "Could not unmap shared area:" << strerror(errno); + return false; + } + + m_pShmArea = (SHMHeader*) ::mmap(nullptr, areaSize, + PROT_READ | PROT_WRITE, + MAP_SHARED, m_fd, 0); + if (m_pShmArea == MAP_FAILED) { + qDebug() << "Could not remap shared area"; + return false; + } + + m_ShmAreaLen = areaSize; + return shmLock(); +} + ///Connect to the shared memory bool Video::ShmRenderer::startShm() { - if (d_ptr->fd != -1) { + if (d_ptr->m_fd != -1) { qDebug() << "fd must be -1"; return false; } - d_ptr->fd = ::shm_open(d_ptr->m_ShmPath.toLatin1(), O_RDWR, 0); - if (d_ptr->fd < 0) { + d_ptr->m_fd = ::shm_open(d_ptr->m_ShmPath.toLatin1(), O_RDWR, 0); + if (d_ptr->m_fd < 0) { qDebug() << "could not open shm area " << d_ptr->m_ShmPath << ", shm_open failed:" << strerror(errno); return false; @@ -210,7 +238,7 @@ bool Video::ShmRenderer::startShm() const auto areaSize = sizeof(SHMHeader); d_ptr->m_pShmArea = (SHMHeader*) ::mmap(nullptr, areaSize, PROT_READ | PROT_WRITE, - MAP_SHARED, d_ptr->fd, 0); + MAP_SHARED, d_ptr->m_fd, 0); if (d_ptr->m_pShmArea == MAP_FAILED) { qDebug() << "Could not remap shared area"; return false; @@ -225,11 +253,11 @@ bool Video::ShmRenderer::startShm() ///Disconnect from the shared memory void Video::ShmRenderer::stopShm() { - if (d_ptr->fd < 0) + if (d_ptr->m_fd < 0) return; - ::close(d_ptr->fd); - d_ptr->fd = -1; + ::close(d_ptr->m_fd); + d_ptr->m_fd = -1; if (d_ptr->m_pShmArea == MAP_FAILED) return; @@ -239,31 +267,6 @@ void Video::ShmRenderer::stopShm() d_ptr->m_pShmArea = (SHMHeader*) MAP_FAILED; } -///Resize the shared memory -bool Video::ShmRenderer::resizeShm() -{ - const auto areaSize = sizeof(SHMHeader) + 2 * d_ptr->m_pShmArea->frameSize + 15; - if (d_ptr->m_ShmAreaLen == areaSize) - return true; - - d_ptr->shmUnlock(); - if (::munmap(d_ptr->m_pShmArea, d_ptr->m_ShmAreaLen)) { - qDebug() << "Could not unmap shared area:" << strerror(errno); - return false; - } - - d_ptr->m_pShmArea = (SHMHeader*) ::mmap(nullptr, areaSize, - PROT_READ | PROT_WRITE, - MAP_SHARED, d_ptr->fd, 0); - if (d_ptr->m_pShmArea == MAP_FAILED) { - qDebug() << "Could not remap shared area"; - return false; - } - - d_ptr->m_ShmAreaLen = areaSize; - return d_ptr->shmLock(); -} - ///Lock the memory while the copy is being made bool Video::ShmRendererPrivate::shmLock() { @@ -301,7 +304,7 @@ void Video::ShmRendererPrivate::timedEvents() } m_fpsC++; - emit q_ptr->frameUpdated(); + //emit q_ptr->frameUpdated(); } /*else { qDebug() << "Frame dropped"; diff --git a/src/private/shmrenderer.h b/src/private/shmrenderer.h index 39bb2669c44a6ca3eb662471a107c779bfb928da..138134fdcacb953e9ff473762a06b0ddc65d0f98 100644 --- a/src/private/shmrenderer.h +++ b/src/private/shmrenderer.h @@ -48,7 +48,6 @@ class LIB_EXPORT ShmRenderer : public Renderer { virtual ~ShmRenderer(); //Mutators - bool resizeShm(); void stopShm (); bool startShm ();