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
104 lines
2.6 KiB
C++
104 lines
2.6 KiB
C++
#pragma once
|
|
|
|
// QT includes
|
|
#include <QObject>
|
|
#include <QTimer>
|
|
|
|
// Utils includes
|
|
#include <utils/Image.h>
|
|
#include <utils/ColorRgb.h>
|
|
#include <utils/ColorRgba.h>
|
|
#include <utils/GrabbingMode.h>
|
|
#include <utils/VideoMode.h>
|
|
|
|
// Forward class declaration
|
|
class DispmanxFrameGrabber;
|
|
class Hyperion;
|
|
class ImageProcessor;
|
|
|
|
///
|
|
/// The DispmanxWrapper uses an instance of the DispmanxFrameGrabber to obtain ImageRgb's from the
|
|
/// displayed content. This ImageRgb is processed to a ColorRgb for each led and commmited to the
|
|
/// attached Hyperion.
|
|
///
|
|
class DispmanxWrapper: public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
///
|
|
/// Constructs the dispmanx frame grabber with a specified grab size and update rate.
|
|
///
|
|
/// @param[in] grabWidth The width of the grabbed image [pixels]
|
|
/// @param[in] grabHeight The height of the grabbed images [pixels]
|
|
/// @param[in] updateRate_Hz The image grab rate [Hz]
|
|
/// @param[in] hyperion The instance of Hyperion used to write the led values
|
|
///
|
|
DispmanxWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion);
|
|
|
|
///
|
|
/// Destructor of this dispmanx frame grabber. Releases any claimed resources.
|
|
///
|
|
virtual ~DispmanxWrapper();
|
|
|
|
public slots:
|
|
///
|
|
/// Starts the grabber wich produces led values with the specified update rate
|
|
///
|
|
void start();
|
|
|
|
///
|
|
/// Performs a single frame grab and computes the led-colors
|
|
///
|
|
void action();
|
|
|
|
///
|
|
/// Stops the grabber
|
|
///
|
|
void stop();
|
|
|
|
void setCropping(const unsigned cropLeft, const unsigned cropRight,
|
|
const unsigned cropTop, const unsigned cropBottom);
|
|
|
|
///
|
|
/// Set the grabbing mode
|
|
/// @param[in] mode The new grabbing mode
|
|
///
|
|
void setGrabbingMode(const GrabbingMode mode);
|
|
|
|
///
|
|
/// Set the video mode (2D/3D)
|
|
/// @param[in] mode The new video mode
|
|
///
|
|
void setVideoMode(const VideoMode videoMode);
|
|
|
|
signals:
|
|
void emitImage(int priority, const Image<ColorRgb> & image, const int timeout_ms);
|
|
|
|
private:
|
|
/// The update rate [Hz]
|
|
const int _updateInterval_ms;
|
|
/// The timeout of the led colors [ms]
|
|
const int _timeout_ms;
|
|
/// The priority of the led colors
|
|
const int _priority;
|
|
|
|
/// The timer for generating events with the specified update rate
|
|
QTimer _timer;
|
|
|
|
/// The image used for grabbing frames
|
|
Image<ColorRgba> _image;
|
|
/// The actual grabber
|
|
DispmanxFrameGrabber * _frameGrabber;
|
|
/// The processor for transforming images to led colors
|
|
ImageProcessor * _processor;
|
|
|
|
/// The list with computed led colors
|
|
std::vector<ColorRgb> _ledColors;
|
|
|
|
/// Pointer to Hyperion for writing led values
|
|
Hyperion * _hyperion;
|
|
|
|
// forwarding enabled
|
|
bool _forward;
|
|
};
|