[libcamera-devel,v6,4/4] ipu3: ipa: Allow IPA to apply controls to the lens device
diff mbox series

Message ID 20211130105157.203856-5-hanlinchen@chromium.org
State Accepted
Headers show
Series
  • Introduce Lens class and apply auto focus on ipu3
Related show

Commit Message

Hanlin Chen Nov. 30, 2021, 10:51 a.m. UTC
Allow IPA to apply controls to the lens device.

Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>
---
 src/libcamera/pipeline/ipu3/cio2.cpp |  1 +
 src/libcamera/pipeline/ipu3/cio2.h   |  3 +++
 src/libcamera/pipeline/ipu3/ipu3.cpp | 12 ++++++++++--
 3 files changed, 14 insertions(+), 2 deletions(-)

Comments

Kieran Bingham Nov. 30, 2021, 12:44 p.m. UTC | #1
Quoting Han-Lin Chen (2021-11-30 10:51:57)
> Allow IPA to apply controls to the lens device.
> 
> Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>
> ---
>  src/libcamera/pipeline/ipu3/cio2.cpp |  1 +
>  src/libcamera/pipeline/ipu3/cio2.h   |  3 +++
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 12 ++++++++++--
>  3 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
> index 59dda56b..ff795310 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"
> 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_;

I had assumed we'd model a lens as part of a sensor (i.e. create it in
the CameraSensor class).

Is there ever a case where we would need to keep the lens controller
separate from the Sensor?



>         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 c65afdb2..6e04ec8f 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"
> @@ -1238,8 +1239,15 @@ 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);
> +
> +               const ControlList lensControls = action.lensControls;
> +               const ControlValue &focusValue =
> +                       lensControls.get(V4L2_CID_FOCUS_ABSOLUTE);
> +               if (!focusValue.isNone() && cio2_.lens())
> +                       cio2_.lens()->setFocusPostion(focusValue.get<int32_t>());
> +

And if this was handled by the CameraSensor class, it gets handled for
all pipelines (that use the CameraSensor class...)

This will have to be repeated ... somewhat verbatim in the RkISP
pipeline handler right?

Anyway, this progresses AF at least, so it's something we can build
upon but I really think this should get reworked sometime.

A tentative:


Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

Of course, this doesn't actually have a lens connected yet, but given we
have three developers trying to work on the same thing, I think we need
to get a base ground to continue so I wouldn't object to merging this to
support ongoing development.


>                 break;
>         }
>         case ipa::ipu3::ActionParamFilled: {
> -- 
> 2.34.0.rc2.393.gf8c9666880-goog
>
Hanlin Chen Dec. 2, 2021, 1:58 p.m. UTC | #2
Hi Kieran,
Thanks for comments.

On Tue, Nov 30, 2021 at 8:44 PM Kieran Bingham
<kieran.bingham@ideasonboard.com> wrote:
>
> Quoting Han-Lin Chen (2021-11-30 10:51:57)
> > Allow IPA to apply controls to the lens device.
> >
> > Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>
> > ---
> >  src/libcamera/pipeline/ipu3/cio2.cpp |  1 +
> >  src/libcamera/pipeline/ipu3/cio2.h   |  3 +++
> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 12 ++++++++++--
> >  3 files changed, 14 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
> > index 59dda56b..ff795310 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"
> > 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_;
>
> I had assumed we'd model a lens as part of a sensor (i.e. create it in
> the CameraSensor class).
>
> Is there ever a case where we would need to keep the lens controller
> separate from the Sensor?
>
>
>
> >         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 c65afdb2..6e04ec8f 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"
> > @@ -1238,8 +1239,15 @@ 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);
> > +
> > +               const ControlList lensControls = action.lensControls;
> > +               const ControlValue &focusValue =
> > +                       lensControls.get(V4L2_CID_FOCUS_ABSOLUTE);
> > +               if (!focusValue.isNone() && cio2_.lens())
> > +                       cio2_.lens()->setFocusPostion(focusValue.get<int32_t>());
> > +
>
> And if this was handled by the CameraSensor class, it gets handled for
> all pipelines (that use the CameraSensor class...)
>
> This will have to be repeated ... somewhat verbatim in the RkISP
> pipeline handler right?
>
> Anyway, this progresses AF at least, so it's something we can build
> upon but I really think this should get reworked sometime.
I agree. Since there are similar discussion in Daniel's series too,
let's move the lens to CameraSensor.
>
> A tentative:
>
>
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>
> Of course, this doesn't actually have a lens connected yet, but given we
> have three developers trying to work on the same thing, I think we need
> to get a base ground to continue so I wouldn't object to merging this to
> support ongoing development.
>
>
> >                 break;
> >         }
> >         case ipa::ipu3::ActionParamFilled: {
> > --
> > 2.34.0.rc2.393.gf8c9666880-goog
> >

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
index 59dda56b..ff795310 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"
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 c65afdb2..6e04ec8f 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"
@@ -1238,8 +1239,15 @@  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);
+
+		const ControlList lensControls = action.lensControls;
+		const ControlValue &focusValue =
+			lensControls.get(V4L2_CID_FOCUS_ABSOLUTE);
+		if (!focusValue.isNone() && cio2_.lens())
+			cio2_.lens()->setFocusPostion(focusValue.get<int32_t>());
+
 		break;
 	}
 	case ipa::ipu3::ActionParamFilled: {