From f8c8fa6c74b6cb3f7a05db0fc0150d738476f02a Mon Sep 17 00:00:00 2001 From: "T. van der Zwan" Date: Wed, 21 Aug 2013 14:37:00 +0000 Subject: [PATCH] Moved open and close of display to the 'grab' method, solving resolution switches. Added doxygen comments to the dispmanx header. --- .../dispmanx-grabber/DispmanxFrameGrabber.cpp | 55 ++++++++++++------- .../dispmanx-grabber/DispmanxFrameGrabber.h | 31 ++++++++--- 2 files changed, 58 insertions(+), 28 deletions(-) diff --git a/libsrc/dispmanx-grabber/DispmanxFrameGrabber.cpp b/libsrc/dispmanx-grabber/DispmanxFrameGrabber.cpp index b929d4b8..4230a449 100644 --- a/libsrc/dispmanx-grabber/DispmanxFrameGrabber.cpp +++ b/libsrc/dispmanx-grabber/DispmanxFrameGrabber.cpp @@ -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); } diff --git a/libsrc/dispmanx-grabber/DispmanxFrameGrabber.h b/libsrc/dispmanx-grabber/DispmanxFrameGrabber.h index 9ec7e859..50c90ce4 100644 --- a/libsrc/dispmanx-grabber/DispmanxFrameGrabber.h +++ b/libsrc/dispmanx-grabber/DispmanxFrameGrabber.h @@ -11,26 +11,43 @@ #include /// -/// 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; };