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"
|
||||
|
||||
DispmanxFrameGrabber::DispmanxFrameGrabber(const unsigned width, const unsigned height) :
|
||||
_display(0),
|
||||
_resource(0),
|
||||
_vc_display(0),
|
||||
_vc_resource(0),
|
||||
_width(width),
|
||||
_height(height)
|
||||
{
|
||||
// Initiase BCM
|
||||
bcm_host_init();
|
||||
|
||||
// Open the connection to the display
|
||||
_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);
|
||||
{
|
||||
// Check if the display can be opened and display the current resolution
|
||||
// Open the connection to the display
|
||||
_vc_display = vc_dispmanx_display_open(0);
|
||||
assert(_vc_display > 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
|
||||
_resource = vc_dispmanx_resource_create(
|
||||
uint32_t vc_nativeImageHandle;
|
||||
_vc_resource = vc_dispmanx_resource_create(
|
||||
VC_IMAGE_RGB888,
|
||||
width,
|
||||
height,
|
||||
&_vc_image_ptr);
|
||||
assert(_resource);
|
||||
&vc_nativeImageHandle);
|
||||
assert(_vc_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);
|
||||
vc_dispmanx_resource_delete(_vc_resource);
|
||||
|
||||
// De-init BCM
|
||||
bcm_host_deinit();
|
||||
@ -47,10 +53,17 @@ void DispmanxFrameGrabber::grabFrame(RgbImage& image)
|
||||
// Sanity check of the given image size
|
||||
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
|
||||
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);
|
||||
// Create the snapshot (incl down-scaling)
|
||||
vc_dispmanx_snapshot(_vc_display, _vc_resource, VC_IMAGE_ROT0);
|
||||
|
||||
// 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>
|
||||
|
||||
///
|
||||
/// The DispmanxFrameGrabber grabs
|
||||
/// The DispmanxFrameGrabber is used for creating snapshots of the display (screenshots) with a
|
||||
/// downsized and scaled resolution.
|
||||
///
|
||||
class DispmanxFrameGrabber
|
||||
{
|
||||
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();
|
||||
|
||||
///
|
||||
/// 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);
|
||||
|
||||
private:
|
||||
DISPMANX_DISPLAY_HANDLE_T _display;
|
||||
DISPMANX_MODEINFO_T _info;
|
||||
/// Handle to the display that is being captured
|
||||
DISPMANX_DISPLAY_HANDLE_T _vc_display;
|
||||
|
||||
DISPMANX_RESOURCE_HANDLE_T _resource;
|
||||
|
||||
uint32_t _vc_image_ptr;
|
||||
/// Handle to the resource for storing the captured snapshot
|
||||
DISPMANX_RESOURCE_HANDLE_T _vc_resource;
|
||||
|
||||
/// Rectangle of the captured resource that is transfered to user space
|
||||
VC_RECT_T _rectangle;
|
||||
|
||||
/// With of the captured snapshot [pixels]
|
||||
unsigned _width;
|
||||
/// Height of the captured snapshot [pixels]
|
||||
unsigned _height;
|
||||
uint32_t _pitch;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user