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) { int mode = IA_CSS_BINARY_MODE_PRIMARY; 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_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_pipe_get_primary_binarydesc() enter:\n"); if (ia_css_util_is_input_format_yuv(pipe->stream->config.input_config.format)) mode = IA_CSS_BINARY_MODE_COPY; in_info->res = pipe->stream->config.input_config.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; } /* * [email protected] * * TODO * - Pass "prim" the valid input argument "original_in_info". */ pipe_binarydesc_get_offline(pipe, mode, prim_descr, NULL, 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; } }
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) { int mode = IA_CSS_BINARY_MODE_PRIMARY; 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); /* vf_info can be NULL - example video_binarydescr */ /*assert(vf_info != NULL);*/ IA_CSS_ENTER_PRIVATE(""); 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; /* * [email protected] * * TODO * - Pass "prim" the valid input argument "original_in_info". */ pipe_binarydesc_get_offline(pipe, mode, prim_descr, NULL, 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; /* 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. */ prim_descr->striped = prim_descr->continuous && !pipe->stream->stop_copy_preview; } IA_CSS_LEAVE_PRIVATE(""); }
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(""); #if !defined(IS_ISP_2500_SYSTEM) /* 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; #endif 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; /* * [email protected] * * TODO * - Pass "video" the valid input argument * "original_in_info". */ pipe_binarydesc_get_offline(pipe, mode, video_descr, NULL, 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; #if defined(IS_ISP_2500_SYSTEM) /* ignoring enable_raw_binning, as it is obsolete and setting it gives problems finding the binary */ 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; /* the set of supported scaling factors seems to small for skylake err = calculate_bds_factor(in_info->res, bds_out_info->res, &video_descr.required_bds_factor); if (err != IA_CSS_SUCCESS) return err; */ } #else 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; } #endif 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; }
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 *original_in_info, 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 original resolution */ original_in_info->res = pipe->stream->config.input_config.input_res; original_in_info->padded_width = original_in_info->res.width; original_in_info->raw_bit_depth = ia_css_pipe_util_pipe_input_format_bpp(pipe); /* * 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 { original_in_info->format = IA_CSS_FRAME_FORMAT_RAW; 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; /* * [email protected] * * TODO * - Pass "preview" the valid input argument "original_in_info". */ pipe_binarydesc_get_offline(pipe, mode, preview_descr, original_in_info, 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->isp_pipe_version = pipe->config.isp_pipe_version; IA_CSS_LEAVE_ERR_PRIVATE(IA_CSS_SUCCESS); return IA_CSS_SUCCESS; }