[libcamera-devel] [RFC PATCH 3/7] libcamera: software_isp: add SwIspLinaro implementation of SoftwareIsp
Andrey Konovalov
andrey.konovalov at linaro.org
Mon Dec 4 14:19:33 CET 2023
Hi Bryan and Hans,
On 04.12.2023 13:51, Hans de Goede wrote:
> Hi Bryan,
>
> On 12/4/23 11:09, Bryan O'Donoghue via libcamera-devel wrote:
>> On 04/12/2023 01:10, Andrey Konovalov via libcamera-devel wrote:
>>> Signed-off-by: Andrey Konovalov <andrey.konovalov at linaro.org>
>>> ---
>>> include/libcamera/internal/meson.build | 1 +
>>> .../internal/software_isp/meson.build | 6 +
>>> .../internal/software_isp/statistics-linaro.h | 17 +
>>> .../internal/software_isp/swisp_linaro.h | 109 ++++
>>> src/libcamera/meson.build | 1 +
>>> src/libcamera/software_isp/meson.build | 5 +
>>> src/libcamera/software_isp/swisp_linaro.cpp | 539 ++++++++++++++++++
>>> 7 files changed, 678 insertions(+)
>>> create mode 100644 include/libcamera/internal/software_isp/meson.build
>>> create mode 100644 include/libcamera/internal/software_isp/statistics-linaro.h
>>> create mode 100644 include/libcamera/internal/software_isp/swisp_linaro.h
>>> create mode 100644 src/libcamera/software_isp/meson.build
>>> create mode 100644 src/libcamera/software_isp/swisp_linaro.cpp
>>>
>>> diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build
>>> index b780777c..eeae801c 100644
>>> --- a/include/libcamera/internal/meson.build
>>> +++ b/include/libcamera/internal/meson.build
>>
>>> +void SwIspLinaro::IspWorker::debayerRaw10P(uint8_t *dst, const uint8_t *src)
>>> +{
>>> + /* for brightness values in the 0 to 255 range: */
>>> + static const unsigned int BRIGHT_LVL = 200U << 8;
>>> + static const unsigned int TOO_BRIGHT_LVL = 240U << 8;
>>> +
>>> + static const unsigned int RED_Y_MUL = 77; /* 0.30 * 256 */
>>> + static const unsigned int GREEN_Y_MUL = 150; /* 0.59 * 256 */
>>> + static const unsigned int BLUE_Y_MUL = 29; /* 0.11 * 256 */
>>
>> These seem like magic numbers that deserve a little bit more explanation.
>>
>> Why is blue 0.11 and not 0.10 for example ?
>
> These are the standard weights for calculating luminance aka the
> Y in YUV when coming from RGB values, see e.g. :
>
> https://www.pcmag.com/encyclopedia/term/yuvrgb-conversion-formulas
>
> Might still be worth a comment, but for someone who is familiar
> with this kinda stuff these weights are immediately recognizable.
I'll add the comment in the next version of the patch set.
> Regards,
>
> Hans
>
>
>
>
>>
>> Same comment with the brightness value - why these numbers ? Does no harm to add in some of the thinking behind why you've choosen these particular values.
>>
>>> +
>>> +int SwIspLinaro::queueBuffers(FrameBuffer *input,
>>> + const std::map<unsigned int, FrameBuffer *> &outputs)
>>> +{
>>> + unsigned int mask = 0;
>>> +
>>> + /*
>>> + * Validate the outputs as a sanity check: at least one output is
>>> + * required, all outputs must reference a valid stream and no two
>>> + * outputs can reference the same stream.
>>> + */
>>> + if (outputs.empty())
>>> + return -EINVAL;
>>> +
>>> + for (auto [index, buffer] : outputs) {
>>> + if (!buffer)
>>> + return -EINVAL;
>>> + if (index >= 1) /* only single stream atm */
>>> + return -EINVAL;
>>
>> Single stream per sensor ? Or single stream per instance of the class, which is ~ the same thing... ?
This isn't a fundamental limitation, but yes, the current version only support 1 stream per sensor and the
instance.
>> Anyway maybe make that clearer in the comment.
>>
>> General comment on the debayer part is more comments please. The logic of the algorithm deserves a bit more explanation.
This patch set doesn't have a lot of comments indeed. I'll be adding more comments in the next version.
Thanks,
Andrey
>> ---
>> bod
>>
>
More information about the libcamera-devel
mailing list