[libcamera-devel,RFC,0/3] RPi: Introduce AF algorithm
mbox series

Message ID 20220323133622.61593-1-jeanmichel.hautbois@ideasonboard.com
Headers show
Series
  • RPi: Introduce AF algorithm
Related show

Message

Jean-Michel Hautbois March 23, 2022, 1:36 p.m. UTC
Hello !

I proposed to add the lens controls with ancillary links support in a
previous series [1] but it seems more interesting to have it on top of
an AF algorithm.

The first patch in this series introduces Kate's algorithm used by the
IPU3IPA which is a contrast-based one. I adapted it a bit, as the
statistics on RPi are not the same, and I simplified it a bit, using
only one of the filters and all the regions (ie, it calculates a focus
on the scene, and not only on the center of this scene).

This is posted as a RFC, as it lacks a few things:
- Kieran mentionned that the entityControls in the RPi pipeline handler
  should be emplaced into a map using an enum. I tried to do it, but I
  am no jinja2 expert, and it takes me too much time for something
  supposed to be easy :-). Help appreciated here (;-) ;-)).
- The algorithm is not using any controls while David proposed those in
  [3]. I am planning to do it, at least to pass a region and send back
  the focus lens position but -ENOTIME yet.

David, Naushir, Laurent, Kieran, I am not sure about the copyrights and
licenses, please comment :-).

Thanks !

Jean-Michel Hautbois (3):
  ipa: raspberrypi: Introduce an autofocus algorithm
  libcamera: raspberrypi: Control the lens from pipeline
  ipa: raspberrypi: Control the lens position

 include/libcamera/ipa/raspberrypi.mojom       |   1 +
 .../raspberrypi/controller/af_algorithm.hpp   |  20 ++
 src/ipa/raspberrypi/controller/af_status.h    |  31 +++
 src/ipa/raspberrypi/controller/focus_status.h |   3 +
 src/ipa/raspberrypi/controller/iob/af.cpp     | 231 ++++++++++++++++++
 src/ipa/raspberrypi/controller/iob/af.h       |  55 +++++
 src/ipa/raspberrypi/meson.build               |   1 +
 src/ipa/raspberrypi/raspberrypi.cpp           |  36 ++-
 .../pipeline/raspberrypi/raspberrypi.cpp      |  17 ++
 9 files changed, 393 insertions(+), 2 deletions(-)
 create mode 100644 src/ipa/raspberrypi/controller/af_algorithm.hpp
 create mode 100644 src/ipa/raspberrypi/controller/af_status.h
 create mode 100644 src/ipa/raspberrypi/controller/iob/af.cpp
 create mode 100644 src/ipa/raspberrypi/controller/iob/af.h

Comments

Jean-Michel Hautbois March 23, 2022, 1:38 p.m. UTC | #1
Hello !

I proposed to add the lens controls with ancillary links support in a
previous series [1] but it seems more interesting to have it on top of
an AF algorithm.

The first patch in this series introduces Kate's algorithm used by the
IPU3IPA which is a contrast-based one. I adapted it a bit, as the
statistics on RPi are not the same, and I simplified it a bit, using
only one of the filters and all the regions (ie, it calculates a focus
on the scene, and not only on the center of this scene).

This is posted as a RFC, as it lacks a few things:
- Kieran mentionned that the entityControls in the RPi pipeline handler
  should be emplaced into a map using an enum. I tried to do it, but I
  am no jinja2 expert, and it takes me too much time for something
  supposed to be easy :-). Help appreciated here (;-) ;-)).
- The algorithm is not using any controls while David proposed those in
  [3]. I am planning to do it, at least to pass a region and send back
  the focus lens position but -ENOTIME yet.

David, Naushir, Laurent, Kieran, I am not sure about the copyrights and
licenses, please comment :-).

Thanks !

---
[1]: https://patchwork.libcamera.org/project/libcamera/list/?series=2969 
[2]: https://patchwork.libcamera.org/project/libcamera/list/?series=2957

Jean-Michel Hautbois (3):
  ipa: raspberrypi: Introduce an autofocus algorithm
  libcamera: raspberrypi: Control the lens from pipeline
  ipa: raspberrypi: Control the lens position

 include/libcamera/ipa/raspberrypi.mojom       |   1 +
 .../raspberrypi/controller/af_algorithm.hpp   |  20 ++
 src/ipa/raspberrypi/controller/af_status.h    |  31 +++
 src/ipa/raspberrypi/controller/focus_status.h |   3 +
 src/ipa/raspberrypi/controller/iob/af.cpp     | 231 ++++++++++++++++++
 src/ipa/raspberrypi/controller/iob/af.h       |  55 +++++
 src/ipa/raspberrypi/meson.build               |   1 +
 src/ipa/raspberrypi/raspberrypi.cpp           |  36 ++-
 .../pipeline/raspberrypi/raspberrypi.cpp      |  17 ++
 9 files changed, 393 insertions(+), 2 deletions(-)
 create mode 100644 src/ipa/raspberrypi/controller/af_algorithm.hpp
 create mode 100644 src/ipa/raspberrypi/controller/af_status.h
 create mode 100644 src/ipa/raspberrypi/controller/iob/af.cpp
 create mode 100644 src/ipa/raspberrypi/controller/iob/af.h
Kieran Bingham March 23, 2022, 3:05 p.m. UTC | #2
Hi JM,


Quoting Jean-Michel Hautbois via libcamera-devel (2022-03-23 13:36:19)
> Hello !
> 

I tried to test this, and manually added:

pi@earth:~/libcamera $ git diff
diff --git a/src/ipa/raspberrypi/data/imx519.json b/src/ipa/raspberrypi/data/imx519.json
index 2ce6a08c..471eadca 100644
--- a/src/ipa/raspberrypi/data/imx519.json
+++ b/src/ipa/raspberrypi/data/imx519.json
@@ -6,6 +6,9 @@
     "rpi.dpc":
     {
     },
+    "iob.af":
+    {
+    },
     "rpi.lux":
     {
         "reference_shutter_speed": 13841,

But I get:

[0:28:09.864859899] [1784] INFO RPI raspberrypi.cpp:750 Sensor: /base/soc/i2c0mux/i2c@1/imx519@1a - Selected sensor format: 1280x720-SRGGB10_1X10 - Selected unicam format: 1280x720-pRAA
[0:28:10.097112600] [1789] DEBUG IoBAf af.cpp:164  Previous step is 0 Current step is 30
terminate called after throwing an instance of 'std::bad_any_cast'
  what():  bad any_cast
Aborted

Is there something obvious that I've missed to test?
--
Kieran

> I proposed to add the lens controls with ancillary links support in a
> previous series [1] but it seems more interesting to have it on top of
> an AF algorithm.
> 
> The first patch in this series introduces Kate's algorithm used by the
> IPU3IPA which is a contrast-based one. I adapted it a bit, as the
> statistics on RPi are not the same, and I simplified it a bit, using
> only one of the filters and all the regions (ie, it calculates a focus
> on the scene, and not only on the center of this scene).
> 
> This is posted as a RFC, as it lacks a few things:
> - Kieran mentionned that the entityControls in the RPi pipeline handler
>   should be emplaced into a map using an enum. I tried to do it, but I
>   am no jinja2 expert, and it takes me too much time for something
>   supposed to be easy :-). Help appreciated here (;-) ;-)).
> - The algorithm is not using any controls while David proposed those in
>   [3]. I am planning to do it, at least to pass a region and send back
>   the focus lens position but -ENOTIME yet.
> 
> David, Naushir, Laurent, Kieran, I am not sure about the copyrights and
> licenses, please comment :-).
> 
> Thanks !
> 
> Jean-Michel Hautbois (3):
>   ipa: raspberrypi: Introduce an autofocus algorithm
>   libcamera: raspberrypi: Control the lens from pipeline
>   ipa: raspberrypi: Control the lens position
> 
>  include/libcamera/ipa/raspberrypi.mojom       |   1 +
>  .../raspberrypi/controller/af_algorithm.hpp   |  20 ++
>  src/ipa/raspberrypi/controller/af_status.h    |  31 +++
>  src/ipa/raspberrypi/controller/focus_status.h |   3 +
>  src/ipa/raspberrypi/controller/iob/af.cpp     | 231 ++++++++++++++++++
>  src/ipa/raspberrypi/controller/iob/af.h       |  55 +++++
>  src/ipa/raspberrypi/meson.build               |   1 +
>  src/ipa/raspberrypi/raspberrypi.cpp           |  36 ++-
>  .../pipeline/raspberrypi/raspberrypi.cpp      |  17 ++
>  9 files changed, 393 insertions(+), 2 deletions(-)
>  create mode 100644 src/ipa/raspberrypi/controller/af_algorithm.hpp
>  create mode 100644 src/ipa/raspberrypi/controller/af_status.h
>  create mode 100644 src/ipa/raspberrypi/controller/iob/af.cpp
>  create mode 100644 src/ipa/raspberrypi/controller/iob/af.h
> 
> -- 
> 2.32.0
>
Jean-Michel Hautbois March 23, 2022, 3:34 p.m. UTC | #3
Hi Kieran,

On 23/03/2022 16:05, Kieran Bingham wrote:
> Hi JM,
> 
> 
> Quoting Jean-Michel Hautbois via libcamera-devel (2022-03-23 13:36:19)
>> Hello !
>>
> 
> I tried to test this, and manually added:
> 
> pi@earth:~/libcamera $ git diff
> diff --git a/src/ipa/raspberrypi/data/imx519.json b/src/ipa/raspberrypi/data/imx519.json
> index 2ce6a08c..471eadca 100644
> --- a/src/ipa/raspberrypi/data/imx519.json
> +++ b/src/ipa/raspberrypi/data/imx519.json
> @@ -6,6 +6,9 @@
>       "rpi.dpc":
>       {
>       },
> +    "iob.af":
> +    {
> +    },
>       "rpi.lux":
>       {
>           "reference_shutter_speed": 13841,
> 
> But I get:
> 
> [0:28:09.864859899] [1784] INFO RPI raspberrypi.cpp:750 Sensor: /base/soc/i2c0mux/i2c@1/imx519@1a - Selected sensor format: 1280x720-SRGGB10_1X10 - Selected unicam format: 1280x720-pRAA
> [0:28:10.097112600] [1789] DEBUG IoBAf af.cpp:164  Previous step is 0 Current step is 30
> terminate called after throwing an instance of 'std::bad_any_cast'
>    what():  bad any_cast
> Aborted
> 
> Is there something obvious that I've missed to test?

No, there is something I did not test ;-).
I think (need to try before sending next time) that I missed:
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp 
b/src/ipa/raspberrypi/raspberrypi.cpp
index 2e862f37..68075985 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -30,6 +30,7 @@

  #include "libcamera/internal/mapped_framebuffer.h"

+#include "af_status.h"
  #include "agc_algorithm.hpp"
  #include "agc_status.h"
  #include "alsc_status.h"

> --
> Kieran
> 
>> I proposed to add the lens controls with ancillary links support in a
>> previous series [1] but it seems more interesting to have it on top of
>> an AF algorithm.
>>
>> The first patch in this series introduces Kate's algorithm used by the
>> IPU3IPA which is a contrast-based one. I adapted it a bit, as the
>> statistics on RPi are not the same, and I simplified it a bit, using
>> only one of the filters and all the regions (ie, it calculates a focus
>> on the scene, and not only on the center of this scene).
>>
>> This is posted as a RFC, as it lacks a few things:
>> - Kieran mentionned that the entityControls in the RPi pipeline handler
>>    should be emplaced into a map using an enum. I tried to do it, but I
>>    am no jinja2 expert, and it takes me too much time for something
>>    supposed to be easy :-). Help appreciated here (;-) ;-)).
>> - The algorithm is not using any controls while David proposed those in
>>    [3]. I am planning to do it, at least to pass a region and send back
>>    the focus lens position but -ENOTIME yet.
>>
>> David, Naushir, Laurent, Kieran, I am not sure about the copyrights and
>> licenses, please comment :-).
>>
>> Thanks !
>>
>> Jean-Michel Hautbois (3):
>>    ipa: raspberrypi: Introduce an autofocus algorithm
>>    libcamera: raspberrypi: Control the lens from pipeline
>>    ipa: raspberrypi: Control the lens position
>>
>>   include/libcamera/ipa/raspberrypi.mojom       |   1 +
>>   .../raspberrypi/controller/af_algorithm.hpp   |  20 ++
>>   src/ipa/raspberrypi/controller/af_status.h    |  31 +++
>>   src/ipa/raspberrypi/controller/focus_status.h |   3 +
>>   src/ipa/raspberrypi/controller/iob/af.cpp     | 231 ++++++++++++++++++
>>   src/ipa/raspberrypi/controller/iob/af.h       |  55 +++++
>>   src/ipa/raspberrypi/meson.build               |   1 +
>>   src/ipa/raspberrypi/raspberrypi.cpp           |  36 ++-
>>   .../pipeline/raspberrypi/raspberrypi.cpp      |  17 ++
>>   9 files changed, 393 insertions(+), 2 deletions(-)
>>   create mode 100644 src/ipa/raspberrypi/controller/af_algorithm.hpp
>>   create mode 100644 src/ipa/raspberrypi/controller/af_status.h
>>   create mode 100644 src/ipa/raspberrypi/controller/iob/af.cpp
>>   create mode 100644 src/ipa/raspberrypi/controller/iob/af.h
>>
>> -- 
>> 2.32.0
>>