/*
 * 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 "samples/risp4ml/common/utils.h"
#include "samples/risp4ml/isp_stages/blc.h"
#include "samples/risp4ml/isp_stages/demosaic.h"
#include "samples/risp4ml/isp_stages/dg.h"
#include "samples/risp4ml/isp_stages/downscale.h"
#include "samples/risp4ml/isp_stages/gamma.h"
#include "samples/risp4ml/isp_stages/wbg.h"
#include "samples/risp4ml/pipeline/pipeline.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);
}
