From 62a24348f962372aa62f71f387c4197befced31f Mon Sep 17 00:00:00 2001 From: Paulchen-Panther Date: Tue, 23 Aug 2016 07:04:57 +0200 Subject: [PATCH] Fix "if" statement in XShmGetImage check and other things (#192) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix "if" statement Nach dem testen des Codes, leider übersehen und nicht rückgängig gemacht. Entschuldigung. * Move XRenderSetPictureFilter from "grab" to "setupResources" part * Resize destination image to target screen dimension once * Fix coding style and add check for image resize --- libsrc/grabber/x11/X11Grabber.cpp | 8 +-- libsrc/utils/ImageResampler.cpp | 115 +++++++++++++++--------------- 2 files changed, 62 insertions(+), 61 deletions(-) diff --git a/libsrc/grabber/x11/X11Grabber.cpp b/libsrc/grabber/x11/X11Grabber.cpp index e7066e9a..feae804b 100755 --- a/libsrc/grabber/x11/X11Grabber.cpp +++ b/libsrc/grabber/x11/X11Grabber.cpp @@ -92,6 +92,7 @@ void X11Grabber::setupResources() _dstFormat = XRenderFindVisualFormat(_x11Display, _windowAttr.visual); _srcPicture = XRenderCreatePicture(_x11Display, _window, _srcFormat, CPRepeat, &_pictAttr); _dstPicture = XRenderCreatePicture(_x11Display, _pixmap, _dstFormat, CPRepeat, &_pictAttr); + XRenderSetPictureFilter(_x11Display, _srcPicture, FilterBilinear, NULL, 0); } } @@ -160,7 +161,6 @@ Image & X11Grabber::grab() }; XRenderSetPictureTransform (_x11Display, _srcPicture, &_transform); - XRenderSetPictureFilter(_x11Display, _srcPicture, FilterBilinear, NULL, 0); XRenderComposite( _x11Display, // dpy PictOpSrc, // op @@ -178,7 +178,7 @@ Image & X11Grabber::grab() XSync(_x11Display, False); - if (!_XShmAvailable) + if (_XShmAvailable) { XShmGetImage(_x11Display, _pixmap, _xImage, 0, 0, AllPlanes); } @@ -239,7 +239,6 @@ int X11Grabber::grabFrame(Image & image) }; XRenderSetPictureTransform (_x11Display, _srcPicture, &_transform); - XRenderSetPictureFilter(_x11Display, _srcPicture, FilterBilinear, NULL, 0); XRenderComposite( _x11Display, // dpy PictOpSrc, // op @@ -257,7 +256,7 @@ int X11Grabber::grabFrame(Image & image) XSync(_x11Display, False); - if (!_XShmAvailable) + if (_XShmAvailable) { XShmGetImage(_x11Display, _pixmap, _xImage, 0, 0, AllPlanes); } @@ -338,6 +337,7 @@ int X11Grabber::updateScreenDimensions() Info(_log, "Using XGetImage for grabbing"); } + _image.resize(_croppedWidth, _croppedHeight); setupResources(); return 1; diff --git a/libsrc/utils/ImageResampler.cpp b/libsrc/utils/ImageResampler.cpp index 0e17101c..d8df181c 100755 --- a/libsrc/utils/ImageResampler.cpp +++ b/libsrc/utils/ImageResampler.cpp @@ -1,14 +1,14 @@ #include "utils/ImageResampler.h" #include -ImageResampler::ImageResampler() : - _horizontalDecimation(1), - _verticalDecimation(1), - _cropLeft(0), - _cropRight(0), - _cropTop(0), - _cropBottom(0), - _videoMode(VIDEO_2D) +ImageResampler::ImageResampler() + : _horizontalDecimation(1) + , _verticalDecimation(1) + , _cropLeft(0) + , _cropRight(0) + , _cropTop(0) + , _cropBottom(0) + , _videoMode(VIDEO_2D) { } @@ -25,15 +25,15 @@ void ImageResampler::setHorizontalPixelDecimation(int decimator) void ImageResampler::setVerticalPixelDecimation(int decimator) { - _verticalDecimation = decimator; + _verticalDecimation = decimator; } void ImageResampler::setCropping(int cropLeft, int cropRight, int cropTop, int cropBottom) { - _cropLeft = cropLeft; - _cropRight = cropRight; - _cropTop = cropTop; - _cropBottom = cropBottom; + _cropLeft = cropLeft; + _cropRight = cropRight; + _cropTop = cropTop; + _cropBottom = cropBottom; } void ImageResampler::set3D(VideoMode mode) @@ -62,70 +62,71 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i } // calculate the output size - int outputWidth = (width - cropLeft - cropRight - _horizontalDecimation/2 + _horizontalDecimation - 1) / _horizontalDecimation; - int outputHeight = (height - cropTop - cropBottom - _verticalDecimation/2 + _verticalDecimation - 1) / _verticalDecimation; - outputImage.resize(outputWidth, outputHeight); + int outputWidth = (width - cropLeft - cropRight - _horizontalDecimation/2 + _horizontalDecimation - 1) / _horizontalDecimation; + int outputHeight = (height - cropTop - cropBottom - _verticalDecimation/2 + _verticalDecimation - 1) / _verticalDecimation; + if ((outputImage.height() != unsigned(outputHeight)) && (outputImage.width() != unsigned(outputWidth))) + outputImage.resize(outputWidth, outputHeight); for (int yDest = 0, ySource = cropTop + _verticalDecimation/2; yDest < outputHeight; ySource += _verticalDecimation, ++yDest) { - for (int xDest = 0, xSource = cropLeft + _horizontalDecimation/2; xDest < outputWidth; xSource += _horizontalDecimation, ++xDest) + for (int xDest = 0, xSource = cropLeft + _horizontalDecimation/2; xDest < outputWidth; xSource += _horizontalDecimation, ++xDest) { ColorRgb & rgb = outputImage(xDest, yDest); - + switch (pixelFormat) { - case PIXELFORMAT_UYVY: + case PIXELFORMAT_UYVY: { - int index = lineLength * ySource + xSource * 2; + int index = lineLength * ySource + xSource * 2; uint8_t y = data[index+1]; uint8_t u = ((xSource&1) == 0) ? data[index ] : data[index-2]; uint8_t v = ((xSource&1) == 0) ? data[index+2] : data[index ]; yuv2rgb(y, u, v, rgb.red, rgb.green, rgb.blue); } break; - case PIXELFORMAT_YUYV: + case PIXELFORMAT_YUYV: { - int index = lineLength * ySource + xSource * 2; + int index = lineLength * ySource + xSource * 2; uint8_t y = data[index]; uint8_t u = ((xSource&1) == 0) ? data[index+1] : data[index-1]; uint8_t v = ((xSource&1) == 0) ? data[index+3] : data[index+1]; yuv2rgb(y, u, v, rgb.red, rgb.green, rgb.blue); } break; - case PIXELFORMAT_BGR16: - { - int index = lineLength * ySource + xSource * 2; - rgb.blue = (data[index] & 0x1f) << 3; - rgb.green = (((data[index+1] & 0x7) << 3) | (data[index] & 0xE0) >> 5) << 2; - rgb.red = (data[index+1] & 0xF8); - } - break; - case PIXELFORMAT_BGR24: - { - int index = lineLength * ySource + xSource * 3; - rgb.blue = data[index ]; - rgb.green = data[index+1]; - rgb.red = data[index+2]; - } - break; - case PIXELFORMAT_RGB32: - { - int index = lineLength * ySource + xSource * 4; - rgb.red = data[index ]; - rgb.green = data[index+1]; - rgb.blue = data[index+2]; - } - break; - case PIXELFORMAT_BGR32: - { - int index = lineLength * ySource + xSource * 4; - rgb.blue = data[index ]; - rgb.green = data[index+1]; - rgb.red = data[index+2]; - } - break; - case PIXELFORMAT_NO_CHANGE: - Error(Logger::getInstance("ImageResampler"), "Invalid pixel format given"); + case PIXELFORMAT_BGR16: + { + int index = lineLength * ySource + xSource * 2; + rgb.blue = (data[index] & 0x1f) << 3; + rgb.green = (((data[index+1] & 0x7) << 3) | (data[index] & 0xE0) >> 5) << 2; + rgb.red = (data[index+1] & 0xF8); + } + break; + case PIXELFORMAT_BGR24: + { + int index = lineLength * ySource + xSource * 3; + rgb.blue = data[index ]; + rgb.green = data[index+1]; + rgb.red = data[index+2]; + } + break; + case PIXELFORMAT_RGB32: + { + int index = lineLength * ySource + xSource * 4; + rgb.red = data[index ]; + rgb.green = data[index+1]; + rgb.blue = data[index+2]; + } + break; + case PIXELFORMAT_BGR32: + { + int index = lineLength * ySource + xSource * 4; + rgb.blue = data[index ]; + rgb.green = data[index+1]; + rgb.red = data[index+2]; + } + break; + case PIXELFORMAT_NO_CHANGE: + Error(Logger::getInstance("ImageResampler"), "Invalid pixel format given"); break; } } @@ -143,7 +144,7 @@ void ImageResampler::yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t &r, uint8_ 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);