mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
57 lines
1.4 KiB
C++
57 lines
1.4 KiB
C++
|
|
#include "DispmanxFrameGrabber.h"
|
|
|
|
DispmanxFrameGrabber::DispmanxFrameGrabber(const unsigned width, const unsigned height) :
|
|
_display(0),
|
|
_resource(0),
|
|
_width(width),
|
|
_height(height)
|
|
{
|
|
// Initiase BCM
|
|
bcm_host_init();
|
|
|
|
// Open the connection to the displaydisplay
|
|
_display = vc_dispmanx_display_open(0);
|
|
int ret = vc_dispmanx_display_get_info(_display, &_info);
|
|
// Make the compiler (in release mode) happy by 'using' ret
|
|
(void)ret;
|
|
assert(ret == 0);
|
|
|
|
// Create the resources for capturing image
|
|
_resource = vc_dispmanx_resource_create(
|
|
VC_IMAGE_RGB888,
|
|
width,
|
|
height,
|
|
&_vc_image_ptr);
|
|
assert(_resource);
|
|
|
|
// Define the capture rectangle with the same size
|
|
vc_dispmanx_rect_set(&_rectangle, 0, 0, width, height);
|
|
_pitch = width * 3;
|
|
}
|
|
|
|
DispmanxFrameGrabber::~DispmanxFrameGrabber()
|
|
{
|
|
// Clean up resources
|
|
vc_dispmanx_resource_delete(_resource);
|
|
|
|
// Close the displaye
|
|
vc_dispmanx_display_close(_display);
|
|
|
|
// De-init BCM
|
|
bcm_host_deinit();
|
|
}
|
|
|
|
void DispmanxFrameGrabber::grabFrame(RgbImage& image)
|
|
{
|
|
// Sanity check of the given image size
|
|
assert(image.width() == _width && image.height() == _height);
|
|
|
|
void* image_ptr = image.memptr();
|
|
|
|
// Create the snapshot
|
|
vc_dispmanx_snapshot(_display, _resource, VC_IMAGE_ROT0);
|
|
// Read the snapshot into the memory (incl down-scaling)
|
|
vc_dispmanx_resource_read_data(_resource, &_rectangle, image_ptr, _pitch);
|
|
}
|