utils: libtuning: modules: Add skeletal AGC module
Add a skeletal AGC module just so that we can have some AGC tuning values that we can use to test during development of AGC in the IPAs. As rkisp1 is the main target, we only add support for rkisp1 for now. The parameters are mostly copied from the hardcoded values in ctt, except for the metering modes. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
248374feca
commit
4eb3ff2350
3 changed files with 106 additions and 0 deletions
6
utils/tuning/libtuning/modules/agc/__init__.py
Normal file
6
utils/tuning/libtuning/modules/agc/__init__.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#
|
||||||
|
# Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
|
||||||
|
|
||||||
|
from libtuning.modules.agc.agc import AGC
|
||||||
|
from libtuning.modules.agc.rkisp1 import AGCRkISP1
|
21
utils/tuning/libtuning/modules/agc/agc.py
Normal file
21
utils/tuning/libtuning/modules/agc/agc.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
#
|
||||||
|
# Copyright (C) 2019, Raspberry Pi Ltd
|
||||||
|
# Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
|
||||||
|
|
||||||
|
from ..module import Module
|
||||||
|
|
||||||
|
import libtuning as lt
|
||||||
|
|
||||||
|
|
||||||
|
class AGC(Module):
|
||||||
|
type = 'agc'
|
||||||
|
hr_name = 'AGC (Base)'
|
||||||
|
out_name = 'GenericAGC'
|
||||||
|
|
||||||
|
# \todo Add sector shapes and stuff just like lsc
|
||||||
|
def __init__(self, *,
|
||||||
|
debug: list):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self.debug = debug
|
79
utils/tuning/libtuning/modules/agc/rkisp1.py
Normal file
79
utils/tuning/libtuning/modules/agc/rkisp1.py
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
#
|
||||||
|
# Copyright (C) 2019, Raspberry Pi Ltd
|
||||||
|
# Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
|
||||||
|
#
|
||||||
|
# rkisp1.py - AGC module for tuning rkisp1
|
||||||
|
|
||||||
|
from .agc import AGC
|
||||||
|
|
||||||
|
import libtuning as lt
|
||||||
|
|
||||||
|
|
||||||
|
class AGCRkISP1(AGC):
|
||||||
|
hr_name = 'AGC (RkISP1)'
|
||||||
|
out_name = 'Agc'
|
||||||
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
|
# We don't actually need anything from the config file
|
||||||
|
def validate_config(self, config: dict) -> bool:
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _generate_metering_modes(self) -> dict:
|
||||||
|
centre_weighted = [
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
0, 6, 8, 6, 0,
|
||||||
|
0, 8, 16, 8, 0,
|
||||||
|
0, 6, 8, 6, 0,
|
||||||
|
0, 0, 0, 0, 0
|
||||||
|
]
|
||||||
|
|
||||||
|
spot = [
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
0, 2, 4, 2, 0,
|
||||||
|
0, 4, 16, 4, 0,
|
||||||
|
0, 2, 4, 2, 0,
|
||||||
|
0, 0, 0, 0, 0
|
||||||
|
]
|
||||||
|
|
||||||
|
matrix = [1 for i in range(0, 25)]
|
||||||
|
|
||||||
|
return {
|
||||||
|
'MeteringCentreWeighted': centre_weighted,
|
||||||
|
'MeteringSpot': spot,
|
||||||
|
'MeteringMatrix': matrix
|
||||||
|
}
|
||||||
|
|
||||||
|
def _generate_exposure_modes(self) -> dict:
|
||||||
|
normal = {'shutter': [100, 10000, 30000, 60000, 120000],
|
||||||
|
'gain': [2.0, 4.0, 6.0, 6.0, 6.0]}
|
||||||
|
short = {'shutter': [100, 5000, 10000, 20000, 120000],
|
||||||
|
'gain': [2.0, 4.0, 6.0, 6.0, 6.0]}
|
||||||
|
|
||||||
|
return {'ExposureNormal': normal, 'ExposureShort': short}
|
||||||
|
|
||||||
|
def _generate_constraint_modes(self) -> dict:
|
||||||
|
normal = {'lower': {'qLo': 0.98, 'qHi': 1.0, 'yTarget': 0.5}}
|
||||||
|
highlight = {
|
||||||
|
'lower': {'qLo': 0.98, 'qHi': 1.0, 'yTarget': 0.5},
|
||||||
|
'upper': {'qLo': 0.98, 'qHi': 1.0, 'yTarget': 0.8}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {'ConstraintNormal': normal, 'ConstraintHighlight': highlight}
|
||||||
|
|
||||||
|
def _generate_y_target(self) -> list:
|
||||||
|
return 0.16
|
||||||
|
|
||||||
|
def process(self, config: dict, images: list, outputs: dict) -> dict:
|
||||||
|
output = {}
|
||||||
|
|
||||||
|
output['AeMeteringMode'] = self._generate_metering_modes()
|
||||||
|
output['AeExposureMode'] = self._generate_exposure_modes()
|
||||||
|
output['AeConstraintMode'] = self._generate_constraint_modes()
|
||||||
|
output['relativeLuminanceTarget'] = self._generate_y_target()
|
||||||
|
|
||||||
|
# \todo Debug functionality
|
||||||
|
|
||||||
|
return output
|
Loading…
Add table
Add a link
Reference in a new issue