mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Moved open and close of display to the 'grab' method, solving resolution switches.
Added doxygen comments to the dispmanx header.
This commit is contained in:
parent
240b118ce9
commit
f8c8fa6c74
@ -2,41 +2,47 @@
|
|||||||
#include "DispmanxFrameGrabber.h"
|
#include "DispmanxFrameGrabber.h"
|
||||||
|
|
||||||
DispmanxFrameGrabber::DispmanxFrameGrabber(const unsigned width, const unsigned height) :
|
DispmanxFrameGrabber::DispmanxFrameGrabber(const unsigned width, const unsigned height) :
|
||||||
_display(0),
|
_vc_display(0),
|
||||||
_resource(0),
|
_vc_resource(0),
|
||||||
_width(width),
|
_width(width),
|
||||||
_height(height)
|
_height(height)
|
||||||
{
|
{
|
||||||
// Initiase BCM
|
// Initiase BCM
|
||||||
bcm_host_init();
|
bcm_host_init();
|
||||||
|
|
||||||
// Open the connection to the display
|
{
|
||||||
_display = vc_dispmanx_display_open(0);
|
// Check if the display can be opened and display the current resolution
|
||||||
int ret = vc_dispmanx_display_get_info(_display, &_info);
|
// Open the connection to the display
|
||||||
// Make the compiler (in release mode) happy by 'using' ret
|
_vc_display = vc_dispmanx_display_open(0);
|
||||||
(void)ret;
|
assert(_vc_display > 0);
|
||||||
assert(ret == 0);
|
|
||||||
|
// Obtain the display information
|
||||||
|
DISPMANX_MODEINFO_T vc_info;
|
||||||
|
int result = vc_dispmanx_display_get_info(_vc_display, &vc_info);
|
||||||
|
assert(result == 0);
|
||||||
|
std::cout << "Display opened with resolution: " << vc_info.width << "x" << vc_info.height << std::endl;
|
||||||
|
|
||||||
|
// Close the displaye
|
||||||
|
vc_dispmanx_display_close(_vc_display);
|
||||||
|
}
|
||||||
|
|
||||||
// Create the resources for capturing image
|
// Create the resources for capturing image
|
||||||
_resource = vc_dispmanx_resource_create(
|
uint32_t vc_nativeImageHandle;
|
||||||
|
_vc_resource = vc_dispmanx_resource_create(
|
||||||
VC_IMAGE_RGB888,
|
VC_IMAGE_RGB888,
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
&_vc_image_ptr);
|
&vc_nativeImageHandle);
|
||||||
assert(_resource);
|
assert(_vc_resource);
|
||||||
|
|
||||||
// Define the capture rectangle with the same size
|
// Define the capture rectangle with the same size
|
||||||
vc_dispmanx_rect_set(&_rectangle, 0, 0, width, height);
|
vc_dispmanx_rect_set(&_rectangle, 0, 0, width, height);
|
||||||
_pitch = width * 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DispmanxFrameGrabber::~DispmanxFrameGrabber()
|
DispmanxFrameGrabber::~DispmanxFrameGrabber()
|
||||||
{
|
{
|
||||||
// Clean up resources
|
// Clean up resources
|
||||||
vc_dispmanx_resource_delete(_resource);
|
vc_dispmanx_resource_delete(_vc_resource);
|
||||||
|
|
||||||
// Close the displaye
|
|
||||||
vc_dispmanx_display_close(_display);
|
|
||||||
|
|
||||||
// De-init BCM
|
// De-init BCM
|
||||||
bcm_host_deinit();
|
bcm_host_deinit();
|
||||||
@ -47,10 +53,17 @@ void DispmanxFrameGrabber::grabFrame(RgbImage& image)
|
|||||||
// Sanity check of the given image size
|
// Sanity check of the given image size
|
||||||
assert(image.width() == _width && image.height() == _height);
|
assert(image.width() == _width && image.height() == _height);
|
||||||
|
|
||||||
void* image_ptr = image.memptr();
|
// Open the connection to the display
|
||||||
|
_vc_display = vc_dispmanx_display_open(0);
|
||||||
|
|
||||||
// Create the snapshot
|
// Create the snapshot (incl down-scaling)
|
||||||
vc_dispmanx_snapshot(_display, _resource, VC_IMAGE_ROT0);
|
vc_dispmanx_snapshot(_vc_display, _vc_resource, VC_IMAGE_ROT0);
|
||||||
// Read the snapshot into the memory (incl down-scaling)
|
|
||||||
vc_dispmanx_resource_read_data(_resource, &_rectangle, image_ptr, _pitch);
|
// Read the snapshot into the memory
|
||||||
|
void* image_ptr = image.memptr();
|
||||||
|
const unsigned destPitch = _width * 3;
|
||||||
|
vc_dispmanx_resource_read_data(_vc_resource, &_rectangle, image_ptr, destPitch);
|
||||||
|
|
||||||
|
// Close the displaye
|
||||||
|
vc_dispmanx_display_close(_vc_display);
|
||||||
}
|
}
|
||||||
|
@ -11,26 +11,43 @@
|
|||||||
#include <utils/RgbImage.h>
|
#include <utils/RgbImage.h>
|
||||||
|
|
||||||
///
|
///
|
||||||
/// The DispmanxFrameGrabber grabs
|
/// The DispmanxFrameGrabber is used for creating snapshots of the display (screenshots) with a
|
||||||
|
/// downsized and scaled resolution.
|
||||||
///
|
///
|
||||||
class DispmanxFrameGrabber
|
class DispmanxFrameGrabber
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
///
|
||||||
|
/// Construct a DispmanxFrameGrabber that will capture snapshots with specified dimensions.
|
||||||
|
///
|
||||||
|
/// @param[in] width The width of the captured screenshot
|
||||||
|
/// @param[in] height The heigth of the captured screenshot
|
||||||
|
///
|
||||||
DispmanxFrameGrabber(const unsigned width, const unsigned height);
|
DispmanxFrameGrabber(const unsigned width, const unsigned height);
|
||||||
~DispmanxFrameGrabber();
|
~DispmanxFrameGrabber();
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Captures a single snapshot of the display and writes the data to the given image. The
|
||||||
|
/// provided image should have the same dimensions as the configured values (_width and
|
||||||
|
/// _height)
|
||||||
|
///
|
||||||
|
/// @param[out] image The snapped screenshot (should be initialized with correct width and
|
||||||
|
/// height)
|
||||||
|
///
|
||||||
void grabFrame(RgbImage& image);
|
void grabFrame(RgbImage& image);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISPMANX_DISPLAY_HANDLE_T _display;
|
/// Handle to the display that is being captured
|
||||||
DISPMANX_MODEINFO_T _info;
|
DISPMANX_DISPLAY_HANDLE_T _vc_display;
|
||||||
|
|
||||||
DISPMANX_RESOURCE_HANDLE_T _resource;
|
/// Handle to the resource for storing the captured snapshot
|
||||||
|
DISPMANX_RESOURCE_HANDLE_T _vc_resource;
|
||||||
uint32_t _vc_image_ptr;
|
|
||||||
|
|
||||||
|
/// Rectangle of the captured resource that is transfered to user space
|
||||||
VC_RECT_T _rectangle;
|
VC_RECT_T _rectangle;
|
||||||
|
|
||||||
|
/// With of the captured snapshot [pixels]
|
||||||
unsigned _width;
|
unsigned _width;
|
||||||
|
/// Height of the captured snapshot [pixels]
|
||||||
unsigned _height;
|
unsigned _height;
|
||||||
uint32_t _pitch;
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user