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