blob: 05a597c28df2fdb7f899b2ac35025d64991c4c74 [file] [log] [blame]
/*
* Copyright 2023 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "risp4ml/isp_stages/dg.h"
#include "risp4ml/common/utils.h"
static const uint16_t kDgFractional = kRawPipelineFraction;
static const uint16_t kDgUnityGain = 1 << kDgFractional;
static DgParams dg_params = {
.enable = true,
.gains = {kDgUnityGain, kDgUnityGain, kDgUnityGain, kDgUnityGain}};
void set_dg_params(DgParams* params) { dg_params = *params; }
void dg_process(Image* img) {
if (!dg_params.enable) return;
for (uint16_t y = 0; y < img->height; ++y) {
pixel_type_t* line = image_row(img, 0, y);
for (uint16_t x = 0; x < img->width; ++x) {
BayerIndex bayer_index = GetBayerIndex(kBayerType, x, y);
// + (1 << (kDgFractional -1)) adds 0.5 for more accurate rounding
uint32_t scaled_pixel = (uint32_t)line[x] * dg_params.gains[bayer_index] +
(1 << (kDgFractional - 1));
line[x] = (pixel_type_t)Clamp(scaled_pixel >> kDgFractional, 0,
kRawPipelineMaxVal);
}
}
}