Block until image data is sent to Hyperion.

This prevents the socket buffer to overflow if the connection is too slow.
This commit is contained in:
kevin 2019-06-27 07:43:15 -04:00
parent 7d9b6e8b6c
commit ed7ba36704
8 changed files with 36 additions and 13 deletions

View File

@ -48,7 +48,7 @@ hgx11::hgx11(QHash<QString, QString> 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<QString, QString> 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<QString, QString> 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()

View File

@ -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();

View File

@ -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;
}

View File

@ -2,6 +2,8 @@
#define HGX11DAMAGE_H
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QDebug>
#include <X11/extensions/Xdamage.h>
@ -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;

View File

@ -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<const uchar *>(_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<const char *>(qimg.bits()), qimg.byteCount());
imgdata_m = QByteArray::fromRawData(reinterpret_cast<const char *>(qimg.bits()), qimg.byteCount()).toBase64().data();
_freeResources();

View File

@ -12,7 +12,7 @@ class hgx11grab : public QObject
{
Q_OBJECT
public:
QByteArray imgdata_m;
QString imgdata_m;
hgx11grab(Display *, unsigned short);
~hgx11grab();

View File

@ -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();
}

View File

@ -44,7 +44,7 @@ private:
void _temperatureAdjustment();
public slots:
void sendImage(QByteArray *);
void sendImage(QString);
};
#endif // HGX11NET_H