summaryrefslogtreecommitdiff
path: root/src/ipa/ipu3/algorithms
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2022-03-23 13:19:14 +0000
committerKieran Bingham <kieran.bingham@ideasonboard.com>2022-04-09 21:00:47 +0200
commit2f7a52df95e64679c4d0f1b009ed354bbd067c5b (patch)
tree714b5a3bc8a1dcc95b0f7d9bdd329c50b1d7c94b /src/ipa/ipu3/algorithms
parent9366dd6d124b07b60f853ef72930e4ca210fa000 (diff)
ipa: ipu3: af: Use Span for y_table_item_t
Convert the y_table_item_t to a Span and use that for iteration when estimating variance of the table. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Tested-by: Kate Hsuan <hpa@redhat.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/ipa/ipu3/algorithms')
-rw-r--r--src/ipa/ipu3/algorithms/af.cpp34
-rw-r--r--src/ipa/ipu3/algorithms/af.h4
2 files changed, 19 insertions, 19 deletions
diff --git a/src/ipa/ipu3/algorithms/af.cpp b/src/ipa/ipu3/algorithms/af.cpp
index aae191ec..f243aceb 100644
--- a/src/ipa/ipu3/algorithms/af.cpp
+++ b/src/ipa/ipu3/algorithms/af.cpp
@@ -354,29 +354,29 @@ void Af::afIgnoreFrameReset()
*
* \return The variance of the values in the data set \a y_item selected by \a isY1
*/
-double Af::afEstimateVariance(const y_table_item_t *y_item, uint32_t len,
- bool isY1)
+double Af::afEstimateVariance(Span<const y_table_item_t> y_items, bool isY1)
{
- uint32_t z = 0;
uint32_t total = 0;
double mean;
double var_sum = 0;
- for (z = 0; z < len; z++) {
+ for (auto y : y_items) {
if (isY1)
- total += y_item[z].y1_avg;
+ total += y.y1_avg;
else
- total += y_item[z].y2_avg;
+ total += y.y2_avg;
}
- mean = total / len;
- for (z = 0; z < len; z++) {
+
+ mean = total / y_items.size();
+
+ for (auto y : y_items) {
if (isY1)
- var_sum += pow((y_item[z].y1_avg - mean), 2);
+ var_sum += pow(y.y1_avg - mean, 2);
else
- var_sum += pow((y_item[z].y2_avg - mean), 2);
+ var_sum += pow(y.y2_avg - mean, 2);
}
- return var_sum / static_cast<double>(len);
+ return var_sum / y_items.size();
}
/**
@@ -424,21 +424,21 @@ bool Af::afIsOutOfFocus(IPAContext context)
*/
void Af::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
{
- const y_table_item_t *y_item = reinterpret_cast<const y_table_item_t *>(&stats->af_raw_buffer.y_table);
- uint32_t afRawBufferLen;
-
/* Evaluate the AF buffer length */
- afRawBufferLen = context.configuration.af.afGrid.width *
- context.configuration.af.afGrid.height;
+ uint32_t afRawBufferLen = context.configuration.af.afGrid.width *
+ context.configuration.af.afGrid.height;
ASSERT(afRawBufferLen < IPU3_UAPI_AF_Y_TABLE_MAX_SIZE);
+ Span<const y_table_item_t> y_items(reinterpret_cast<const y_table_item_t *>(&stats->af_raw_buffer.y_table),
+ afRawBufferLen);
+
/*
* Calculate the mean and the variance of AF statistics for a given grid.
* For coarse: y1 are used.
* For fine: y2 results are used.
*/
- currentVariance_ = afEstimateVariance(y_item, afRawBufferLen, !coarseCompleted_);
+ currentVariance_ = afEstimateVariance(y_items, !coarseCompleted_);
if (!context.frameContext.af.stable) {
afCoarseScan(context);
diff --git a/src/ipa/ipu3/algorithms/af.h b/src/ipa/ipu3/algorithms/af.h
index 3b5758e8..b85cf941 100644
--- a/src/ipa/ipu3/algorithms/af.h
+++ b/src/ipa/ipu3/algorithms/af.h
@@ -41,8 +41,8 @@ private:
void afReset(IPAContext &context);
bool afNeedIgnoreFrame();
void afIgnoreFrameReset();
- double afEstimateVariance(const y_table_item_t *y_item, uint32_t len,
- bool isY1);
+ double afEstimateVariance(Span<const y_table_item_t> y_items, bool isY1);
+
bool afIsOutOfFocus(IPAContext context);
/* VCM step configuration. It is the current setting of the VCM step. */