diff --git a/libsrc/grabber/amlogic/AmlogicGrabber.cpp b/libsrc/grabber/amlogic/AmlogicGrabber.cpp index 895818be..33d01bc5 100644 --- a/libsrc/grabber/amlogic/AmlogicGrabber.cpp +++ b/libsrc/grabber/amlogic/AmlogicGrabber.cpp @@ -24,19 +24,6 @@ AmlogicGrabber::AmlogicGrabber(const unsigned width, const unsigned height) : _height(height), _amlogicCaptureDev(-1) { - _amlogicCaptureDev = open("/dev/amvideocap0", O_RDONLY, 0); - if (_amlogicCaptureDev == -1) - { - std::cerr << "[" << __PRETTY_FUNCTION__ << "] Failed to open the AMLOGIC device (" << errno << ")" << std::endl; - return; - } - - if (ioctl(_amlogicCaptureDev, AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH, _width) == -1 || - ioctl(_amlogicCaptureDev, AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT, _height) == -1) - { - // Failed to configure frame width - std::cerr << "[" << __PRETTY_FUNCTION__ << "] Failed to configure capture size (" << errno << ")" << std::endl; - } } AmlogicGrabber::~AmlogicGrabber() @@ -70,18 +57,37 @@ void AmlogicGrabber::setVideoMode(const VideoMode videoMode) void AmlogicGrabber::grabFrame(Image & image) { // resize the given image if needed - if (image.width() != unsigned(_rectangle.width) || image.height() != unsigned(_rectangle.height)) + if (image.width() != _width || image.height() != _height) { - image.resize(_rectangle.width, _rectangle.height); + image.resize(_width, _height); } + _amlogicCaptureDev = open("/dev/amvideocap0", O_RDONLY, 0); + if (_amlogicCaptureDev == -1) + { + std::cerr << "[" << __PRETTY_FUNCTION__ << "] Failed to open the AMLOGIC device (" << errno << ")" << std::endl; + return; + } + + if (ioctl(_amlogicCaptureDev, AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH, _width) == -1 || + ioctl(_amlogicCaptureDev, AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT, _height) == -1) + { + // Failed to configure frame width + std::cerr << "[" << __PRETTY_FUNCTION__ << "] Failed to configure capture size (" << errno << ")" << std::endl; + return; + } + + std::cout << "AMLOGIC grabber created (size " << _width << "x" << _height << ")" << std::endl; // Read the snapshot into the memory void * image_ptr = image.memptr(); const size_t bytesToRead = _width * _height * sizeof(ColorRgb); - const size_t bytesRead = pread(amlogicCaptureDev, image_ptr, bytesToRead, 0) + const size_t bytesRead = pread(_amlogicCaptureDev, image_ptr, bytesToRead, 0); if (bytesToRead != bytesRead) { // Read of snapshot failed std::cerr << "[" << __PRETTY_FUNCTION__ << "] Capture failed to grab entire image [bytesToRead(" << bytesToRead << ") != bytesRead(" << bytesRead << ")]" << std::endl; } + + close(_amlogicCaptureDev); + _amlogicCaptureDev = -1; } diff --git a/libsrc/grabber/amlogic/AmlogicGrabber.h b/libsrc/grabber/amlogic/AmlogicGrabber.h index d9b884ed..e39b3859 100644 --- a/libsrc/grabber/amlogic/AmlogicGrabber.h +++ b/libsrc/grabber/amlogic/AmlogicGrabber.h @@ -5,7 +5,7 @@ // Utils includes #include -#include +#include #include /// @@ -38,7 +38,7 @@ public: /// @param[out] image The snapped screenshot (should be initialized with correct width and /// height) /// - void grabFrame(Image & image); + void grabFrame(Image & image); private: diff --git a/libsrc/grabber/amlogic/AmlogicWrapper.cpp b/libsrc/grabber/amlogic/AmlogicWrapper.cpp index 202989f8..6d022852 100644 --- a/libsrc/grabber/amlogic/AmlogicWrapper.cpp +++ b/libsrc/grabber/amlogic/AmlogicWrapper.cpp @@ -18,7 +18,7 @@ AmlogicWrapper::AmlogicWrapper(const unsigned grabWidth, const unsigned grabHeig _priority(1000), _timer(), _image(grabWidth, grabHeight), - _frameGrabber(new DispmanxFrameGrabber(grabWidth, grabHeight)), + _frameGrabber(new AmlogicGrabber(grabWidth, grabHeight)), _processor(ImageProcessorFactory::getInstance().newImageProcessor()), _ledColors(hyperion->getLedCount(), ColorRgb{0,0,0}), _hyperion(hyperion) diff --git a/libsrc/grabber/amlogic/CMakeLists.txt b/libsrc/grabber/amlogic/CMakeLists.txt index 77f7eb58..447a873d 100644 --- a/libsrc/grabber/amlogic/CMakeLists.txt +++ b/libsrc/grabber/amlogic/CMakeLists.txt @@ -12,7 +12,7 @@ SET(AmlogicHEADERS SET(AmlogicSOURCES ${CURRENT_SOURCE_DIR}/AmlogicWrapper.cpp - ${CURRENT_SOURCE_DIR}/AmlogicFrameGrabber.cpp + ${CURRENT_SOURCE_DIR}/AmlogicGrabber.cpp ) QT4_WRAP_CPP(AmlogicHEADERS_MOC ${AmlogicQT_HEADERS})