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>
This commit is contained in:
Kieran Bingham 2022-03-23 13:19:14 +00:00
parent 9366dd6d12
commit 2f7a52df95
2 changed files with 22 additions and 22 deletions

View file

@ -354,29 +354,29 @@ void Af::afIgnoreFrameReset()
* *
* \return The variance of the values in the data set \a y_item selected by \a isY1 * \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, double Af::afEstimateVariance(Span<const y_table_item_t> y_items, bool isY1)
bool isY1)
{ {
uint32_t z = 0;
uint32_t total = 0; uint32_t total = 0;
double mean; double mean;
double var_sum = 0; double var_sum = 0;
for (z = 0; z < len; z++) { for (auto y : y_items) {
if (isY1) if (isY1)
total += y_item[z].y1_avg; total += y.y1_avg;
else else
total += y_item[z].y2_avg; total += y.y2_avg;
}
mean = total / len;
for (z = 0; z < len; z++) {
if (isY1)
var_sum += pow((y_item[z].y1_avg - mean), 2);
else
var_sum += pow((y_item[z].y2_avg - mean), 2);
} }
return var_sum / static_cast<double>(len); mean = total / y_items.size();
for (auto y : y_items) {
if (isY1)
var_sum += pow(y.y1_avg - mean, 2);
else
var_sum += pow(y.y2_avg - mean, 2);
}
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) 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 */ /* Evaluate the AF buffer length */
afRawBufferLen = context.configuration.af.afGrid.width * uint32_t afRawBufferLen = context.configuration.af.afGrid.width *
context.configuration.af.afGrid.height; context.configuration.af.afGrid.height;
ASSERT(afRawBufferLen < IPU3_UAPI_AF_Y_TABLE_MAX_SIZE); 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. * Calculate the mean and the variance of AF statistics for a given grid.
* For coarse: y1 are used. * For coarse: y1 are used.
* For fine: y2 results are used. * For fine: y2 results are used.
*/ */
currentVariance_ = afEstimateVariance(y_item, afRawBufferLen, !coarseCompleted_); currentVariance_ = afEstimateVariance(y_items, !coarseCompleted_);
if (!context.frameContext.af.stable) { if (!context.frameContext.af.stable) {
afCoarseScan(context); afCoarseScan(context);

View file

@ -41,8 +41,8 @@ private:
void afReset(IPAContext &context); void afReset(IPAContext &context);
bool afNeedIgnoreFrame(); bool afNeedIgnoreFrame();
void afIgnoreFrameReset(); void afIgnoreFrameReset();
double afEstimateVariance(const y_table_item_t *y_item, uint32_t len, double afEstimateVariance(Span<const y_table_item_t> y_items, bool isY1);
bool isY1);
bool afIsOutOfFocus(IPAContext context); bool afIsOutOfFocus(IPAContext context);
/* VCM step configuration. It is the current setting of the VCM step. */ /* VCM step configuration. It is the current setting of the VCM step. */