Slightly optimize performance by caching some variables and frameskipping in the damage loop.
This commit is contained in:
parent
c0657c13e5
commit
3f2c055515
@ -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)
|
||||
|
||||
15
hgx11.cpp
15
hgx11.cpp
@ -38,14 +38,13 @@ hgx11::hgx11(QHash<QString, QString> 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\":\"");
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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<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.clear();
|
||||
imgdata_m = QByteArray::fromRawData(reinterpret_cast<const char *>(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()
|
||||
|
||||
@ -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();
|
||||
|
||||
12
hgx11net.cpp
12
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();
|
||||
}
|
||||
|
||||
@ -12,8 +12,7 @@ public:
|
||||
BLUEADJUST = 0x02,
|
||||
GREENADJUST = 0x04,
|
||||
};
|
||||
QString imgWidth;
|
||||
QString imgHeight;
|
||||
QByteArray imgCmdBuf;
|
||||
|
||||
hgx11net(QString, ushort);
|
||||
~hgx11net();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user