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; /* * [email protected] * * TODO * - Check with the ISP engineers to see whether "anr" needs * the valid input argument "original_in_info" or not. */ pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_ANR, anr_descr, NULL, in_info, out_infos, NULL); anr_descr->isp_pipe_version = pipe->config.isp_pipe_version; IA_CSS_LEAVE_PRIVATE(""); }
void ia_css_pipeline_map(unsigned int pipe_num, bool map) { assert(pipe_num < IA_CSS_PIPELINE_NUM_MAX); IA_CSS_ENTER_PRIVATE("pipe_num = %d, map = %d", pipe_num, map); if (pipe_num >= IA_CSS_PIPELINE_NUM_MAX) { IA_CSS_ERROR("Invalid pipe number"); IA_CSS_LEAVE_PRIVATE("void"); return; } if (map) pipeline_map_num_to_sp_thread(pipe_num); else pipeline_unmap_num_to_sp_thread(pipe_num); IA_CSS_LEAVE_PRIVATE("void"); }
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, NULL, 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 = 1; 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; /* * [email protected] * * TODO * - Check with the ISP engineers to see whether "gdc" needs * the valid input argument "original_in_info" or not. */ pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_GDC, gdc_descr, NULL, in_info, out_infos, NULL); 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; /* * [email protected] * * TODO * - Check with the ISP engineers to see whether "vf_pp" needs * the valid input argument "original_in_info" or not. */ pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_VF_PP, vf_pp_descr, NULL, in_info, out_infos, NULL); vf_pp_descr->enable_fractional_ds = true; IA_CSS_LEAVE_PRIVATE(""); }
bool ia_css_pipeline_is_mapped(unsigned int key) { bool ret = false; IA_CSS_ENTER_PRIVATE("key = %d", key); if ((key >= IA_CSS_PIPELINE_NUM_MAX) || (key >= IA_CSS_PIPE_ID_NUM)) { IA_CSS_ERROR("Invalid key!!"); IA_CSS_LEAVE_PRIVATE("return = %d", false); return false; } ret = (bool)(pipeline_num_to_sp_thread_map[key] != (unsigned)PIPELINE_NUM_UNMAPPED); IA_CSS_LEAVE_PRIVATE("return = %d", ret); return ret; }
/** @brief destroy a pipeline * * @param[in] pipeline * @return None * */ void ia_css_pipeline_destroy(struct ia_css_pipeline *pipeline) { assert(pipeline != NULL); IA_CSS_ENTER_PRIVATE("pipeline = %p", pipeline); if (pipeline == NULL) { IA_CSS_ERROR("NULL input parameter"); IA_CSS_LEAVE_PRIVATE("void"); return; } IA_CSS_LOG("pipe_num = %d", pipeline->pipe_num); /* Free the pipeline number */ ia_css_pipeline_clean(pipeline); IA_CSS_LEAVE_PRIVATE("void"); }
void ia_css_bufq_init(void) { int i, j; IA_CSS_ENTER_PRIVATE(""); /* Setup all the local queue descriptors for Host2SP Buffer Queues */ for (i = 0; i < SH_CSS_MAX_SP_THREADS; i++) for (j = 0; j < SH_CSS_MAX_NUM_QUEUES; j++) { init_bufq((uint32_t)offsetof(struct host_sp_queues, host2sp_buffer_queues_desc[i][j]), (uint32_t)offsetof(struct host_sp_queues, host2sp_buffer_queues_elems[i][j]), &css_queues.host2sp_buffer_queue_handles[i][j]); } /* Setup all the local queue descriptors for SP2Host Buffer Queues */ for (i = 0; i < SH_CSS_MAX_NUM_QUEUES; i++) { init_bufq(offsetof(struct host_sp_queues, sp2host_buffer_queues_desc[i]), offsetof(struct host_sp_queues, sp2host_buffer_queues_elems[i]), &css_queues.sp2host_buffer_queue_handles[i]); } /* Host2SP event queue*/ init_bufq((uint32_t)offsetof(struct host_sp_queues, host2sp_psys_event_queue_desc), (uint32_t)offsetof(struct host_sp_queues, host2sp_psys_event_queue_elems), &css_queues.host2sp_psys_event_queue_handle); /* SP2Host event queue */ init_bufq((uint32_t)offsetof(struct host_sp_queues, sp2host_psys_event_queue_desc), (uint32_t)offsetof(struct host_sp_queues, sp2host_psys_event_queue_elems), &css_queues.sp2host_psys_event_queue_handle); #if !defined(HAS_NO_INPUT_SYSTEM) /* Host2SP ISYS event queue */ init_bufq((uint32_t)offsetof(struct host_sp_queues, host2sp_isys_event_queue_desc), (uint32_t)offsetof(struct host_sp_queues, host2sp_isys_event_queue_elems), &css_queues.host2sp_isys_event_queue_handle); /* SP2Host ISYS event queue*/ init_bufq((uint32_t)offsetof(struct host_sp_queues, sp2host_isys_event_queue_desc), (uint32_t)offsetof(struct host_sp_queues, sp2host_isys_event_queue_elems), &css_queues.sp2host_isys_event_queue_handle); #endif /* Host2SP tagger command queue */ init_bufq((uint32_t)offsetof(struct host_sp_queues, host2sp_tag_cmd_queue_desc), (uint32_t)offsetof(struct host_sp_queues, host2sp_tag_cmd_queue_elems), &css_queues.host2sp_tag_cmd_queue_handle); /* Host2SP Unlock Raw Buffer message queue */ init_bufq((uint32_t)offsetof(struct host_sp_queues, host2sp_unlock_raw_buff_msg_queue_desc), (uint32_t)offsetof(struct host_sp_queues, host2sp_unlock_raw_buff_msg_queue_elems), &css_queues.host2sp_unlock_raw_buff_msg_queue_handle); IA_CSS_LEAVE_PRIVATE(""); }
void ia_css_frame_free(struct ia_css_frame *frame) { IA_CSS_ENTER_PRIVATE("frame = %p", frame); if (frame != NULL) { mmgr_free(frame->data); sh_css_free(frame); } IA_CSS_LEAVE_PRIVATE("void"); }
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 == 1) /* * [email protected] * * TODO * - Check with the ISP engineers to see whether "pre_de" needs * the valid input argument "original_in_info" or not. */ pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_PRE_ISP, pre_de_descr, NULL, in_info, out_infos, NULL); else { /* * [email protected] * * TODO * - Check with the ISP engineers to see whether "pre_de" needs * the valid input argument "original_in_info" or not. */ pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_PRE_DE, pre_de_descr, NULL, 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_pipeline_clean(struct ia_css_pipeline *pipeline) { struct ia_css_pipeline_stage *s; assert(pipeline != NULL); IA_CSS_ENTER_PRIVATE("pipeline = %p", pipeline); if (pipeline == NULL) { IA_CSS_ERROR("NULL input parameter"); IA_CSS_LEAVE_PRIVATE("void"); return; } s = pipeline->stages; while (s) { struct ia_css_pipeline_stage *next = s->next; pipeline_stage_destroy(s); s = next; } pipeline_init_defaults(pipeline, pipeline->pipe_id, pipeline->pipe_num, pipeline->dvs_frame_delay); IA_CSS_LEAVE_PRIVATE("void"); }
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; /* * [email protected] * * TODO * - Check with the ISP engineers to see whether "capture_pp" needs * the valid input argument "original_in_info" or not. */ pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_CAPTURE_PP, capture_pp_descr, NULL, in_info, out_infos, vf_info); capture_pp_descr->enable_fractional_ds = true; capture_pp_descr->enable_xnr = pipe->config.default_capture_config.enable_xnr != 0; IA_CSS_LEAVE_PRIVATE(""); }
void ia_css_pipe_get_yuvscaler_binarydesc( struct ia_css_pipe * 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]; 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 */ /* * [email protected] * * TODO * - Check with the ISP engineers to see whether "yuv_scalar" * needs the valid input argument "original_in_info" or not. */ pipe_binarydesc_get_offline(pipe, IA_CSS_BINARY_MODE_CAPTURE_PP, yuv_scaler_descr, NULL, in_info, out_infos, (vf_info->res.width == 0 && vf_info->res.height == 0) ? NULL : vf_info); yuv_scaler_descr->enable_fractional_ds = true; IA_CSS_LEAVE_PRIVATE(""); }
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(""); }