diff --git a/CMakeLists.txt b/CMakeLists.txt index 4225df5..a588dfb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ project(Hyperion_Grabber_X11_QT VERSION 0.1 LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) -set(CMAKE_BUILD_TYPE Desktop) +set(CMAKE_BUILD_TYPE RelWithDebInfo) find_package(Qt5Core REQUIRED) find_package(Qt5Network REQUIRED) diff --git a/hgx11.cpp b/hgx11.cpp index d0101aa..85ffdf8 100644 --- a/hgx11.cpp +++ b/hgx11.cpp @@ -38,14 +38,13 @@ hgx11::hgx11(QHash opts) } } - _grabber_p = new hgx11grab(scale, frameskip); + _grabber_p = new hgx11grab(scale); _hclient_p = new hgx11net(addr, port); - _damage_p = new hgx11damage(); + _damage_p = new hgx11damage(frameskip); - _hclient_p->imgWidth = QString::number(_grabber_p->getDest_width()); - _hclient_p->imgHeight = QString::number(_grabber_p->getDest_height()); + _setImgSize(); _hclient_p->ledAdjustments(redAdjust, greenAdjust, blueAdjust, temperature, threshold, transform); _damage_p->start(); @@ -118,6 +117,10 @@ void hgx11::_activity() void hgx11::_setImgSize() { - _hclient_p->imgWidth = QString::number(_grabber_p->getDest_width()); - _hclient_p->imgHeight = QString::number(_grabber_p->getDest_height()); + _hclient_p->imgCmdBuf.clear(); + _hclient_p->imgCmdBuf.append("{\"command\":\"image\",\"priority\":100,\"imageheight\":"); + _hclient_p->imgCmdBuf.append(QString::number(_grabber_p->getDest_height())); + _hclient_p->imgCmdBuf.append(",\"imagewidth\":"); + _hclient_p->imgCmdBuf.append(QString::number(_grabber_p->getDest_width())); + _hclient_p->imgCmdBuf.append(",\"imagedata\":\""); } diff --git a/hgx11damage.cpp b/hgx11damage.cpp index 27f4771..4e5ee17 100644 --- a/hgx11damage.cpp +++ b/hgx11damage.cpp @@ -2,8 +2,9 @@ // public -hgx11damage::hgx11damage() +hgx11damage::hgx11damage(unsigned short frameSkip) { + _frameSkip_m = frameSkip; _display_p = XOpenDisplay(nullptr); if(!_display_p){ qCritical() << "failed to open x display"; @@ -28,7 +29,12 @@ void hgx11damage::_monitor() } while (_loop_m) { XNextEvent(_display_p, &_event_m); + if (_frameCount_m++ < _frameSkip_m) { + XDamageSubtract(_display_p ,_damage_m, None, None); + continue; + } emit damageDetected(); XDamageSubtract(_display_p ,_damage_m, None, None); + _frameCount_m = 0; } } diff --git a/hgx11damage.h b/hgx11damage.h index faa897d..98b1100 100644 --- a/hgx11damage.h +++ b/hgx11damage.h @@ -9,7 +9,7 @@ class hgx11damage : public QThread { Q_OBJECT public: - hgx11damage(); + hgx11damage(unsigned short); ~hgx11damage(); private: @@ -17,6 +17,8 @@ private: XEvent _event_m; Damage _damage_m; bool _loop_m = true; + ushort _frameCount_m = 255; + ushort _frameSkip_m = 0; void _monitor(); diff --git a/hgx11grab.cpp b/hgx11grab.cpp index ba4d8cf..f60cbbb 100644 --- a/hgx11grab.cpp +++ b/hgx11grab.cpp @@ -2,9 +2,8 @@ // public -hgx11grab::hgx11grab(unsigned short scaleDivisor, unsigned short frameSkip) +hgx11grab::hgx11grab(unsigned short scaleDivisor) { - _frameSkip_m = frameSkip; _x11Display_p = XOpenDisplay(nullptr); if (_x11Display_p == nullptr) { qCritical() << "Failed to open X11 display."; @@ -81,7 +80,47 @@ int hgx11grab::getDest_width() const // private -void hgx11grab::_grabFrame() +bool hgx11grab::_getWinAttr() +{ + if (XGetWindowAttributes(_x11Display_p, _window_m, &_windowAttr_m) == 0) { + qWarning() << "Failed to obtain X11 window attributes."; + return false; + } + if (_srcWidth_m != _windowAttr_m.width || _srcHeight_m != _windowAttr_m.height) { + if (0 != _srcWidth_m) { + _freeResources(); + } + _srcWidth_m = _windowAttr_m.width; + _srcHeight_m = _windowAttr_m.height; + emit scaleChanged(); + } + return true; +} + +void hgx11grab::_freeResources() +{ + if (_freed_m) { + return; + } + XDestroyImage(_xImage_p); + XShmDetach(_x11Display_p, &_shminfo_m); + shmdt(_shminfo_m.shmaddr); + shmctl(_shminfo_m.shmid, IPC_RMID, nullptr); + XRenderFreePicture(_x11Display_p, _srcPicture_m); + XRenderFreePicture(_x11Display_p, _dstPicture_m); + XFreePixmap(_x11Display_p, _pixmap_m); + _freed_m = 1; +} + +void hgx11grab::_setScale() +{ + _scale_m = (1.0 / (double(_srcWidth_m) / double(_destWidth_m))); + _mTransform_m.matrix[2][2] = XDoubleToFixed(_scale_m); +} + +// public slots + +void hgx11grab::grabFrame() { if (!_getWinAttr()) { return; @@ -138,7 +177,6 @@ void hgx11grab::_grabFrame() QImage qimg = *new QImage(reinterpret_cast(_xImage_p->data), _destWidth_m, _destHeight_m, _xImage_p->bytes_per_line, QImage::Format_ARGB32); qimg = qimg.convertToFormat(QImage::Format_RGB888); - imgdata_m.clear(); imgdata_m = QByteArray::fromRawData(reinterpret_cast(qimg.bits()), qimg.byteCount()); _freeResources(); @@ -146,55 +184,6 @@ void hgx11grab::_grabFrame() imageCreated(); } -bool hgx11grab::_getWinAttr() -{ - if (XGetWindowAttributes(_x11Display_p, _window_m, &_windowAttr_m) == 0) { - qWarning() << "Failed to obtain X11 window attributes."; - return false; - } - if (_srcWidth_m != _windowAttr_m.width || _srcHeight_m != _windowAttr_m.height) { - if (0 != _srcWidth_m) { - _freeResources(); - } - _srcWidth_m = _windowAttr_m.width; - _srcHeight_m = _windowAttr_m.height; - emit scaleChanged(); - } - return true; -} - -void hgx11grab::_freeResources() -{ - if (_freed_m) { - return; - } - XDestroyImage(_xImage_p); - XShmDetach(_x11Display_p, &_shminfo_m); - shmdt(_shminfo_m.shmaddr); - shmctl(_shminfo_m.shmid, IPC_RMID, nullptr); - XRenderFreePicture(_x11Display_p, _srcPicture_m); - XRenderFreePicture(_x11Display_p, _dstPicture_m); - XFreePixmap(_x11Display_p, _pixmap_m); - _freed_m = 1; -} - -void hgx11grab::_setScale() -{ - _scale_m = (1.0 / (double(_srcWidth_m) / double(_destWidth_m))); - _mTransform_m.matrix[2][2] = XDoubleToFixed(_scale_m); -} - -// public slots - -void hgx11grab::grabFrame() -{ - if (_frameCount_m++ < _frameSkip_m) { - return; - } - _frameCount_m = 0; - _grabFrame(); -} - // private slots void hgx11grab::_changeScale() diff --git a/hgx11grab.h b/hgx11grab.h index 9384207..23b2f9a 100644 --- a/hgx11grab.h +++ b/hgx11grab.h @@ -14,7 +14,7 @@ class hgx11grab : public QObject public: QByteArray imgdata_m; - hgx11grab(unsigned short, unsigned short); + hgx11grab(unsigned short); ~hgx11grab(); int getDest_width() const; @@ -39,8 +39,6 @@ private: int _destHeight_m; int _imgSize_m; double _scale_m; - ushort _frameCount_m = 255; - ushort _frameSkip_m = 0; bool _freed_m = 0; void _grabFrame(); diff --git a/hgx11net.cpp b/hgx11net.cpp index 1db6b43..b9b667a 100644 --- a/hgx11net.cpp +++ b/hgx11net.cpp @@ -170,16 +170,8 @@ void hgx11net::_temperatureAdjustment() void hgx11net::sendImage(QByteArray *imgdata) { - if (!_isConnected()) { - return; - } - _cmd_m.clear(); - _cmd_m.append("{\"command\":\"image\",\"imagedata\":\""); + _cmd_m = imgCmdBuf; _cmd_m.append(imgdata->toBase64()); - _cmd_m.append("\",\"imageheight\":"); - _cmd_m.append(imgHeight); - _cmd_m.append(",\"imagewidth\":"); - _cmd_m.append(imgWidth); - _cmd_m.append(",\"priority\":100}\n"); + _cmd_m.append("\"}\n"); _sendCommand(); } diff --git a/hgx11net.h b/hgx11net.h index 18e3ae6..15249ec 100644 --- a/hgx11net.h +++ b/hgx11net.h @@ -12,8 +12,7 @@ public: BLUEADJUST = 0x02, GREENADJUST = 0x04, }; - QString imgWidth; - QString imgHeight; + QByteArray imgCmdBuf; hgx11net(QString, ushort); ~hgx11net();