static u32 ddl_eos_frame_done_callback( struct ddl_client_context *ddl) { struct ddl_context *ddl_context = ddl->ddl_context; struct ddl_decoder_data *decoder = &ddl->codec_data.decoder; struct ddl_mask *dpb_mask = &decoder->dpb_mask; u32 ret_status = true, rsl_chg; enum vidc_1080p_display_status disp_status; if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE)) { DDL_MSG_ERROR("STATE-CRITICAL-EOSFRMRUN"); ddl_client_fatal_cb(ddl); } else { DDL_MSG_LOW("EOS_FRM_RUN_DONE"); ddl->cmd_state = DDL_CMD_INVALID; get_dec_status(&ddl->codec_data.decoder.dec_disp_info, ddl->codec_data.decoder.output_order, &disp_status, &rsl_chg); ddl_vidc_decode_dynamic_property(ddl, false); if (disp_status == VIDC_1080P_DISPLAY_STATUS_DPB_EMPTY) { ddl_decoder_eos_done_callback(ddl); } else { struct vidc_1080p_dec_frame_start_param dec_param; ret_status = false; if (disp_status == VIDC_1080P_DISPLAY_STATUS_DISPLAY_ONLY) { if (ddl_decoder_output_done_callback( ddl, false)) ret_status = true; } else if (disp_status != VIDC_1080P_DISPLAY_STATUS_NOOP) DDL_MSG_ERROR("EOS-STATE-CRITICAL-" "WRONG-DISP-STATUS"); if (!ret_status) { ddl_decoder_dpb_transact(decoder, NULL, DDL_DPB_OP_SET_MASK); ddl->cmd_state = DDL_CMD_EOS; memset(&dec_param, 0, sizeof(dec_param)); dec_param.cmd_seq_num = ++ddl_context->cmd_seq_num; dec_param.inst_id = ddl->instance_id; dec_param.shared_mem_addr_offset = DDL_ADDR_OFFSET( ddl_context->dram_base_a, ddl->shared_mem[ddl->command_channel]); dec_param.release_dpb_bit_mask = dpb_mask->hw_mask; dec_param.decode = VIDC_1080P_DEC_TYPE_LAST_FRAME_DATA; ddl_context->vidc_decode_frame_start[ddl->\ command_channel](&dec_param); } } } return ret_status; }
static void ddl_handle_npf_decoding_error(struct ddl_client_context_type *p_ddl) { struct vidc_1080p_dec_disp_info_type *p_dec_disp_info = &(p_ddl->codec_data.decoder.dec_disp_info); if (!p_ddl->b_decoding) { DDL_MSG_ERROR("VIDC_FW_ISSUE_ENC_NPF"); ddl_client_fatal_cb(p_ddl); } else { vidc_sm_get_frame_tags( &p_ddl->shared_mem[p_ddl->n_command_channel], &p_dec_disp_info->n_tag_top, &p_dec_disp_info->n_tag_bottom); ddl_vidc_decode_dynamic_property(p_ddl, FALSE); p_ddl->output_frame.vcd_frm.n_ip_frm_tag = p_dec_disp_info->n_tag_top; p_ddl->output_frame.vcd_frm.p_physical = NULL; p_ddl->output_frame.vcd_frm.p_virtual = NULL; p_ddl->output_frame.b_frm_trans_end = FALSE; p_ddl->p_ddl_context->ddl_callback(VCD_EVT_RESP_OUTPUT_DONE, VCD_ERR_INTRLCD_FIELD_DROP, &(p_ddl->output_frame), sizeof(struct ddl_frame_data_type_tag), (u32 *) p_ddl, p_ddl->p_client_data); ddl_vidc_decode_frame_run(p_ddl); } }
static void ddl_input_failed_cb(struct ddl_client_context_type *p_ddl, u32 vcd_event, u32 vcd_status) { struct ddl_context_type *p_ddl_context = p_ddl->p_ddl_context; u32 n_payload_size = sizeof(struct ddl_frame_data_type_tag); p_ddl->e_cmd_state = DDL_CMD_INVALID; if (p_ddl->b_decoding) ddl_vidc_decode_dynamic_property(p_ddl, FALSE); else ddl_vidc_encode_dynamic_property(p_ddl, FALSE); if (p_ddl->e_client_state == DDL_CLIENT_WAIT_FOR_INITCODECDONE) { n_payload_size = 0; DDL_MSG_LOW("ddl_state_transition: %s ~~> " "DDL_CLIENT_WAIT_FOR_INITCODEC", ddl_get_state_string(p_ddl->e_client_state)); p_ddl->e_client_state = DDL_CLIENT_WAIT_FOR_INITCODEC; } else { DDL_MSG_LOW("ddl_state_transition: %s ~~> " "DDL_CLIENT_WAIT_FOR_FRAME", ddl_get_state_string(p_ddl->e_client_state)); p_ddl->e_client_state = DDL_CLIENT_WAIT_FOR_FRAME; } p_ddl_context->ddl_callback(vcd_event, vcd_status, &p_ddl->input_frame, n_payload_size, (u32 *)p_ddl, p_ddl->p_client_data); }
void ddl_client_fatal_cb(struct ddl_client_context_type *p_ddl) { struct ddl_context_type *p_ddl_context = p_ddl->p_ddl_context; if (p_ddl->e_cmd_state == DDL_CMD_DECODE_FRAME) ddl_vidc_decode_dynamic_property(p_ddl, FALSE); else if (p_ddl->e_cmd_state == DDL_CMD_ENCODE_FRAME) ddl_vidc_encode_dynamic_property(p_ddl, FALSE); p_ddl->e_cmd_state = DDL_CMD_INVALID; DDL_MSG_LOW("ddl_state_transition: %s ~~> DDL_CLIENT_FAVIDC_ERROR", ddl_get_state_string(p_ddl->e_client_state)); p_ddl->e_client_state = DDL_CLIENT_FAVIDC_ERROR; p_ddl_context->ddl_callback(VCD_EVT_IND_HWERRFATAL, VCD_ERR_CLIENT_FATAL, NULL, 0, (u32 *)p_ddl, p_ddl->p_client_data); ddl_release_command_channel(p_ddl_context, p_ddl->n_command_channel); }
static u32 ddl_decoder_frame_run_callback(struct ddl_client_context *ddl) { struct ddl_context *ddl_context = ddl->ddl_context; struct ddl_decoder_data *decoder = &ddl->codec_data.decoder; u32 callback_end = false, ret_status = false; u32 eos_present = false, rsl_chg; u32 more_field_needed, extended_rsl_chg; enum vidc_1080p_display_status disp_status; DDL_MSG_MED("ddl_decoder_frame_run_callback"); if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_FRAME_DONE)) { DDL_MSG_ERROR("STATE-CRITICAL-DECFRMRUN"); ddl_client_fatal_cb(ddl); ret_status = true; } else { DDL_MSG_LOW("DEC_FRM_RUN_DONE"); ddl->cmd_state = DDL_CMD_INVALID; get_dec_status(ddl, &ddl->codec_data.decoder.dec_disp_info, ddl->codec_data.decoder.output_order, &disp_status, &rsl_chg); vidc_sm_get_extended_decode_status( &ddl->shared_mem[ddl->command_channel], &more_field_needed, &extended_rsl_chg); decoder->field_needed_for_prev_ip = more_field_needed; decoder->prev_ip_frm_tag = ddl->input_frame.vcd_frm.ip_frm_tag; ddl_vidc_decode_dynamic_property(ddl, false); if (rsl_chg != DDL_RESL_CHANGE_NO_CHANGE) { ddl_handle_reconfig(rsl_chg, ddl); ret_status = false; } else { if ((VCD_FRAME_FLAG_EOS & ddl->input_frame.vcd_frm.flags)) { callback_end = false; eos_present = true; } if (disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_ONLY || disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY) { if (!eos_present) callback_end = (disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_ONLY); ddl_decoder_input_done_callback(ddl, callback_end); } if (disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY || disp_status == VIDC_1080P_DISPLAY_STATUS_DISPLAY_ONLY) { if (!eos_present) callback_end = (disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY); if (ddl_decoder_output_done_callback( ddl, callback_end)) ret_status = true; } if (!ret_status) { if (disp_status == VIDC_1080P_DISPLAY_STATUS_DISPLAY_ONLY || disp_status == VIDC_1080P_DISPLAY_STATUS_DPB_EMPTY || disp_status == VIDC_1080P_DISPLAY_STATUS_NOOP) { ddl_vidc_decode_frame_run(ddl); } else if (eos_present) ddl_vidc_decode_eos_run(ddl); else { ddl->client_state = DDL_CLIENT_WAIT_FOR_FRAME; ddl_release_command_channel(ddl_context, ddl->command_channel); ret_status = true; } } } } return ret_status; }
static u32 ddl_decoder_frame_run_callback( struct ddl_client_context *ddl) { struct ddl_context *ddl_context = ddl->ddl_context; struct vidc_1080p_dec_disp_info *dec_disp_info = &ddl->codec_data.decoder.dec_disp_info; u32 callback_end = false, ret_status = true, eos_present = false; DDL_MSG_MED("ddl_decoder_frame_run_callback"); if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_FRAME_DONE)) { DDL_MSG_ERROR("STATE-CRITICAL-DECFRMRUN"); ddl_client_fatal_cb(ddl); } else { DDL_MSG_LOW("DEC_FRM_RUN_DONE"); ddl->cmd_state = DDL_CMD_INVALID; vidc_1080p_get_display_frame_result(dec_disp_info); ddl_vidc_decode_dynamic_property(ddl, false); if (dec_disp_info->resl_change) { DDL_MSG_ERROR("DEC_RECONFIG_NOT_SUPPORTED"); ddl_client_fatal_cb(ddl); } else { if ((VCD_FRAME_FLAG_EOS & ddl->input_frame.vcd_frm.flags)) { callback_end = false; eos_present = true; } if (dec_disp_info->display_status == VIDC_1080P_DISPLAY_STATUS_DECODE_ONLY || dec_disp_info->display_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY) { if (!eos_present) callback_end = (dec_disp_info->display_status == VIDC_1080P_DISPLAY_STATUS_DECODE_ONLY); ddl_decoder_input_done_callback(ddl, callback_end); } if (dec_disp_info->display_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY || dec_disp_info->display_status == VIDC_1080P_DISPLAY_STATUS_DISPLAY_ONLY) { u32 vcd_status; if (!eos_present) callback_end = (dec_disp_info->\ display_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY); vcd_status = ddl_decoder_ouput_done_callback( ddl, callback_end); if (vcd_status) return true; } if (dec_disp_info->display_status == VIDC_1080P_DISPLAY_STATUS_DISPLAY_ONLY || dec_disp_info->display_status == VIDC_1080P_DISPLAY_STATUS_DPB_EMPTY) { ddl_vidc_decode_frame_run(ddl); ret_status = false; } else if (eos_present) { ddl_vidc_decode_eos_run(ddl); ret_status = false; } else { ddl->client_state = DDL_CLIENT_WAIT_FOR_FRAME; ddl_release_command_channel(ddl_context, ddl->command_channel); } } } return ret_status; }
static u32 ddl_decoder_frame_run_callback(struct ddl_client_context *ddl) { struct ddl_context *ddl_context = ddl->ddl_context; u32 callback_end = false, ret_status = false; u32 eos_present = false, rsl_chg; enum vidc_1080p_display_status disp_status; DDL_MSG_MED("ddl_decoder_frame_run_callback"); if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_FRAME_DONE)) { DDL_MSG_ERROR("STATE-CRITICAL-DECFRMRUN"); ddl_client_fatal_cb(ddl); ret_status = true; } else { DDL_MSG_LOW("DEC_FRM_RUN_DONE"); ddl->cmd_state = DDL_CMD_INVALID; get_dec_status(&ddl->codec_data.decoder.dec_disp_info, ddl->codec_data.decoder.output_order, &disp_status, &rsl_chg); ddl_vidc_decode_dynamic_property(ddl, false); if (rsl_chg) { DDL_MSG_ERROR("DEC_RECONFIG_NOT_SUPPORTED"); ddl_client_fatal_cb(ddl); #if (1) //PANTECH Qualcomm SBA Àû¿ë: Case No.517406 ret_status = true; #endif } else { if ((VCD_FRAME_FLAG_EOS & ddl->input_frame.vcd_frm.flags)) { callback_end = false; eos_present = true; } if (disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_ONLY || disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY) { if (!eos_present) callback_end = (disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_ONLY); ddl_decoder_input_done_callback(ddl, callback_end); } if (disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY || disp_status == VIDC_1080P_DISPLAY_STATUS_DISPLAY_ONLY) { if (!eos_present) callback_end = (disp_status == VIDC_1080P_DISPLAY_STATUS_DECODE_AND_DISPLAY); if (ddl_decoder_output_done_callback( ddl, callback_end)) ret_status = true; } if (!ret_status) { if (disp_status == VIDC_1080P_DISPLAY_STATUS_DISPLAY_ONLY || disp_status == VIDC_1080P_DISPLAY_STATUS_DPB_EMPTY || disp_status == VIDC_1080P_DISPLAY_STATUS_NOOP) { ddl_vidc_decode_frame_run(ddl); } else if (eos_present) ddl_vidc_decode_eos_run(ddl); else { ddl->client_state = DDL_CLIENT_WAIT_FOR_FRAME; ddl_release_command_channel(ddl_context, ddl->command_channel); ret_status = true; } } } } return ret_status; }