| /* |
| * 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); |
| } |
| } |
| } |