/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Support for Intel Camera Imaging ISP subsystem.
 * Copyright (c) 2015, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */

#ifndef _IA_CSS_STREAM_H_
#define _IA_CSS_STREAM_H_

#include <type_support.h>
#include <system_local.h>
#include <input_system.h>
#include "ia_css_types.h"
#include "ia_css_stream_public.h"

/**
 * structure to hold all internal stream related information
 */
struct ia_css_stream {
	struct ia_css_stream_config    config;
	struct ia_css_stream_info      info;
	rx_cfg_t                       csi_rx_config;
	bool                           reconfigure_css_rx;
	struct ia_css_pipe            *last_pipe;
	int                            num_pipes;
	struct ia_css_pipe           **pipes;
	struct ia_css_pipe            *continuous_pipe;
	struct ia_css_isp_parameters  *isp_params_configs;
	struct ia_css_isp_parameters  *per_frame_isp_params_configs;

	bool                           cont_capt;
	bool                           disable_cont_vf;

	/* ISP2401 */
	bool                           stop_copy_preview;
	bool                           started;
};

/* @brief Get a binary in the stream, which binary has the shading correction.
 *
 * @param[in] stream: The stream.
 * @return	The binary which has the shading correction.
 *
 */
struct ia_css_binary *
ia_css_stream_get_shading_correction_binary(const struct ia_css_stream *stream);

struct ia_css_binary *
ia_css_stream_get_dvs_binary(const struct ia_css_stream *stream);

struct ia_css_binary *
ia_css_stream_get_3a_binary(const struct ia_css_stream *stream);

unsigned int
ia_css_stream_input_format_bits_per_pixel(struct ia_css_stream *stream);

bool
sh_css_params_set_binning_factor(struct ia_css_stream *stream,
				 unsigned int sensor_binning);

void
sh_css_invalidate_params(struct ia_css_stream *stream);

/* The following functions are used for testing purposes only */
const struct ia_css_fpn_table *
ia_css_get_fpn_table(struct ia_css_stream *stream);

/* @brief Get a pointer to the shading table.
 *
 * @param[in] stream: The stream.
 * @return	The pointer to the shading table.
 *
 */
struct ia_css_shading_table *
ia_css_get_shading_table(struct ia_css_stream *stream);

void
ia_css_get_isp_dis_coefficients(struct ia_css_stream *stream,
				short *horizontal_coefficients,
				short *vertical_coefficients);

void
ia_css_get_isp_dvs2_coefficients(struct ia_css_stream *stream,
				 short *hor_coefs_odd_real,
				 short *hor_coefs_odd_imag,
				 short *hor_coefs_even_real,
				 short *hor_coefs_even_imag,
				 short *ver_coefs_odd_real,
				 short *ver_coefs_odd_imag,
				 short *ver_coefs_even_real,
				 short *ver_coefs_even_imag);

int
ia_css_stream_isp_parameters_init(struct ia_css_stream *stream);

void
ia_css_stream_isp_parameters_uninit(struct ia_css_stream *stream);

#endif /*_IA_CSS_STREAM_H_*/
