Message ID | 20211029115917.2467936-4-hanlinchen@chromium.org |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Han-Lin, On 29/10/2021 13:59, Han-Lin Chen wrote: > Allow IPA to apply controls to the lens device. > > Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org> > --- > meson.build | 6 ++++++ > src/libcamera/pipeline/ipu3/cio2.cpp | 30 ++++++++++++++++++++++++++++ > src/libcamera/pipeline/ipu3/cio2.h | 3 +++ > src/libcamera/pipeline/ipu3/ipu3.cpp | 9 +++++++-- > 4 files changed, 46 insertions(+), 2 deletions(-) > > diff --git a/meson.build b/meson.build > index 7892a9e3..2a4b68a2 100644 > --- a/meson.build > +++ b/meson.build > @@ -108,6 +108,12 @@ if cc.has_argument('-Wno-c99-designator') > ] > endif > > +if get_option('android_platform') == 'cros' > + common_arguments += [ > + '-DOS_CHROMEOS', > + ] > +endif > + > c_arguments += common_arguments > cpp_arguments += common_arguments > > diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp > index 59dda56b..143e2a95 100644 > --- a/src/libcamera/pipeline/ipu3/cio2.cpp > +++ b/src/libcamera/pipeline/ipu3/cio2.cpp > @@ -16,6 +16,7 @@ > #include <libcamera/geometry.h> > #include <libcamera/stream.h> > > +#include "libcamera/internal/camera_lens.h" > #include "libcamera/internal/camera_sensor.h" > #include "libcamera/internal/framebuffer.h" > #include "libcamera/internal/media_device.h" > @@ -159,6 +160,35 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index) > return -EINVAL; > } > > +#if defined(OS_CHROMEOS) What is the status about Kieran's comment for the media graph in v1 ? I still suggest to split lens controls in a separate patch series as the sensor controls could probably be merged before... ? > + /* > + * \todo Read the lens model from the sensor itself or from a device database. > + * For now use default values taken from ChromeOS. > + */ > + static std::unordered_map<std::string, std::string> sensorLens = { > + { "ov13858", "dw9714" }, > + { "imx258", "dw9807" }, > + { "imx355", "ak7375" } > + }; > + > + auto it = sensorLens.find(sensor_->model()); > + if (it != sensorLens.end()) { > + const std::vector<MediaEntity *> &entities = media->entities(); > + for (auto ent: entities) { > + if (ent->function() == MEDIA_ENT_F_LENS) { > + lens_ = std::make_unique<CameraLens>(ent); > + ret = lens_->init(); > + if (!ret && lens_->model() == it->second) { > + break; > + } > + lens_.reset(); > + } > + if (!lens_) > + LOG(IPU3, Warning) << "Lens device " << it->second << " not found"; > + } > + } > +#endif > + > /* > * \todo Define when to open and close video device nodes, as they > * might impact on power consumption. > diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h > index ba8f0052..635566c8 100644 > --- a/src/libcamera/pipeline/ipu3/cio2.h > +++ b/src/libcamera/pipeline/ipu3/cio2.h > @@ -18,6 +18,7 @@ > > namespace libcamera { > > +class CameraLens; > class CameraSensor; > class FrameBuffer; > class MediaDevice; > @@ -52,6 +53,7 @@ public: > int stop(); > > CameraSensor *sensor() { return sensor_.get(); } > + CameraLens *lens() { return lens_.get(); } > const CameraSensor *sensor() const { return sensor_.get(); } > > FrameBuffer *queueBuffer(Request *request, FrameBuffer *rawBuffer); > @@ -67,6 +69,7 @@ private: > void cio2BufferReady(FrameBuffer *buffer); > > std::unique_ptr<CameraSensor> sensor_; > + std::unique_ptr<CameraLens> lens_; > std::unique_ptr<V4L2Subdevice> csi2_; > std::unique_ptr<V4L2VideoDevice> output_; > > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp > index 6a7f5b9a..6c44957f 100644 > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp > @@ -24,6 +24,7 @@ > #include <libcamera/stream.h> > > #include "libcamera/internal/camera.h" > +#include "libcamera/internal/camera_lens.h" > #include "libcamera/internal/camera_sensor.h" > #include "libcamera/internal/delayed_controls.h" > #include "libcamera/internal/device_enumerator.h" > @@ -1250,8 +1251,12 @@ void IPU3CameraData::queueFrameAction(unsigned int id, > { > switch (action.op) { > case ipa::ipu3::ActionSetSensorControls: { > - const ControlList &controls = action.sensorControls; > - delayedCtrls_->push(controls); > + const ControlList &sensorControls = action.sensorControls; > + delayedCtrls_->push(sensorControls); > + if (cio2_.lens()) { > + ControlList lensControls = action.lensControls; > + cio2_.lens()->setControls(&lensControls); > + } > break; > } > case ipa::ipu3::ActionParamFilled: { >
diff --git a/meson.build b/meson.build index 7892a9e3..2a4b68a2 100644 --- a/meson.build +++ b/meson.build @@ -108,6 +108,12 @@ if cc.has_argument('-Wno-c99-designator') ] endif +if get_option('android_platform') == 'cros' + common_arguments += [ + '-DOS_CHROMEOS', + ] +endif + c_arguments += common_arguments cpp_arguments += common_arguments diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp index 59dda56b..143e2a95 100644 --- a/src/libcamera/pipeline/ipu3/cio2.cpp +++ b/src/libcamera/pipeline/ipu3/cio2.cpp @@ -16,6 +16,7 @@ #include <libcamera/geometry.h> #include <libcamera/stream.h> +#include "libcamera/internal/camera_lens.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/framebuffer.h" #include "libcamera/internal/media_device.h" @@ -159,6 +160,35 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index) return -EINVAL; } +#if defined(OS_CHROMEOS) + /* + * \todo Read the lens model from the sensor itself or from a device database. + * For now use default values taken from ChromeOS. + */ + static std::unordered_map<std::string, std::string> sensorLens = { + { "ov13858", "dw9714" }, + { "imx258", "dw9807" }, + { "imx355", "ak7375" } + }; + + auto it = sensorLens.find(sensor_->model()); + if (it != sensorLens.end()) { + const std::vector<MediaEntity *> &entities = media->entities(); + for (auto ent: entities) { + if (ent->function() == MEDIA_ENT_F_LENS) { + lens_ = std::make_unique<CameraLens>(ent); + ret = lens_->init(); + if (!ret && lens_->model() == it->second) { + break; + } + lens_.reset(); + } + if (!lens_) + LOG(IPU3, Warning) << "Lens device " << it->second << " not found"; + } + } +#endif + /* * \todo Define when to open and close video device nodes, as they * might impact on power consumption. diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h index ba8f0052..635566c8 100644 --- a/src/libcamera/pipeline/ipu3/cio2.h +++ b/src/libcamera/pipeline/ipu3/cio2.h @@ -18,6 +18,7 @@ namespace libcamera { +class CameraLens; class CameraSensor; class FrameBuffer; class MediaDevice; @@ -52,6 +53,7 @@ public: int stop(); CameraSensor *sensor() { return sensor_.get(); } + CameraLens *lens() { return lens_.get(); } const CameraSensor *sensor() const { return sensor_.get(); } FrameBuffer *queueBuffer(Request *request, FrameBuffer *rawBuffer); @@ -67,6 +69,7 @@ private: void cio2BufferReady(FrameBuffer *buffer); std::unique_ptr<CameraSensor> sensor_; + std::unique_ptr<CameraLens> lens_; std::unique_ptr<V4L2Subdevice> csi2_; std::unique_ptr<V4L2VideoDevice> output_; diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 6a7f5b9a..6c44957f 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -24,6 +24,7 @@ #include <libcamera/stream.h> #include "libcamera/internal/camera.h" +#include "libcamera/internal/camera_lens.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/device_enumerator.h" @@ -1250,8 +1251,12 @@ void IPU3CameraData::queueFrameAction(unsigned int id, { switch (action.op) { case ipa::ipu3::ActionSetSensorControls: { - const ControlList &controls = action.sensorControls; - delayedCtrls_->push(controls); + const ControlList &sensorControls = action.sensorControls; + delayedCtrls_->push(sensorControls); + if (cio2_.lens()) { + ControlList lensControls = action.lensControls; + cio2_.lens()->setControls(&lensControls); + } break; } case ipa::ipu3::ActionParamFilled: {
Allow IPA to apply controls to the lens device. Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org> --- meson.build | 6 ++++++ src/libcamera/pipeline/ipu3/cio2.cpp | 30 ++++++++++++++++++++++++++++ src/libcamera/pipeline/ipu3/cio2.h | 3 +++ src/libcamera/pipeline/ipu3/ipu3.cpp | 9 +++++++-- 4 files changed, 46 insertions(+), 2 deletions(-)