summaryrefslogtreecommitdiff
path: root/LICENSES/GPL-2.0-or-later.txt
diff options
context:
space:
mode:
authorDavid Plowman <david.plowman@raspberrypi.com>2020-10-27 11:07:38 +0000
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-10-27 14:09:47 +0200
commit4a748394e534eca79e54b6153691621c1482a76c (patch)
treedcf7a119707c0aa98ae9b5b6244186b271a67ddb /LICENSES/GPL-2.0-or-later.txt
parent44b5292ae371426fec6fa5d54192255183ace19b (diff)
libcamera: pipeline: raspberrypi: Implementation of digital zoom
During configure() we update the ScalerCropMaximum to the correct value for this camera mode and work out the minimum crop size allowed by the ISP. Whenever a new ScalerCrop request is received we check it's valid and apply it to the ISP V4L2 device. When the IPA returns its metadata to us we add the ScalerCrop information, rescaled to sensor native pixels. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'LICENSES/GPL-2.0-or-later.txt')
0 files changed, 0 insertions, 0 deletions
pan> */ #include <chrono> #include <iostream> #include <string.h> #include <unistd.h> #include <libcamera/event_notifier.h> #include <libcamera/timer.h> #include "test.h" #include "thread.h" using namespace std; using namespace libcamera; class EventHandler : public Object { public: EventHandler() : notified_(false) { int ret = pipe(pipefd_); if (ret < 0) { ret = errno; cout << "pipe() failed: " << strerror(ret) << endl; } notifier_ = new EventNotifier(pipefd_[0], EventNotifier::Read, this); notifier_->activated.connect(this, &EventHandler::readReady); } ~EventHandler() { delete notifier_; close(pipefd_[0]); close(pipefd_[1]); } int notify() { std::string data("H2G2"); ssize_t ret; memset(data_, 0, sizeof(data_)); size_ = 0; ret = write(pipefd_[1], data.data(), data.size()); if (ret < 0) { cout << "Pipe write failed" << endl; return TestFail; } return TestPass; } bool notified() const { return notified_; } private: void readReady(EventNotifier *notifier) { size_ = read(notifier->fd(), data_, sizeof(data_)); notified_ = true; } EventNotifier *notifier_; int pipefd_[2]; bool notified_; char data_[16]; ssize_t size_; }; class EventThreadTest : public Test { protected: int run() { Thread thread; thread.start(); /* * Fire the event notifier and then move the notifier to a * different thread. The notifier will not notice the event * immediately as there is no event dispatcher loop running in * the main thread. This tests that a notifier being moved to a * different thread will correctly process already pending * events in the new thread. */ EventHandler handler; handler.notify(); handler.moveToThread(&thread); this_thread::sleep_for(chrono::milliseconds(100)); /* Must stop thread before destroying the handler. */ thread.exit(0); thread.wait(); if (!handler.notified()) { cout << "Thread event handling test failed" << endl; return TestFail; } return TestPass; } }; TEST_REGISTER(EventThreadTest)