summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHirokazu Honda <hiroh@chromium.org>2021-06-10 17:25:38 +0900
committerJacopo Mondi <jacopo@jmondi.org>2021-06-14 14:11:03 +0200
commitbd63bb03c9c56fa8477ba97b0203bfb6958b322b (patch)
tree1be5e242fa1b0fb5b83186399c309d9744a73f63
parent5d0eb4024932cbf57bcc4d4fb0b37d98522cad7f (diff)
libcamera: pipeline: ipu3: Report available sensor test pattern mode
PipelineHandlerIPU3 gets available test pattern modes of the sensor device and reports them to a client. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 87f6bac8..36256ea4 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -939,6 +939,16 @@ int PipelineHandlerIPU3::initControls(IPU3CameraData *data)
ControlInfoMap::Map controls = IPU3Controls;
const ControlInfoMap &sensorControls = sensor->controls();
+ const std::vector<int32_t> &testPatternModes = sensor->testPatternModes();
+ if (!testPatternModes.empty()) {
+ std::vector<ControlValue> values;
+ values.reserve(testPatternModes.size());
+
+ for (int32_t pattern : testPatternModes)
+ values.emplace_back(pattern);
+
+ controls[&controls::draft::TestPatternMode] = ControlInfo(values);
+ }
/*
* Compute exposure time limits.
ock::time_point start = std::chrono::steady_clock::now(); timer.start(1000); struct itimerval itimer = {}; itimer.it_value.tv_usec = 500000; interrupt = false; setitimer(ITIMER_REAL, &itimer, nullptr); dispatcher->processEvents(); std::chrono::steady_clock::time_point stop = std::chrono::steady_clock::now(); std::chrono::steady_clock::duration duration = stop - start; int msecs = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count(); if (abs(msecs - 1000) > 50) { cout << "Event processing restart test failed" << endl; return TestFail; } /* Event processing interruption. */ timer.start(1000); dispatcher->interrupt(); dispatcher->processEvents(); if (!timer.isRunning()) { cout << "Event processing immediate interruption failed" << endl; return TestFail; } timer.start(1000); itimer.it_value.tv_usec = 500000; interrupt = true; setitimer(ITIMER_REAL, &itimer, nullptr); dispatcher->processEvents(); if (!timer.isRunning()) { cout << "Event processing delayed interruption failed" << endl; return TestFail; } return TestPass; } void cleanup() { } }; TEST_REGISTER(EventDispatcherTest)