From ed7ba36704d0f3e369fd4a7d261b192c7a0b818d Mon Sep 17 00:00:00 2001 From: kevin Date: Thu, 27 Jun 2019 07:43:15 -0400 Subject: [PATCH] Block until image data is sent to Hyperion. This prevents the socket buffer to overflow if the connection is too slow. --- hgx11.cpp | 17 ++++++++++++----- hgx11.h | 2 ++ hgx11damage.cpp | 6 +++++- hgx11damage.h | 8 +++++++- hgx11grab.cpp | 4 ++-- hgx11grab.h | 2 +- hgx11net.cpp | 8 ++++++-- hgx11net.h | 2 +- 8 files changed, 36 insertions(+), 13 deletions(-) diff --git a/hgx11.cpp b/hgx11.cpp index bab8926..54aa81f 100644 --- a/hgx11.cpp +++ b/hgx11.cpp @@ -48,7 +48,7 @@ hgx11::hgx11(QHash opts) _grabber_p = new hgx11grab(_display_p, scale); _hclient_p = new hgx11net(addr, port); - _damage_p = new hgx11damage(frameskip); + _damage_p = new hgx11damage(&_grabbed_m, frameskip); if (_inactiveXss_m) { _screensaver_p = new hgx11screensaver(_display_p); _inactiveTimeXss_m = ulong(_inactiveTime_m); @@ -57,9 +57,7 @@ hgx11::hgx11(QHash opts) _setImgSize(); _hclient_p->ledAdjustments(redAdjust, greenAdjust, blueAdjust, temperature, threshold, transform); - _damage_p->start(); - - connect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame())); + connect(_damage_p, SIGNAL(damageDetected()), this, SLOT(_grabImage())); connect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize())); connect(_grabber_p, SIGNAL(imageCreated()), this, SLOT(_sendImage())); _grabActive_m = true; @@ -75,10 +73,13 @@ hgx11::hgx11(QHash opts) _timer_p->start(1000); } } + + _damage_p->start(); } hgx11::~hgx11() { + _grabbed_m.wakeAll(); _timer_p->stop(); disconnect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame())); disconnect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize())); @@ -128,9 +129,15 @@ QString hgx11::_parseColorArr(QString value, bool isInt) // private slots +void hgx11::_grabImage() +{ + _grabber_p->grabFrame(); + _grabbed_m.wakeAll(); +} + void hgx11::_sendImage() { - _hclient_p->sendImage(&_grabber_p->imgdata_m); + _hclient_p->sendImage(_grabber_p->imgdata_m); } void hgx11::_inActivity() diff --git a/hgx11.h b/hgx11.h index 2419a61..d892ddf 100644 --- a/hgx11.h +++ b/hgx11.h @@ -18,6 +18,7 @@ public: ~hgx11(); private: + QWaitCondition _grabbed_m; Display *_display_p; hgx11damage *_damage_p; hgx11grab *_grabber_p; @@ -33,6 +34,7 @@ private: QString _parseColorArr(QString, bool); private slots: + void _grabImage(); void _sendImage(); void _inActivity(); void _activity(); diff --git a/hgx11damage.cpp b/hgx11damage.cpp index 4518eda..7cad896 100644 --- a/hgx11damage.cpp +++ b/hgx11damage.cpp @@ -2,8 +2,9 @@ // public -hgx11damage::hgx11damage(unsigned short frameSkip) +hgx11damage::hgx11damage(QWaitCondition * grabbed, unsigned short frameSkip) { + _grabbed_p = grabbed; _frameSkip_m = frameSkip; _display_p = XOpenDisplay(nullptr); if(_display_p == nullptr){ @@ -34,7 +35,10 @@ void hgx11damage::_monitor() XDamageSubtract(_display_p ,_damage_m, None, None); continue; } + _mutex_m.lock(); emit damageDetected(); + _grabbed_p->wait(&_mutex_m); + _mutex_m.unlock(); XDamageSubtract(_display_p ,_damage_m, None, None); _frameCount_m = 0; } diff --git a/hgx11damage.h b/hgx11damage.h index 98b1100..691bdf8 100644 --- a/hgx11damage.h +++ b/hgx11damage.h @@ -2,6 +2,8 @@ #define HGX11DAMAGE_H #include +#include +#include #include #include @@ -9,13 +11,17 @@ class hgx11damage : public QThread { Q_OBJECT public: - hgx11damage(unsigned short); + + hgx11damage(QWaitCondition *, unsigned short); ~hgx11damage(); private: + QWaitCondition * _grabbed_p; + QMutex _mutex_m; Display *_display_p; XEvent _event_m; Damage _damage_m; + bool _loop_m = true; ushort _frameCount_m = 255; ushort _frameSkip_m = 0; diff --git a/hgx11grab.cpp b/hgx11grab.cpp index ca73ae2..ff4d79f 100644 --- a/hgx11grab.cpp +++ b/hgx11grab.cpp @@ -140,7 +140,7 @@ void hgx11grab::grabFrame() _srcPicture_m = XRenderCreatePicture(_display_p, _window_m, _srcFormat_p, CPRepeat, &_pictAttr_m); _dstPicture_m = XRenderCreatePicture(_display_p, _pixmap_m, _dstFormat_p, CPRepeat, &_pictAttr_m); - XRenderSetPictureFilter(_display_p, _srcPicture_m, FilterBilinear, nullptr, 0); + XRenderSetPictureFilter(_display_p, _srcPicture_m, FilterFast, nullptr, 0); XRenderSetPictureTransform(_display_p, _srcPicture_m, &_mTransform_m); XRenderComposite( @@ -170,7 +170,7 @@ void hgx11grab::grabFrame() QImage qimg(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 = QByteArray::fromRawData(reinterpret_cast(qimg.bits()), qimg.byteCount()); + imgdata_m = QByteArray::fromRawData(reinterpret_cast(qimg.bits()), qimg.byteCount()).toBase64().data(); _freeResources(); diff --git a/hgx11grab.h b/hgx11grab.h index 426e15d..fc45c7e 100644 --- a/hgx11grab.h +++ b/hgx11grab.h @@ -12,7 +12,7 @@ class hgx11grab : public QObject { Q_OBJECT public: - QByteArray imgdata_m; + QString imgdata_m; hgx11grab(Display *, unsigned short); ~hgx11grab(); diff --git a/hgx11net.cpp b/hgx11net.cpp index f629894..3718eaa 100644 --- a/hgx11net.cpp +++ b/hgx11net.cpp @@ -5,6 +5,7 @@ hgx11net::hgx11net(QString host, ushort port) { _sock_p = new QTcpSocket(this); + _sock_p->setReadBufferSize(1); _host_m = host; _port_m = port; _connectHost(); @@ -80,6 +81,9 @@ void hgx11net::_sendCommand() return; } _sock_p->write(_cmd_m); + while (_sock_p->bytesToWrite()) { + _sock_p->waitForBytesWritten(); + } } void hgx11net::_ledAdjustments() @@ -169,10 +173,10 @@ void hgx11net::_temperatureAdjustment() // public slots -void hgx11net::sendImage(QByteArray *imgdata) +void hgx11net::sendImage(QString imgdata) { _cmd_m = imgCmdBuf; - _cmd_m.append(imgdata->toBase64()); + _cmd_m.append(imgdata); _cmd_m.append("\"}\n"); _sendCommand(); } diff --git a/hgx11net.h b/hgx11net.h index 15249ec..1bb7233 100644 --- a/hgx11net.h +++ b/hgx11net.h @@ -44,7 +44,7 @@ private: void _temperatureAdjustment(); public slots: - void sendImage(QByteArray *); + void sendImage(QString); }; #endif // HGX11NET_H