ipa: raspberrypi: Generalise the focus reporting code
Use the generalised focus statistics structure to compute the centre window focus FoM value. This avoids needed to hard-code a specific grid size. Remove the focus reporting algorithm as the functionality is duplicated by this bit of IPA code. Remove focus_status.h as it is no longer needed. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
43f57f26b4
commit
ac7511dc4c
16 changed files with 24 additions and 112 deletions
|
@ -1,20 +0,0 @@
|
|||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
/*
|
||||
* Copyright (C) 2020, Raspberry Pi Ltd
|
||||
*
|
||||
* focus_status.h - focus measurement status
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <linux/bcm2835-isp.h>
|
||||
|
||||
/*
|
||||
* The focus algorithm should post the following structure into the image's
|
||||
* "focus.status" metadata. Recall that it's only reporting focus (contrast)
|
||||
* measurements, it's not driving any kind of auto-focus algorithm!
|
||||
*/
|
||||
|
||||
struct FocusStatus {
|
||||
unsigned int num;
|
||||
uint32_t focusMeasures[FOCUS_REGIONS];
|
||||
};
|
|
@ -28,7 +28,6 @@
|
|||
* "nuisance" scans. During each interval where PDAF is not working, only
|
||||
* ONE scan will be performed; CAF cannot track objects using CDAF alone.
|
||||
*
|
||||
* This algorithm is unrelated to "rpi.focus" which merely reports CDAF FoM.
|
||||
*/
|
||||
|
||||
namespace RPiController {
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
/*
|
||||
* Copyright (C) 2020, Raspberry Pi Ltd
|
||||
*
|
||||
* focus.cpp - focus algorithm
|
||||
*/
|
||||
#include <stdint.h>
|
||||
|
||||
#include <libcamera/base/log.h>
|
||||
|
||||
#include "../focus_status.h"
|
||||
#include "focus.h"
|
||||
|
||||
using namespace RPiController;
|
||||
using namespace libcamera;
|
||||
|
||||
LOG_DEFINE_CATEGORY(RPiFocus)
|
||||
|
||||
#define NAME "rpi.focus"
|
||||
|
||||
Focus::Focus(Controller *controller)
|
||||
: Algorithm(controller)
|
||||
{
|
||||
}
|
||||
|
||||
char const *Focus::name() const
|
||||
{
|
||||
return NAME;
|
||||
}
|
||||
|
||||
void Focus::process(StatisticsPtr &stats, Metadata *imageMetadata)
|
||||
{
|
||||
FocusStatus status;
|
||||
for (unsigned int i = 0; i < stats->focusRegions.numRegions(); i++)
|
||||
status.focusMeasures[i] = stats->focusRegions.get(i).val;
|
||||
status.num = stats->focusRegions.numRegions();
|
||||
imageMetadata->set("focus.status", status);
|
||||
|
||||
LOG(RPiFocus, Debug)
|
||||
<< "Focus contrast measure: "
|
||||
<< (status.focusMeasures[5] + status.focusMeasures[6]) / 10;
|
||||
}
|
||||
|
||||
/* Register algorithm with the system. */
|
||||
static Algorithm *create(Controller *controller)
|
||||
{
|
||||
return new Focus(controller);
|
||||
}
|
||||
static RegisterAlgorithm reg(NAME, &create);
|
|
@ -195,9 +195,6 @@
|
|||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
}
|
||||
]
|
||||
}
|
|
@ -532,9 +532,6 @@
|
|||
"strength": 1.0,
|
||||
"limit": 0.18
|
||||
}
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -228,9 +228,6 @@
|
|||
"strength": 1.0,
|
||||
"limit": 0.18
|
||||
}
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -513,9 +513,6 @@
|
|||
},
|
||||
{
|
||||
"rpi.sharpen": { }
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
}
|
||||
]
|
||||
}
|
|
@ -424,9 +424,6 @@
|
|||
},
|
||||
{
|
||||
"rpi.sharpen": { }
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
}
|
||||
]
|
||||
}
|
|
@ -474,9 +474,6 @@
|
|||
},
|
||||
{
|
||||
"rpi.sharpen": { }
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
}
|
||||
]
|
||||
}
|
|
@ -511,9 +511,6 @@
|
|||
},
|
||||
{
|
||||
"rpi.sharpen": { }
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
}
|
||||
]
|
||||
}
|
|
@ -512,9 +512,6 @@
|
|||
{
|
||||
"rpi.sharpen": { }
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
},
|
||||
{
|
||||
"rpi.af":
|
||||
{
|
||||
|
|
|
@ -512,9 +512,6 @@
|
|||
{
|
||||
"rpi.sharpen": { }
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
},
|
||||
{
|
||||
"rpi.af":
|
||||
{
|
||||
|
|
|
@ -403,9 +403,6 @@
|
|||
{
|
||||
"rpi.sharpen": { }
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
},
|
||||
{
|
||||
"rpi.af":
|
||||
{
|
||||
|
|
|
@ -403,9 +403,6 @@
|
|||
{
|
||||
"rpi.sharpen": { }
|
||||
},
|
||||
{
|
||||
"rpi.focus": { }
|
||||
},
|
||||
{
|
||||
"rpi.af":
|
||||
{
|
||||
|
|
|
@ -33,7 +33,6 @@ rpi_ipa_sources = files([
|
|||
'controller/rpi/awb.cpp',
|
||||
'controller/rpi/sharpen.cpp',
|
||||
'controller/rpi/black_level.cpp',
|
||||
'controller/rpi/focus.cpp',
|
||||
'controller/rpi/geq.cpp',
|
||||
'controller/rpi/noise.cpp',
|
||||
'controller/rpi/lux.cpp',
|
||||
|
|
|
@ -50,7 +50,6 @@
|
|||
#include "denoise_algorithm.h"
|
||||
#include "denoise_status.h"
|
||||
#include "dpc_status.h"
|
||||
#include "focus_status.h"
|
||||
#include "geq_status.h"
|
||||
#include "lux_status.h"
|
||||
#include "metadata.h"
|
||||
|
@ -642,14 +641,28 @@ void IPARPi::reportMetadata(unsigned int ipaContext)
|
|||
static_cast<int32_t>(blackLevelStatus->blackLevelG),
|
||||
static_cast<int32_t>(blackLevelStatus->blackLevelB) });
|
||||
|
||||
FocusStatus *focusStatus = rpiMetadata.getLocked<FocusStatus>("focus.status");
|
||||
if (focusStatus && focusStatus->num == 12) {
|
||||
RPiController::FocusRegions *focusStatus =
|
||||
rpiMetadata.getLocked<RPiController::FocusRegions>("focus.status");
|
||||
if (focusStatus) {
|
||||
/*
|
||||
* We get a 4x3 grid of regions by default. Calculate the average
|
||||
* FoM over the central two positions to give an overall scene FoM.
|
||||
* This can change later if it is not deemed suitable.
|
||||
* Calculate the average FoM over the central (symmetric) positions
|
||||
* to give an overall scene FoM. This can change later if it is
|
||||
* not deemed suitable.
|
||||
*/
|
||||
int32_t focusFoM = (focusStatus->focusMeasures[5] + focusStatus->focusMeasures[6]) / 2;
|
||||
libcamera::Size size = focusStatus->size();
|
||||
unsigned rows = size.height;
|
||||
unsigned cols = size.width;
|
||||
|
||||
uint64_t sum = 0;
|
||||
unsigned int numRegions = 0;
|
||||
for (unsigned r = rows / 3; r < rows - rows / 3; ++r) {
|
||||
for (unsigned c = cols / 4; c < cols - cols / 4; ++c) {
|
||||
sum += focusStatus->get({ (int)c, (int)r }).val;
|
||||
numRegions++;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t focusFoM = (sum / numRegions) >> 16;
|
||||
libcameraMetadata_.set(controls::FocusFoM, focusFoM);
|
||||
}
|
||||
|
||||
|
@ -1428,7 +1441,6 @@ RPiController::StatisticsPtr IPARPi::fillStatistics(bcm2835_isp_stats *stats) co
|
|||
statistics->focusRegions.set(i, { stats->focus_stats[i].contrast_val[1][1] / 1000,
|
||||
stats->focus_stats[i].contrast_val_num[1][1],
|
||||
stats->focus_stats[i].contrast_val_num[1][0] });
|
||||
|
||||
return statistics;
|
||||
}
|
||||
|
||||
|
@ -1445,6 +1457,10 @@ void IPARPi::processStats(unsigned int bufferId, unsigned int ipaContext)
|
|||
Span<uint8_t> mem = it->second.planes()[0];
|
||||
bcm2835_isp_stats *stats = reinterpret_cast<bcm2835_isp_stats *>(mem.data());
|
||||
RPiController::StatisticsPtr statistics = fillStatistics(stats);
|
||||
|
||||
/* Save the focus stats in the metadata structure to report out later. */
|
||||
rpiMetadata_[ipaContext].set("focus.status", statistics->focusRegions);
|
||||
|
||||
helper_->process(statistics, rpiMetadata);
|
||||
controller_.process(statistics, &rpiMetadata);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue