diff options
Diffstat (limited to 'drivers/staging/media/atomisp/pci/atomisp2/css2400/camera/pipe/src/pipe_binarydesc.c')
-rw-r--r-- | drivers/staging/media/atomisp/pci/atomisp2/css2400/camera/pipe/src/pipe_binarydesc.c | 880 |
1 files changed, 0 insertions, 880 deletions
diff --git a/drivers/staging/media/atomisp/pci/atomisp2/css2400/camera/pipe/src/pipe_binarydesc.c b/drivers/staging/media/atomisp/pci/atomisp2/css2400/camera/pipe/src/pipe_binarydesc.c deleted file mode 100644 index 98a2a3e..0000000 --- a/drivers/staging/media/atomisp/pci/atomisp2/css2400/camera/pipe/src/pipe_binarydesc.c +++ /dev/null @@ -1,880 +0,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. - */ - -#include "ia_css_pipe_binarydesc.h" -#include "ia_css_frame_format.h" -#include "ia_css_pipe.h" -#include "ia_css_pipe_util.h" -#include "ia_css_util.h" -#include "ia_css_debug.h" -#include "sh_css_params.h" -#include <assert_support.h> -/* HRT_GDC_N */ -#include "gdc_device.h" -#include <linux/kernel.h> - -/* This module provides a binary descriptions to used to find a binary. Since, - * every stage is associated with a binary, it implicity helps stage - * description. Apart from providing a binary description, this module also - * populates the frame info's when required.*/ - -/* Generic descriptor for offline binaries. Internal function. */ -static void pipe_binarydesc_get_offline( - struct ia_css_pipe const * const pipe, - const int mode, - struct ia_css_binary_descr *descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info[], - struct ia_css_frame_info *vf_info) -{ - unsigned int i; - /* in_info, out_info, vf_info can be NULL */ - assert(pipe != NULL); - assert(descr != NULL); - ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, - "pipe_binarydesc_get_offline() enter:\n"); - - descr->mode = mode; - descr->online = false; - descr->continuous = pipe->stream->config.continuous; - descr->striped = false; - descr->two_ppc = false; - descr->enable_yuv_ds = false; - descr->enable_high_speed = false; - descr->enable_dvs_6axis = false; - descr->enable_reduced_pipe = false; - descr->enable_dz = true; - descr->enable_xnr = false; - descr->enable_dpc = false; -#ifdef ISP2401 - descr->enable_luma_only = false; - descr->enable_tnr = false; -#endif - descr->enable_capture_pp_bli = false; - descr->enable_fractional_ds = false; - descr->dvs_env.width = 0; - descr->dvs_env.height = 0; - descr->stream_format = pipe->stream->config.input_config.format; - descr->in_info = in_info; - descr->bds_out_info = NULL; - for (i = 0; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - descr->out_info[i] = out_info[i]; - descr->vf_info = vf_info; - descr->isp_pipe_version = pipe->config.isp_pipe_version; - descr->required_bds_factor = SH_CSS_BDS_FACTOR_1_00; - descr->stream_config_left_padding = -1; -} - -void ia_css_pipe_get_copy_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *copy_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info, - struct ia_css_frame_info *vf_info) -{ - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - unsigned int i; - /* out_info can be NULL */ - assert(pipe != NULL); - assert(in_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - *in_info = *out_info; - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_COPY, - copy_descr, in_info, out_infos, vf_info); - copy_descr->online = true; - copy_descr->continuous = false; - copy_descr->two_ppc = (pipe->stream->config.pixels_per_clock == 2); - copy_descr->enable_dz = false; - copy_descr->isp_pipe_version = IA_CSS_PIPE_VERSION_1; - IA_CSS_LEAVE_PRIVATE(""); -} -void ia_css_pipe_get_vfpp_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *vf_pp_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info) -{ - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - unsigned int i; - /* out_info can be NULL ??? */ - assert(pipe != NULL); - assert(in_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - in_info->raw_bit_depth = 0; - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_VF_PP, - vf_pp_descr, in_info, out_infos, NULL); - vf_pp_descr->enable_fractional_ds = true; - IA_CSS_LEAVE_PRIVATE(""); -} - -static struct sh_css_bds_factor bds_factors_list[] = { - {1, 1, SH_CSS_BDS_FACTOR_1_00}, - {5, 4, SH_CSS_BDS_FACTOR_1_25}, - {3, 2, SH_CSS_BDS_FACTOR_1_50}, - {2, 1, SH_CSS_BDS_FACTOR_2_00}, - {9, 4, SH_CSS_BDS_FACTOR_2_25}, - {5, 2, SH_CSS_BDS_FACTOR_2_50}, - {3, 1, SH_CSS_BDS_FACTOR_3_00}, - {4, 1, SH_CSS_BDS_FACTOR_4_00}, - {9, 2, SH_CSS_BDS_FACTOR_4_50}, - {5, 1, SH_CSS_BDS_FACTOR_5_00}, - {6, 1, SH_CSS_BDS_FACTOR_6_00}, - {8, 1, SH_CSS_BDS_FACTOR_8_00} -}; - -enum ia_css_err sh_css_bds_factor_get_numerator_denominator( - unsigned int bds_factor, - unsigned int *bds_factor_numerator, - unsigned int *bds_factor_denominator) -{ - unsigned int i; - - /* Loop over all bds factors until a match is found */ - for (i = 0; i < ARRAY_SIZE(bds_factors_list); i++) { - if (bds_factors_list[i].bds_factor == bds_factor) { - *bds_factor_numerator = bds_factors_list[i].numerator; - *bds_factor_denominator = bds_factors_list[i].denominator; - return IA_CSS_SUCCESS; - } - } - - /* Throw an error since bds_factor cannot be found - in bds_factors_list */ - return IA_CSS_ERR_INVALID_ARGUMENTS; -} - -enum ia_css_err binarydesc_calculate_bds_factor( - struct ia_css_resolution input_res, - struct ia_css_resolution output_res, - unsigned int *bds_factor) -{ - unsigned int i; - unsigned int in_w = input_res.width, - in_h = input_res.height, - out_w = output_res.width, out_h = output_res.height; - - unsigned int max_bds_factor = 8; - unsigned int max_rounding_margin = 2; - /* delta in pixels to account for rounding margin in the calculation */ - unsigned int delta = max_bds_factor * max_rounding_margin; - - /* Assert if the resolutions are not set */ - assert(in_w != 0 && in_h != 0); - assert(out_w != 0 && out_h != 0); - - /* Loop over all bds factors until a match is found */ - for (i = 0; i < ARRAY_SIZE(bds_factors_list); i++) { - unsigned num = bds_factors_list[i].numerator; - unsigned den = bds_factors_list[i].denominator; - - /* See width-wise and height-wise if this bds_factor - * satisfies the condition */ - bool cond = (out_w * num / den + delta > in_w) && - (out_w * num / den <= in_w) && - (out_h * num / den + delta > in_h) && - (out_h * num / den <= in_h); - - if (cond) { - *bds_factor = bds_factors_list[i].bds_factor; - return IA_CSS_SUCCESS; - } - } - - /* Throw an error since a suitable bds_factor cannot be found */ - return IA_CSS_ERR_INVALID_ARGUMENTS; -} - -enum ia_css_err ia_css_pipe_get_preview_binarydesc( - struct ia_css_pipe * const pipe, - struct ia_css_binary_descr *preview_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *bds_out_info, - struct ia_css_frame_info *out_info, - struct ia_css_frame_info *vf_info) -{ - enum ia_css_err err; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - int mode = IA_CSS_BINARY_MODE_PREVIEW; - unsigned int i; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - assert(vf_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - /* - * Set up the info of the input frame with - * the ISP required resolution - */ - in_info->res = pipe->config.input_effective_res; - in_info->padded_width = in_info->res.width; - in_info->raw_bit_depth = ia_css_pipe_util_pipe_input_format_bpp(pipe); - - if (ia_css_util_is_input_format_yuv(pipe->stream->config.input_config.format)) - mode = IA_CSS_BINARY_MODE_COPY; - else - in_info->format = IA_CSS_FRAME_FORMAT_RAW; - - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, mode, - preview_descr, in_info, out_infos, vf_info); - if (pipe->stream->config.online) { - preview_descr->online = pipe->stream->config.online; - preview_descr->two_ppc = - (pipe->stream->config.pixels_per_clock == 2); - } - preview_descr->stream_format = pipe->stream->config.input_config.format; - - /* TODO: Remove this when bds_out_info is available! */ - *bds_out_info = *in_info; - - if (pipe->extra_config.enable_raw_binning) { - if (pipe->config.bayer_ds_out_res.width != 0 && - pipe->config.bayer_ds_out_res.height != 0) { - bds_out_info->res.width = - pipe->config.bayer_ds_out_res.width; - bds_out_info->res.height = - pipe->config.bayer_ds_out_res.height; - bds_out_info->padded_width = - pipe->config.bayer_ds_out_res.width; - err = - binarydesc_calculate_bds_factor(in_info->res, - bds_out_info->res, - &preview_descr->required_bds_factor); - if (err != IA_CSS_SUCCESS) - return err; - } else { - bds_out_info->res.width = in_info->res.width / 2; - bds_out_info->res.height = in_info->res.height / 2; - bds_out_info->padded_width = in_info->padded_width / 2; - preview_descr->required_bds_factor = - SH_CSS_BDS_FACTOR_2_00; - } - } else { - /* TODO: Remove this when bds_out_info->is available! */ - bds_out_info->res.width = in_info->res.width; - bds_out_info->res.height = in_info->res.height; - bds_out_info->padded_width = in_info->padded_width; - preview_descr->required_bds_factor = SH_CSS_BDS_FACTOR_1_00; - } - pipe->required_bds_factor = preview_descr->required_bds_factor; - - /* bayer ds and fractional ds cannot be enabled at the same time, - so we disable bds_out_info when fractional ds is used */ - if (!pipe->extra_config.enable_fractional_ds) - preview_descr->bds_out_info = bds_out_info; - else - preview_descr->bds_out_info = NULL; - /* - ----Preview binary----- - --in-->|--out->|vf_veceven|--|--->vf - ----------------------- - * Preview binary normally doesn't have a vf_port but - * instead it has an output port. However, the output is - * generated by vf_veceven module in which we might have - * a downscaling (by 1x, 2x, or 4x). Because the resolution - * might change, we need two different info, namely out_info - * & vf_info. In fill_binary_info we use out&vf info to - * calculate vf decimation factor. - */ - *out_info = *vf_info; - - /* In case of preview_ds binary, we can do any fractional amount - * of downscale, so there is no DS needed in vf_veceven. Therefore, - * out and vf infos will be the same. Otherwise, we set out resolution - * equal to in resolution. */ - if (!pipe->extra_config.enable_fractional_ds) { - /* TODO: Change this when bds_out_info is available! */ - out_info->res.width = bds_out_info->res.width; - out_info->res.height = bds_out_info->res.height; - out_info->padded_width = bds_out_info->padded_width; - } - preview_descr->enable_fractional_ds = - pipe->extra_config.enable_fractional_ds; - - preview_descr->enable_dpc = pipe->config.enable_dpc; - - preview_descr->isp_pipe_version = pipe->config.isp_pipe_version; - IA_CSS_LEAVE_ERR_PRIVATE(IA_CSS_SUCCESS); - return IA_CSS_SUCCESS; -} - -enum ia_css_err ia_css_pipe_get_video_binarydesc( - struct ia_css_pipe * const pipe, - struct ia_css_binary_descr *video_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *bds_out_info, - struct ia_css_frame_info *out_info, - struct ia_css_frame_info *vf_info, - int stream_config_left_padding) -{ - int mode = IA_CSS_BINARY_MODE_VIDEO; - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - enum ia_css_err err = IA_CSS_SUCCESS; - bool stream_dz_config = false; - - /* vf_info can be NULL */ - assert(pipe != NULL); - assert(in_info != NULL); - /* assert(vf_info != NULL); */ - IA_CSS_ENTER_PRIVATE(""); - - /* The solution below is not optimal; we should move to using ia_css_pipe_get_copy_binarydesc() - * But for now this fixes things; this code used to be there but was removed - * with gerrit 8908 as this was wrong for Skycam; however 240x still needs this - */ - if (ia_css_util_is_input_format_yuv(pipe->stream->config.input_config.format)) - mode = IA_CSS_BINARY_MODE_COPY; - - in_info->res = pipe->config.input_effective_res; - in_info->padded_width = in_info->res.width; - in_info->format = IA_CSS_FRAME_FORMAT_RAW; - in_info->raw_bit_depth = ia_css_pipe_util_pipe_input_format_bpp(pipe); - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, mode, - video_descr, in_info, out_infos, vf_info); - - if (pipe->stream->config.online) { - video_descr->online = pipe->stream->config.online; - video_descr->two_ppc = - (pipe->stream->config.pixels_per_clock == 2); - } - - if (mode == IA_CSS_BINARY_MODE_VIDEO) { - stream_dz_config = - ((pipe->stream->isp_params_configs->dz_config.dx != - HRT_GDC_N) - || (pipe->stream->isp_params_configs->dz_config.dy != - HRT_GDC_N)); - - video_descr->enable_dz = pipe->config.enable_dz - || stream_dz_config; - video_descr->dvs_env = pipe->config.dvs_envelope; - video_descr->enable_yuv_ds = pipe->extra_config.enable_yuv_ds; - video_descr->enable_high_speed = - pipe->extra_config.enable_high_speed; - video_descr->enable_dvs_6axis = - pipe->extra_config.enable_dvs_6axis; - video_descr->enable_reduced_pipe = - pipe->extra_config.enable_reduced_pipe; - video_descr->isp_pipe_version = pipe->config.isp_pipe_version; - video_descr->enable_fractional_ds = - pipe->extra_config.enable_fractional_ds; - video_descr->enable_dpc = - pipe->config.enable_dpc; -#ifdef ISP2401 - video_descr->enable_luma_only = - pipe->config.enable_luma_only; - video_descr->enable_tnr = - pipe->config.enable_tnr; -#endif - - if (pipe->extra_config.enable_raw_binning) { - if (pipe->config.bayer_ds_out_res.width != 0 && - pipe->config.bayer_ds_out_res.height != 0) { - bds_out_info->res.width = - pipe->config.bayer_ds_out_res.width; - bds_out_info->res.height = - pipe->config.bayer_ds_out_res.height; - bds_out_info->padded_width = - pipe->config.bayer_ds_out_res.width; - err = - binarydesc_calculate_bds_factor( - in_info->res, bds_out_info->res, - &video_descr->required_bds_factor); - if (err != IA_CSS_SUCCESS) - return err; - } else { - bds_out_info->res.width = - in_info->res.width / 2; - bds_out_info->res.height = - in_info->res.height / 2; - bds_out_info->padded_width = - in_info->padded_width / 2; - video_descr->required_bds_factor = - SH_CSS_BDS_FACTOR_2_00; - } - } else { - bds_out_info->res.width = in_info->res.width; - bds_out_info->res.height = in_info->res.height; - bds_out_info->padded_width = in_info->padded_width; - video_descr->required_bds_factor = - SH_CSS_BDS_FACTOR_1_00; - } - - pipe->required_bds_factor = video_descr->required_bds_factor; - - /* bayer ds and fractional ds cannot be enabled - at the same time, so we disable bds_out_info when - fractional ds is used */ - if (!pipe->extra_config.enable_fractional_ds) - video_descr->bds_out_info = bds_out_info; - else - video_descr->bds_out_info = NULL; - - video_descr->enable_fractional_ds = - pipe->extra_config.enable_fractional_ds; - video_descr->stream_config_left_padding = stream_config_left_padding; - } - IA_CSS_LEAVE_ERR_PRIVATE(err); - return err; -} - -void ia_css_pipe_get_yuvscaler_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *yuv_scaler_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info, - struct ia_css_frame_info *internal_out_info, - struct ia_css_frame_info *vf_info) -{ - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - struct ia_css_frame_info *this_vf_info = NULL; - - assert(pipe != NULL); - assert(in_info != NULL); - /* Note: if the following assert fails, the number of ports has been - * changed; in that case an additional initializer must be added - * a few lines below after which this assert can be updated. - */ - assert(IA_CSS_BINARY_MAX_OUTPUT_PORTS == 2); - IA_CSS_ENTER_PRIVATE(""); - - in_info->padded_width = in_info->res.width; - in_info->raw_bit_depth = 0; - ia_css_frame_info_set_width(in_info, in_info->res.width, 0); - out_infos[0] = out_info; - out_infos[1] = internal_out_info; - /* add initializers here if - * assert(IA_CSS_BINARY_MAX_OUTPUT_PORTS == ...); - * fails - */ - - if (vf_info) { - this_vf_info = (vf_info->res.width == 0 && - vf_info->res.height == 0) ? NULL : vf_info; - } - - pipe_binarydesc_get_offline(pipe, - IA_CSS_BINARY_MODE_CAPTURE_PP, - yuv_scaler_descr, - in_info, out_infos, this_vf_info); - - yuv_scaler_descr->enable_fractional_ds = true; - IA_CSS_LEAVE_PRIVATE(""); -} - -void ia_css_pipe_get_capturepp_binarydesc( - struct ia_css_pipe * const pipe, - struct ia_css_binary_descr *capture_pp_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info, - struct ia_css_frame_info *vf_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(vf_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - - /* the in_info is only used for resolution to enable - bayer down scaling. */ - if (pipe->out_yuv_ds_input_info.res.width) - *in_info = pipe->out_yuv_ds_input_info; - else - *in_info = *out_info; - in_info->format = IA_CSS_FRAME_FORMAT_YUV420; - in_info->raw_bit_depth = 0; - ia_css_frame_info_set_width(in_info, in_info->res.width, 0); - - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, - IA_CSS_BINARY_MODE_CAPTURE_PP, - capture_pp_descr, - in_info, out_infos, vf_info); - - capture_pp_descr->enable_capture_pp_bli = - pipe->config.default_capture_config.enable_capture_pp_bli; - capture_pp_descr->enable_fractional_ds = true; - capture_pp_descr->enable_xnr = - pipe->config.default_capture_config.enable_xnr != 0; - IA_CSS_LEAVE_PRIVATE(""); -} - -/* lookup table for high quality primary binaries */ -static unsigned int primary_hq_binary_modes[NUM_PRIMARY_HQ_STAGES] = -{ - IA_CSS_BINARY_MODE_PRIMARY_HQ_STAGE0, - IA_CSS_BINARY_MODE_PRIMARY_HQ_STAGE1, - IA_CSS_BINARY_MODE_PRIMARY_HQ_STAGE2, - IA_CSS_BINARY_MODE_PRIMARY_HQ_STAGE3, - IA_CSS_BINARY_MODE_PRIMARY_HQ_STAGE4, - IA_CSS_BINARY_MODE_PRIMARY_HQ_STAGE5 -}; - -void ia_css_pipe_get_primary_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *prim_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info, - struct ia_css_frame_info *vf_info, - unsigned int stage_idx) -{ - enum ia_css_pipe_version pipe_version = pipe->config.isp_pipe_version; - int mode; - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - assert(stage_idx < NUM_PRIMARY_HQ_STAGES); - /* vf_info can be NULL - example video_binarydescr */ - /*assert(vf_info != NULL);*/ - IA_CSS_ENTER_PRIVATE(""); - - if (pipe_version == IA_CSS_PIPE_VERSION_2_6_1) - mode = primary_hq_binary_modes[stage_idx]; - else - mode = IA_CSS_BINARY_MODE_PRIMARY; - - if (ia_css_util_is_input_format_yuv(pipe->stream->config.input_config.format)) - mode = IA_CSS_BINARY_MODE_COPY; - - in_info->res = pipe->config.input_effective_res; - in_info->padded_width = in_info->res.width; - -#if !defined(HAS_NO_PACKED_RAW_PIXELS) - if (pipe->stream->config.pack_raw_pixels) - in_info->format = IA_CSS_FRAME_FORMAT_RAW_PACKED; - else -#endif - in_info->format = IA_CSS_FRAME_FORMAT_RAW; - - in_info->raw_bit_depth = ia_css_pipe_util_pipe_input_format_bpp(pipe); - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, mode, - prim_descr, in_info, out_infos, vf_info); - - if (pipe->stream->config.online && - pipe->stream->config.mode != IA_CSS_INPUT_MODE_MEMORY) { - prim_descr->online = true; - prim_descr->two_ppc = - (pipe->stream->config.pixels_per_clock == 2); - prim_descr->stream_format = pipe->stream->config.input_config.format; - } - if (mode == IA_CSS_BINARY_MODE_PRIMARY) { - prim_descr->isp_pipe_version = pipe->config.isp_pipe_version; - prim_descr->enable_fractional_ds = - pipe->extra_config.enable_fractional_ds; -#ifdef ISP2401 - prim_descr->enable_luma_only = - pipe->config.enable_luma_only; -#endif - /* We have both striped and non-striped primary binaries, - * if continuous viewfinder is required, then we must select - * a striped one. Otherwise we prefer to use a non-striped - * since it has better performance. */ - if (pipe_version == IA_CSS_PIPE_VERSION_2_6_1) - prim_descr->striped = false; - else -#ifndef ISP2401 - prim_descr->striped = prim_descr->continuous && (!pipe->stream->stop_copy_preview || !pipe->stream->disable_cont_vf); -#else - prim_descr->striped = prim_descr->continuous && !pipe->stream->disable_cont_vf; - - if ((pipe->config.default_capture_config.enable_xnr != 0) && - (pipe->extra_config.enable_dvs_6axis == true)) - prim_descr->enable_xnr = true; -#endif - } - IA_CSS_LEAVE_PRIVATE(""); -} - -void ia_css_pipe_get_pre_gdc_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *pre_gdc_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - *in_info = *out_info; - in_info->format = IA_CSS_FRAME_FORMAT_RAW; - in_info->raw_bit_depth = ia_css_pipe_util_pipe_input_format_bpp(pipe); - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_PRE_ISP, - pre_gdc_descr, in_info, out_infos, NULL); - pre_gdc_descr->isp_pipe_version = pipe->config.isp_pipe_version; - IA_CSS_LEAVE_PRIVATE(""); -} - -void ia_css_pipe_get_gdc_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *gdc_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - *in_info = *out_info; - in_info->format = IA_CSS_FRAME_FORMAT_QPLANE6; - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_GDC, - gdc_descr, in_info, out_infos, NULL); - IA_CSS_LEAVE_PRIVATE(""); -} - -void ia_css_pipe_get_post_gdc_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *post_gdc_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info, - struct ia_css_frame_info *vf_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - assert(vf_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - *in_info = *out_info; - in_info->format = IA_CSS_FRAME_FORMAT_YUV420_16; - in_info->raw_bit_depth = 16; - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_POST_ISP, - post_gdc_descr, in_info, out_infos, vf_info); - - post_gdc_descr->isp_pipe_version = pipe->config.isp_pipe_version; - IA_CSS_LEAVE_PRIVATE(""); -} - -void ia_css_pipe_get_pre_de_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *pre_de_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - *in_info = *out_info; - in_info->format = IA_CSS_FRAME_FORMAT_RAW; - in_info->raw_bit_depth = ia_css_pipe_util_pipe_input_format_bpp(pipe); - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - if (pipe->config.isp_pipe_version == IA_CSS_PIPE_VERSION_1) - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_PRE_ISP, - pre_de_descr, in_info, out_infos, NULL); - else if (pipe->config.isp_pipe_version == IA_CSS_PIPE_VERSION_2_2) { - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_PRE_DE, - pre_de_descr, in_info, out_infos, NULL); - } - - if (pipe->stream->config.online) { - pre_de_descr->online = true; - pre_de_descr->two_ppc = - (pipe->stream->config.pixels_per_clock == 2); - pre_de_descr->stream_format = pipe->stream->config.input_config.format; - } - pre_de_descr->isp_pipe_version = pipe->config.isp_pipe_version; - IA_CSS_LEAVE_PRIVATE(""); -} - -void ia_css_pipe_get_pre_anr_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *pre_anr_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - *in_info = *out_info; - in_info->format = IA_CSS_FRAME_FORMAT_RAW; - in_info->raw_bit_depth = ia_css_pipe_util_pipe_input_format_bpp(pipe); - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_PRE_ISP, - pre_anr_descr, in_info, out_infos, NULL); - - if (pipe->stream->config.online) { - pre_anr_descr->online = true; - pre_anr_descr->two_ppc = - (pipe->stream->config.pixels_per_clock == 2); - pre_anr_descr->stream_format = pipe->stream->config.input_config.format; - } - pre_anr_descr->isp_pipe_version = pipe->config.isp_pipe_version; - IA_CSS_LEAVE_PRIVATE(""); -} - -void ia_css_pipe_get_anr_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *anr_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - *in_info = *out_info; - in_info->format = IA_CSS_FRAME_FORMAT_RAW; - in_info->raw_bit_depth = ANR_ELEMENT_BITS; - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_ANR, - anr_descr, in_info, out_infos, NULL); - - anr_descr->isp_pipe_version = pipe->config.isp_pipe_version; - IA_CSS_LEAVE_PRIVATE(""); -} - - -void ia_css_pipe_get_post_anr_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *post_anr_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info, - struct ia_css_frame_info *vf_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - assert(vf_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - - *in_info = *out_info; - in_info->format = IA_CSS_FRAME_FORMAT_RAW; - in_info->raw_bit_depth = ANR_ELEMENT_BITS; - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_POST_ISP, - post_anr_descr, in_info, out_infos, vf_info); - - post_anr_descr->isp_pipe_version = pipe->config.isp_pipe_version; - IA_CSS_LEAVE_PRIVATE(""); -} - -void ia_css_pipe_get_ldc_binarydesc( - struct ia_css_pipe const * const pipe, - struct ia_css_binary_descr *ldc_descr, - struct ia_css_frame_info *in_info, - struct ia_css_frame_info *out_info) -{ - unsigned int i; - struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS]; - - assert(pipe != NULL); - assert(in_info != NULL); - assert(out_info != NULL); - IA_CSS_ENTER_PRIVATE(""); - -#ifndef ISP2401 - *in_info = *out_info; -#else - if (pipe->out_yuv_ds_input_info.res.width) - *in_info = pipe->out_yuv_ds_input_info; - else - *in_info = *out_info; -#endif - in_info->format = IA_CSS_FRAME_FORMAT_YUV420; - in_info->raw_bit_depth = 0; - ia_css_frame_info_set_width(in_info, in_info->res.width, 0); - - out_infos[0] = out_info; - for (i = 1; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) - out_infos[i] = NULL; - - pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_CAPTURE_PP, - ldc_descr, in_info, out_infos, NULL); - ldc_descr->enable_dvs_6axis = - pipe->extra_config.enable_dvs_6axis; - IA_CSS_LEAVE_PRIVATE(""); -} |