After each image grab some resources need to be reset / freed.
Add a .gitignore for various Cmake files.
This commit is contained in:
parent
128197c9e3
commit
5441d1aba6
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
CMakeFiles/
|
||||||
|
Hyperion_Grabber_X11_QT_autogen/
|
||||||
|
cmake_install.cmake
|
||||||
|
CMakeCache.txt
|
||||||
|
Makefile
|
||||||
|
Hyperion_Grabber_X11_QT
|
||||||
@ -5,7 +5,7 @@
|
|||||||
hgx11grab::hgx11grab(int scaleDivisor, ushort frameSkip)
|
hgx11grab::hgx11grab(int scaleDivisor, ushort frameSkip)
|
||||||
{
|
{
|
||||||
_frameSkip_m = frameSkip;
|
_frameSkip_m = frameSkip;
|
||||||
_x11Display_p = XOpenDisplay(":0");
|
_x11Display_p = XOpenDisplay(nullptr);
|
||||||
if (_x11Display_p == nullptr) {
|
if (_x11Display_p == nullptr) {
|
||||||
qCritical() << "Failed to open X11 display.";
|
qCritical() << "Failed to open X11 display.";
|
||||||
return;
|
return;
|
||||||
@ -13,21 +13,23 @@ hgx11grab::hgx11grab(int scaleDivisor, ushort frameSkip)
|
|||||||
|
|
||||||
_window_m = DefaultRootWindow(_x11Display_p);
|
_window_m = DefaultRootWindow(_x11Display_p);
|
||||||
|
|
||||||
bool _XShmAvailable = XShmQueryExtension(_x11Display_p);
|
if (!XShmQueryExtension(_x11Display_p)) {
|
||||||
if (!_XShmAvailable) {
|
|
||||||
qCritical() << "Xshm is: not available.";
|
qCritical() << "Xshm is: not available.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dummy, pixmaps_supported;
|
int dummy, pixmaps_supported;
|
||||||
|
|
||||||
bool _XRenderAvailable = XRenderQueryExtension(_x11Display_p, &dummy, &dummy);
|
if (!XRenderQueryExtension(_x11Display_p, &dummy, &dummy)) {
|
||||||
if (!_XRenderAvailable) {
|
|
||||||
qCritical() << "XRender is not available.";
|
qCritical() << "XRender is not available.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
XShmQueryVersion(_x11Display_p, &dummy, &dummy, &pixmaps_supported);
|
if (!XShmQueryVersion(_x11Display_p, &dummy, &dummy, &pixmaps_supported)) {
|
||||||
|
qCritical("Could not get x shared memory version.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool _XShmPixmapAvailable = pixmaps_supported && XShmPixmapFormat(_x11Display_p) == ZPixmap;
|
bool _XShmPixmapAvailable = pixmaps_supported && XShmPixmapFormat(_x11Display_p) == ZPixmap;
|
||||||
if (!_XShmPixmapAvailable) {
|
if (!_XShmPixmapAvailable) {
|
||||||
qCritical() << "XshmPixMap is: not available.";
|
qCritical() << "XshmPixMap is: not available.";
|
||||||
@ -85,6 +87,7 @@ void hgx11grab::_grabFrame()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_freed_m = 0;
|
||||||
_xImage_p = XShmCreateImage(
|
_xImage_p = XShmCreateImage(
|
||||||
_x11Display_p, _windowAttr_m.visual,
|
_x11Display_p, _windowAttr_m.visual,
|
||||||
uint(_windowAttr_m.depth), ZPixmap, nullptr, &_shminfo_m,
|
uint(_windowAttr_m.depth), ZPixmap, nullptr, &_shminfo_m,
|
||||||
@ -105,7 +108,7 @@ void hgx11grab::_grabFrame()
|
|||||||
_srcPicture_m = XRenderCreatePicture(_x11Display_p, _window_m, _srcFormat_p, CPRepeat, &_pictAttr_m);
|
_srcPicture_m = XRenderCreatePicture(_x11Display_p, _window_m, _srcFormat_p, CPRepeat, &_pictAttr_m);
|
||||||
_dstPicture_m = XRenderCreatePicture(_x11Display_p, _pixmap_m, _dstFormat_p, CPRepeat, &_pictAttr_m);
|
_dstPicture_m = XRenderCreatePicture(_x11Display_p, _pixmap_m, _dstFormat_p, CPRepeat, &_pictAttr_m);
|
||||||
|
|
||||||
XRenderSetPictureFilter(_x11Display_p, _srcPicture_m, "bilinear", nullptr, 0);
|
XRenderSetPictureFilter(_x11Display_p, _srcPicture_m, FilterBilinear, nullptr, 0);
|
||||||
XRenderSetPictureTransform (_x11Display_p, _srcPicture_m, &_mTransform_m);
|
XRenderSetPictureTransform (_x11Display_p, _srcPicture_m, &_mTransform_m);
|
||||||
|
|
||||||
XRenderComposite(
|
XRenderComposite(
|
||||||
@ -148,6 +151,8 @@ void hgx11grab::_grabFrame()
|
|||||||
imgdata_m.append(_xImage_p->data[i+2]);
|
imgdata_m.append(_xImage_p->data[i+2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_freeResources();
|
||||||
|
|
||||||
imageCreated();
|
imageCreated();
|
||||||
}
|
}
|
||||||
@ -171,6 +176,9 @@ bool hgx11grab::_getWinAttr()
|
|||||||
|
|
||||||
void hgx11grab::_freeResources()
|
void hgx11grab::_freeResources()
|
||||||
{
|
{
|
||||||
|
if (_freed_m) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
XDestroyImage(_xImage_p);
|
XDestroyImage(_xImage_p);
|
||||||
XShmDetach(_x11Display_p, &_shminfo_m);
|
XShmDetach(_x11Display_p, &_shminfo_m);
|
||||||
shmdt(_shminfo_m.shmaddr);
|
shmdt(_shminfo_m.shmaddr);
|
||||||
@ -178,6 +186,7 @@ void hgx11grab::_freeResources()
|
|||||||
XRenderFreePicture(_x11Display_p, _srcPicture_m);
|
XRenderFreePicture(_x11Display_p, _srcPicture_m);
|
||||||
XRenderFreePicture(_x11Display_p, _dstPicture_m);
|
XRenderFreePicture(_x11Display_p, _dstPicture_m);
|
||||||
XFreePixmap(_x11Display_p, _pixmap_m);
|
XFreePixmap(_x11Display_p, _pixmap_m);
|
||||||
|
_freed_m = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hgx11grab::_setScale()
|
void hgx11grab::_setScale()
|
||||||
|
|||||||
@ -41,6 +41,7 @@ private:
|
|||||||
double _scale_m;
|
double _scale_m;
|
||||||
ushort _frameCount_m = 255;
|
ushort _frameCount_m = 255;
|
||||||
ushort _frameSkip_m = 0;
|
ushort _frameSkip_m = 0;
|
||||||
|
bool _freed_m = 0;
|
||||||
|
|
||||||
void _grabFrame();
|
void _grabFrame();
|
||||||
bool _getWinAttr();
|
bool _getWinAttr();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user