mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
f584b05de5
* dispmanx: fix grabber issues with certain widths and support cropping The dispmanx grabber will produce garbage output if the destination pitch is not set to a multiple of 64 bytes (16 RGBA pixels). It can also fail when retrieving only a part of the image (eg in 3DSBS or TAB mode). Handle these cases by capturing the full image into a separate buffer with the pitch set to an appropriate value and manually handle 3D SBS/TAB left/top half copying. At this point supporting cropping like in the V4L2 grabber is rather easy and added as well. This'll help handling overscan setups (old TVs) and removing (possibly asymmetric) overscan borders. Cropping is disabled in video capture mode (when the DISPMANX_SNAPSHOT_FILL flag is set). Signed-off-by: Matthias Reichl <hias@horus.com> * hyperion-dispmanx: add optional crop values and 3D mode options Signed-off-by: Matthias Reichl <hias@horus.com> * hyperiond: support cropping on the dispmanx grabber Honor cropLeft, cropRight, cropTop and cropBottom settings in the framegrabber section of the conf file to control cropping. Signed-off-by: Matthias Reichl <hias@horus.com> Former-commit-id: bbb55f6621b90384e417f37da4f2543d112ef57a
103 lines
2.5 KiB
C++
103 lines
2.5 KiB
C++
// QT includes
|
|
#include <QDebug>
|
|
#include <QDateTime>
|
|
|
|
// Hyperion includes
|
|
#include <hyperion/Hyperion.h>
|
|
#include <hyperion/ImageProcessorFactory.h>
|
|
#include <hyperion/ImageProcessor.h>
|
|
|
|
// Dispmanx grabber includes
|
|
#include <grabber/DispmanxWrapper.h>
|
|
#include <grabber/DispmanxFrameGrabber.h>
|
|
|
|
|
|
DispmanxWrapper::DispmanxWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion) :
|
|
_updateInterval_ms(1000/updateRate_Hz),
|
|
_timeout_ms(2 * _updateInterval_ms),
|
|
_priority(priority),
|
|
_timer(),
|
|
_image(grabWidth, grabHeight),
|
|
_frameGrabber(new DispmanxFrameGrabber(grabWidth, grabHeight)),
|
|
_processor(ImageProcessorFactory::getInstance().newImageProcessor()),
|
|
_ledColors(hyperion->getLedCount(), ColorRgb{0,0,0}),
|
|
_hyperion(hyperion)
|
|
{
|
|
// Configure the timer to generate events every n milliseconds
|
|
_timer.setInterval(_updateInterval_ms);
|
|
_timer.setSingleShot(false);
|
|
|
|
_processor->setSize(grabWidth, grabHeight);
|
|
_forward = _hyperion->getForwarder()->protoForwardingEnabled();
|
|
|
|
// Connect the QTimer to this
|
|
QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action()));
|
|
}
|
|
|
|
DispmanxWrapper::~DispmanxWrapper()
|
|
{
|
|
// Cleanup used resources (ImageProcessor and FrameGrabber)
|
|
delete _processor;
|
|
delete _frameGrabber;
|
|
}
|
|
|
|
void DispmanxWrapper::start()
|
|
{
|
|
// Start the timer with the pre configured interval
|
|
_timer.start();
|
|
}
|
|
|
|
void DispmanxWrapper::action()
|
|
{
|
|
// Grab frame into the allocated image
|
|
_frameGrabber->grabFrame(_image);
|
|
|
|
if ( _forward )
|
|
{
|
|
Image<ColorRgb> image_rgb;
|
|
_image.toRgb(image_rgb);
|
|
emit emitImage(_priority, image_rgb, _timeout_ms);
|
|
}
|
|
|
|
_processor->process(_image, _ledColors);
|
|
_hyperion->setColors(_priority, _ledColors, _timeout_ms);
|
|
}
|
|
|
|
void DispmanxWrapper::stop()
|
|
{
|
|
// Stop the timer, effectivly stopping the process
|
|
_timer.stop();
|
|
}
|
|
|
|
void DispmanxWrapper::setGrabbingMode(const GrabbingMode mode)
|
|
{
|
|
switch (mode)
|
|
{
|
|
case GRABBINGMODE_VIDEO:
|
|
_frameGrabber->setFlags(DISPMANX_SNAPSHOT_NO_RGB|DISPMANX_SNAPSHOT_FILL);
|
|
start();
|
|
break;
|
|
case GRABBINGMODE_AUDIO:
|
|
case GRABBINGMODE_PHOTO:
|
|
case GRABBINGMODE_MENU:
|
|
case GRABBINGMODE_INVALID:
|
|
_frameGrabber->setFlags(0);
|
|
start();
|
|
break;
|
|
case GRABBINGMODE_OFF:
|
|
stop();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void DispmanxWrapper::setVideoMode(const VideoMode mode)
|
|
{
|
|
_frameGrabber->setVideoMode(mode);
|
|
}
|
|
|
|
void DispmanxWrapper::setCropping(const unsigned cropLeft, const unsigned cropRight,
|
|
const unsigned cropTop, const unsigned cropBottom)
|
|
{
|
|
_frameGrabber->setCropping(cropLeft, cropRight, cropTop, cropBottom);
|
|
}
|