mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Extract ImageResampler from X11Grabber
Former-commit-id: 63e95fa85fc0ef5a66f6eb8b396cf4b6370cf5dd
This commit is contained in:
@@ -9,7 +9,6 @@ SET(V4L2_QT_HEADERS
|
||||
|
||||
SET(V4L2_HEADERS
|
||||
${CURRENT_HEADER_DIR}/VideoStandard.h
|
||||
${CURRENT_HEADER_DIR}/PixelFormat.h
|
||||
)
|
||||
|
||||
SET(V4L2_SOURCES
|
||||
|
@@ -20,19 +20,19 @@
|
||||
|
||||
static inline uint8_t clamp(int x)
|
||||
{
|
||||
return (x<0) ? 0 : ((x>255) ? 255 : uint8_t(x));
|
||||
return (x<0) ? 0 : ((x>255) ? 255 : uint8_t(x));
|
||||
}
|
||||
|
||||
static void yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t & r, uint8_t & g, uint8_t & b)
|
||||
{
|
||||
// see: http://en.wikipedia.org/wiki/YUV#Y.27UV444_to_RGB888_conversion
|
||||
int c = y - 16;
|
||||
int d = u - 128;
|
||||
int e = v - 128;
|
||||
// see: http://en.wikipedia.org/wiki/YUV#Y.27UV444_to_RGB888_conversion
|
||||
int c = y - 16;
|
||||
int d = u - 128;
|
||||
int e = v - 128;
|
||||
|
||||
r = clamp((298 * c + 409 * e + 128) >> 8);
|
||||
g = clamp((298 * c - 100 * d - 208 * e + 128) >> 8);
|
||||
b = clamp((298 * c + 516 * d + 128) >> 8);
|
||||
r = clamp((298 * c + 409 * e + 128) >> 8);
|
||||
g = clamp((298 * c - 100 * d - 208 * e + 128) >> 8);
|
||||
b = clamp((298 * c + 516 * d + 128) >> 8);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -8,16 +8,20 @@
|
||||
// X11Grabber includes
|
||||
#include <grabber/X11Grabber.h>
|
||||
|
||||
X11Grabber::X11Grabber(const unsigned cropHorizontal, const unsigned cropVertical, const unsigned pixelDecimation) :
|
||||
_pixelDecimation(pixelDecimation),
|
||||
_cropWidth(cropHorizontal),
|
||||
_cropHeight(cropVertical),
|
||||
X11Grabber::X11Grabber(int cropLeft, int cropRight, int cropTop, int cropBottom, int horizontalPixelDecimation, int verticalPixelDecimation) :
|
||||
_imageResampler(),
|
||||
_cropLeft(cropLeft),
|
||||
_cropRight(cropRight),
|
||||
_cropTop(cropTop),
|
||||
_cropBottom(cropBottom),
|
||||
_x11Display(nullptr),
|
||||
_screenWidth(0),
|
||||
_screenHeight(0),
|
||||
_image(0,0)
|
||||
{
|
||||
// empty
|
||||
_imageResampler.setHorizontalPixelDecimation(horizontalPixelDecimation);
|
||||
_imageResampler.setVerticalPixelDecimation(verticalPixelDecimation);
|
||||
_imageResampler.setCropping(0, 0, 0, 0); // cropping is performed by XGetImage
|
||||
}
|
||||
|
||||
X11Grabber::~X11Grabber()
|
||||
@@ -51,42 +55,18 @@ Image<ColorRgb> & X11Grabber::grab()
|
||||
|
||||
updateScreenDimensions();
|
||||
|
||||
const int croppedWidth = _screenWidth - 2*_cropWidth;
|
||||
const int croppedHeight = _screenHeight - 2*_cropHeight;
|
||||
const unsigned croppedWidth = _screenWidth - _cropLeft - _cropRight;
|
||||
const unsigned croppedHeight = _screenHeight - _cropTop - _cropBottom;
|
||||
|
||||
// Capture the current screen
|
||||
XImage * xImage = XGetImage(_x11Display, DefaultRootWindow(_x11Display), _cropWidth, _cropHeight, croppedWidth, croppedHeight, AllPlanes, ZPixmap);
|
||||
XImage * xImage = XGetImage(_x11Display, DefaultRootWindow(_x11Display), _cropLeft, _cropTop, croppedWidth, croppedHeight, AllPlanes, ZPixmap);
|
||||
if (xImage == nullptr)
|
||||
{
|
||||
std::cerr << "Grab failed" << std::endl;
|
||||
return _image;
|
||||
}
|
||||
|
||||
// Copy the capture XImage to the local image (and apply required decimation)
|
||||
ColorRgb * outputPtr = _image.memptr();
|
||||
int width = 0;
|
||||
int height = 0;
|
||||
for (int iY=(_pixelDecimation/2); iY<croppedHeight; iY+=_pixelDecimation)
|
||||
{
|
||||
width = 0;
|
||||
for (int iX=(_pixelDecimation/2); iX<croppedWidth; iX+=_pixelDecimation)
|
||||
{
|
||||
// Extract the pixel from the X11-image
|
||||
const uint32_t pixel = uint32_t(XGetPixel(xImage, iX, iY));
|
||||
|
||||
// Assign the color value
|
||||
outputPtr->red = uint8_t((pixel >> 16) & 0xff);
|
||||
outputPtr->green = uint8_t((pixel >> 8) & 0xff);
|
||||
outputPtr->blue = uint8_t((pixel >> 0) & 0xff);
|
||||
|
||||
// Move to the next output pixel
|
||||
++outputPtr;
|
||||
++width;
|
||||
}
|
||||
++height;
|
||||
}
|
||||
|
||||
std::cout << "decimated X11 message: " << width << " x " << height << std::endl;
|
||||
_imageResampler.processImage(reinterpret_cast<const uint8_t *>(xImage->data), xImage->width, xImage->height, xImage->bytes_per_line, PIXELFORMAT_BGR32, _image);
|
||||
|
||||
// Cleanup allocated resources of the X11 grab
|
||||
XDestroyImage(xImage);
|
||||
@@ -114,11 +94,5 @@ int X11Grabber::updateScreenDimensions()
|
||||
_screenHeight = window_attributes_return.height;
|
||||
std::cout << "[" << _screenWidth << "x" << _screenHeight <<"]" << std::endl;
|
||||
|
||||
// Update the size of the buffer used to transfer the screenshot
|
||||
int width = (_screenWidth - 2 * _cropWidth - _pixelDecimation/2 - 1) / _pixelDecimation + 1;
|
||||
int height = (_screenHeight - 2 * _cropHeight - _pixelDecimation/2 - 1) / _pixelDecimation + 1;
|
||||
|
||||
_image.resize(width, height);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user