mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00: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:
		| @@ -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; |  | ||||||
| }; | }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user