/*
 * 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/pipeline/pipeline.h"

#include "risp4ml/common/utils.h"
#include "risp4ml/isp_stages/blc.h"
#include "risp4ml/isp_stages/demosaic.h"
#include "risp4ml/isp_stages/dg.h"
#include "risp4ml/isp_stages/downscale.h"
#include "risp4ml/isp_stages/gamma.h"
#include "risp4ml/isp_stages/wbg.h"

void isp_pipeline(ImageU8 *input, ImageU8 *output) {
  Image *img_bayer =
      image_new(input->num_channels, input->height, input->width);
  // shift the 8bits wide input to 16bits (the processing pipeline bitwidth)
  const uint32_t input_dimensions =
      input->num_channels * input->height * input->width;
  for (uint32_t i = 0; i < input_dimensions; ++i) {
    img_bayer->data[i] = input->data[i] << kRawPipelineFraction;  // 8
  }

  // black level offset (in-place)
  blc_process(img_bayer);

  // digital gain (in-place)
  dg_process(img_bayer);

  // white balance gain (in-place)
  wbg_process(img_bayer);

  // demosaic
  Image *img_color =
      image_new(output->num_channels, input->height, input->width);
  demosaic_process(img_bayer, img_color);
  image_delete(img_bayer);

  // gamma correction (in-place)
  gamma_process(img_color);

  // downscaler
  set_downscale_factor(img_color, output);
  downscale_process(img_color, output);
  image_delete(img_color);
}
