static void ddl_encoder_eos_done(struct ddl_context *ddl_context) { struct ddl_client_context *ddl; u32 channel_inst_id; vidc_1080p_get_returned_channel_inst_id(&channel_inst_id); vidc_1080p_clear_returned_channel_inst_id(); ddl = ddl_get_current_ddl_client_for_channel_id(ddl_context, ddl_context->response_cmd_ch_id); if (!ddl || (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE))) { DDL_MSG_ERROR("STATE-CRITICAL-EOSFRMDONE"); ddl_client_fatal_cb(ddl); } else { struct ddl_encoder_data *encoder = &(ddl->codec_data.encoder); vidc_1080p_get_encode_frame_info(&encoder->enc_frame_info); ddl_handle_enc_frame_done(ddl); DDL_MSG_LOW("encoder_eos_done"); ddl->cmd_state = DDL_CMD_INVALID; DDL_MSG_LOW("ddl_state_transition: %s ~~>" "DDL_CLIENT_WAIT_FOR_FRAME", ddl_get_state_string(ddl->client_state)); ddl->client_state = DDL_CLIENT_WAIT_FOR_FRAME; DDL_MSG_LOW("eos_done"); ddl_context->ddl_callback(VCD_EVT_RESP_EOS_DONE, VCD_S_SUCCESS, NULL, 0, (u32 *)ddl, ddl->client_data); ddl_release_command_channel(ddl_context, ddl->command_channel); } }
static u32 ddl_dpb_buffers_set_done_callback( struct ddl_context *ddl_context) { struct ddl_client_context *ddl; u32 channel_inst_id, ret_status = true; DDL_MSG_MED("ddl_dpb_buffers_set_done_callback"); vidc_1080p_get_returned_channel_inst_id(&channel_inst_id); vidc_1080p_clear_returned_channel_inst_id(); ddl = ddl_get_current_ddl_client_for_command(ddl_context, DDL_CMD_DECODE_SET_DPB); if (ddl) { ddl->cmd_state = DDL_CMD_INVALID; if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_DPBDONE)) { DDL_MSG_ERROR("STATE-CRITICAL-DPBDONE"); ddl_client_fatal_cb(ddl); } else { DDL_MSG_LOW("INTR_DPBDONE"); DDL_MSG_LOW("ddl_state_transition: %s ~~>" "DDL_CLIENT_WAIT_FOR_FRAME", ddl_get_state_string(ddl->client_state)); if (vidc_msg_timing) { ddl_calc_core_proc_time(__func__, DEC_OP_TIME); ddl_reset_core_time_variables(DEC_OP_TIME); } ddl->client_state = DDL_CLIENT_WAIT_FOR_FRAME; ddl_vidc_decode_frame_run(ddl); ret_status = false; } } return ret_status; }
static void ddl_encoder_eos_done(struct ddl_context *ddl_context) { struct ddl_client_context *ddl; u32 channel_inst_id; DDL_MSG_LOW("encoder_eos_done"); vidc_1080p_get_returned_channel_inst_id(&channel_inst_id); vidc_1080p_clear_returned_channel_inst_id(); ddl = ddl_get_current_ddl_client_for_channel_id(ddl_context, ddl_context->response_cmd_ch_id); if (ddl) { if (DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE)) { DDL_MSG_LOW("ENC_EOS_DONE"); ddl->cmd_state = DDL_CMD_INVALID; DDL_MSG_LOW("ddl_state_transition: %s ~~>" "DDL_CLIENT_WAIT_FOR_FRAME", ddl_get_state_string(ddl->client_state)); ddl->client_state = DDL_CLIENT_WAIT_FOR_FRAME; DDL_MSG_LOW("EOS_DONE"); ddl->output_frame.frm_trans_end = true; ddl_context->ddl_callback(VCD_EVT_RESP_EOS_DONE, VCD_S_SUCCESS, &(ddl->output_frame), sizeof(struct ddl_frame_data_tag), (u32 *)ddl, ddl->client_data); } else { DDL_MSG_LOW("STATE-CRITICAL-EOSDONE"); } ddl_release_command_channel(ddl_context, ddl->command_channel); } else { DDL_MSG_LOW("Invalid Client DDL context"); } }
static u32 ddl_frame_run_callback(struct ddl_context *ddl_context) { struct ddl_client_context *ddl; u32 channel_inst_id; u32 return_status = true; vidc_1080p_get_returned_channel_inst_id(&channel_inst_id); vidc_1080p_clear_returned_channel_inst_id(); ddl = ddl_get_current_ddl_client_for_channel_id(ddl_context, ddl_context->response_cmd_ch_id); if (ddl) { if (ddl->cmd_state == DDL_CMD_DECODE_FRAME) return_status = ddl_decoder_frame_run_callback(ddl); else if (ddl->cmd_state == DDL_CMD_ENCODE_FRAME) ddl_encoder_frame_run_callback(ddl); else if (ddl->cmd_state == DDL_CMD_EOS) return_status = ddl_eos_frame_done_callback(ddl); else { DDL_MSG_ERROR("UNKWN_FRAME_DONE"); return_status = false; } } else return_status = false; return return_status; }
static void ddl_edfu_callback(struct ddl_context *ddl_context) { struct ddl_client_context *ddl; u32 channel_inst_id; DDL_MSG_MED("ddl_edfu_callback"); vidc_1080p_get_returned_channel_inst_id(&channel_inst_id); vidc_1080p_clear_returned_channel_inst_id(); ddl = ddl_get_current_ddl_client_for_channel_id(ddl_context, ddl_context->response_cmd_ch_id); if (ddl) { if (ddl->cmd_state != DDL_CMD_ENCODE_FRAME) DDL_MSG_LOW("UNKWN_EDFU"); } }
u32 ddl_handle_core_errors(struct ddl_context_type *p_ddl_context) { struct ddl_client_context_type *p_ddl; u32 n_channel_inst_id, b_status = FALSE; if (!p_ddl_context->n_cmd_err_status && !p_ddl_context->n_disp_pic_err_status) { DDL_MSG_ERROR("VIDC_NO_ERROR"); } else { vidc_1080p_get_returned_channel_inst_id(&n_channel_inst_id); vidc_1080p_clear_returned_channel_inst_id(); p_ddl = ddl_get_current_ddl_client_for_channel_id(p_ddl_context, p_ddl_context->n_response_cmd_ch_id); if (!p_ddl) { DDL_MSG_ERROR("VIDC_SPURIOUS_INTERRUPT_ERROR"); b_status = TRUE; } else { u32 b_disp_status; if (p_ddl_context->n_cmd_err_status) print_core_errors( p_ddl_context->n_cmd_err_status); if (p_ddl_context->n_disp_pic_err_status) print_core_errors( p_ddl_context->n_disp_pic_err_status); b_status = ddl_handle_core_warnings( p_ddl_context->n_cmd_err_status); b_disp_status = ddl_handle_core_warnings( p_ddl_context->n_disp_pic_err_status); if (!b_status && !b_disp_status) { DDL_MSG_ERROR("ddl_warning:Unknown"); b_status = ddl_handle_hw_fatal_errors(p_ddl); if (!b_status) b_status = ddl_handle_core_recoverable_errors( p_ddl); if (!b_status) b_status = ddl_handle_client_fatal_errors(p_ddl); } } } return b_status; }
static u32 ddl_frame_run_callback(struct ddl_context *ddl_context) { struct ddl_client_context *ddl; u32 channel_inst_id; u32 return_status = true; vidc_1080p_get_returned_channel_inst_id(&channel_inst_id); vidc_1080p_clear_returned_channel_inst_id(); ddl = ddl_get_current_ddl_client_for_channel_id(ddl_context, ddl_context->response_cmd_ch_id); if (ddl) { if (ddl_context->pix_cache_enable) { struct vidc_1080P_pix_cache_statistics pixel_cache_stats; vidc_pix_cache_get_statistics(&pixel_cache_stats); DDL_MSG_HIGH(" pixel cache hits = %d," "miss = %d", pixel_cache_stats.access_hit, pixel_cache_stats.access_miss); DDL_MSG_HIGH(" pixel cache core reqs = %d," "axi reqs = %d", pixel_cache_stats.core_req, pixel_cache_stats.axi_req); DDL_MSG_HIGH(" pixel cache core bus stats = %d," "axi bus stats = %d", pixel_cache_stats.core_bus, pixel_cache_stats.axi_bus); } if (ddl->cmd_state == DDL_CMD_DECODE_FRAME) return_status = ddl_decoder_frame_run_callback(ddl); else if (ddl->cmd_state == DDL_CMD_ENCODE_FRAME) ddl_encoder_frame_run_callback(ddl); else if (ddl->cmd_state == DDL_CMD_EOS) return_status = ddl_eos_frame_done_callback(ddl); else { DDL_MSG_ERROR("UNKWN_FRAME_DONE"); return_status = false; } } else return_status = false; return return_status; }
static u32 ddl_sequence_done_callback(struct ddl_context *ddl_context) { struct ddl_client_context *ddl; u32 channel_inst_id, ret; vidc_1080p_get_returned_channel_inst_id(&channel_inst_id); vidc_1080p_clear_returned_channel_inst_id(); ddl = ddl_get_current_ddl_client_for_channel_id(ddl_context, ddl_context->response_cmd_ch_id); if (!ddl) { DDL_MSG_ERROR("UNKWN_SEQ_DONE"); ret = true; } else { if (ddl->decoding) ret = ddl_decoder_seq_done_callback(ddl_context, ddl); else ret = ddl_encoder_seq_done_callback(ddl_context, ddl); } return ret; }