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; 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; }
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_handle_core_recoverable_errors( struct ddl_client_context_type *p_ddl) { struct ddl_context_type *p_ddl_context = p_ddl->p_ddl_context; u32 vcd_status = VCD_S_SUCCESS; u32 vcd_event = VCD_EVT_RESP_INPUT_DONE; u32 b_eos = FALSE, b_status = FALSE; if ((p_ddl->e_cmd_state == DDL_CMD_DECODE_FRAME) || (p_ddl->e_cmd_state == DDL_CMD_ENCODE_FRAME) || (p_ddl->e_cmd_state == DDL_CMD_HEADER_PARSE)) { if (p_ddl_context->n_cmd_err_status == VIDC_1080P_ERROR_NON_PAIRED_FIELD_NOT_SUPPORTED) { ddl_handle_npf_decoding_error(p_ddl); b_status = TRUE; } else { switch (p_ddl_context->n_cmd_err_status) { case VIDC_1080P_ERROR_HEADER_NOT_FOUND: if (p_ddl->e_client_state != DDL_CLIENT_WAIT_FOR_INITCODECDONE){ DDL_MSG_ERROR("VIDC_CRITICAL_HEADER"); DDL_MSG_ERROR("Unrecoverable error"); } else { DDL_MSG_ERROR("VIDC_HDR_PARSE_FAIL"); vcd_event = VCD_EVT_RESP_START; vcd_status = VCD_ERR_NO_SEQ_HDR; p_ddl->codec_data.decoder.\ b_header_in_start = FALSE; } break; case VIDC_1080P_ERROR_SYNC_POINT_NOT_RECEIVED: vcd_status = VCD_ERR_IFRAME_EXPECTED; break; case VIDC_1080P_ERROR_NO_BUFFER_RELEASED_FROM_HOST: { u32 n_pending_display = 0, n_release_mask; n_release_mask = p_ddl->codec_data.decoder.\ dpb_mask.n_hw_mask; while (n_release_mask > 0) { if (n_release_mask & 0x1) n_pending_display++; n_release_mask >>= 1; } if (n_pending_display >= p_ddl->codec_data.\ decoder.n_min_dpb_num) { DDL_MSG_ERROR("VIDC_FW_ISSUE_REQ_BUF"); ddl_client_fatal_cb(p_ddl); b_status = TRUE; } else { vcd_event = VCD_EVT_RESP_OUTPUT_REQ; DDL_MSG_LOW("VIDC_OUTPUT_BUF_REQ!!"); } } break; case VIDC_1080P_ERROR_BIT_STREAM_BUF_EXHAUST: case VIDC_1080P_ERROR_MB_HEADER_NOT_DONE: case VIDC_1080P_ERROR_MB_COEFF_NOT_DONE: case VIDC_1080P_ERROR_CODEC_SLICE_NOT_DONE: case VIDC_1080P_ERROR_VIDC_CORE_TIME_OUT: case VIDC_1080P_ERROR_VC1_BITPLANE_DECODE_ERR: case VIDC_1080P_ERROR_RESOLUTION_MISMATCH: case VIDC_1080P_ERROR_NV_QUANT_ERR: case VIDC_1080P_ERROR_SYNC_MARKER_ERR: case VIDC_1080P_ERROR_FEATURE_NOT_SUPPORTED: case VIDC_1080P_ERROR_MEM_CORRUPTION: case VIDC_1080P_ERROR_INVALID_REFERENCE_FRAME: case VIDC_1080P_ERROR_PICTURE_CODING_TYPE_ERR: case VIDC_1080P_ERROR_MV_RANGE_ERR: case VIDC_1080P_ERROR_PICTURE_STRUCTURE_ERR: case VIDC_1080P_ERROR_SLICE_ADDR_INVALID: case VIDC_1080P_ERROR_NON_FRAME_DATA_RECEIVED: case VIDC_1080P_ERROR_INCOMPLETE_FRAME: case VIDC_1080P_ERROR_NALU_HEADER_ERROR: case VIDC_1080P_ERROR_SPS_PARSE_ERROR: case VIDC_1080P_ERROR_PPS_PARSE_ERROR: case VIDC_1080P_ERROR_SLICE_PARSE_ERROR: vcd_status = VCD_ERR_BITSTREAM_ERR; DDL_MSG_ERROR("VIDC_BIT_STREAM_ERR"); break; default: break; } if (((!vcd_status) || (vcd_event != VCD_EVT_RESP_INPUT_DONE)) && !b_status) { p_ddl->input_frame.b_frm_trans_end = TRUE; b_eos = ((vcd_event == VCD_EVT_RESP_INPUT_DONE) && (p_ddl->input_frame.vcd_frm.n_flags & VCD_FRAME_FLAG_EOS)); if ((p_ddl->b_decoding && b_eos) || !p_ddl->b_decoding) p_ddl->input_frame.b_frm_trans_end = FALSE; if ((vcd_event == VCD_EVT_RESP_INPUT_DONE || vcd_event == VCD_EVT_RESP_START) && p_ddl->b_decoding && !p_ddl->codec_data.decoder.\ b_header_in_start && !p_ddl->codec_data.decoder.\ dec_disp_info.n_img_size_x && !p_ddl->codec_data.decoder.\ dec_disp_info.n_img_size_y) { vcd_status = VCD_S_SUCCESS; p_ddl->input_frame.vcd_frm.n_flags |= VCD_FRAME_FLAG_CODECCONFIG; p_ddl->input_frame.b_frm_trans_end = !b_eos; p_ddl->codec_data.decoder.\ dec_disp_info.n_img_size_x = 0xff; } ddl_input_failed_cb(p_ddl, vcd_event, vcd_status); if (!p_ddl->b_decoding) { p_ddl->output_frame.b_frm_trans_end = !b_eos; p_ddl->output_frame.vcd_frm.\ n_data_len = 0; p_ddl_context->ddl_callback( VCD_EVT_RESP_OUTPUT_DONE, VCD_ERR_FAIL, &p_ddl->output_frame, sizeof(struct ddl_frame_data_type_tag), (u32 *)p_ddl, p_ddl->p_client_data); if (b_eos) { DDL_MSG_LOW( "VIDC_ENC_EOS_DONE"); p_ddl_context->ddl_callback( VCD_EVT_RESP_EOS_DONE, VCD_S_SUCCESS, NULL, 0, (u32 *)p_ddl, p_ddl->p_client_data); } } if (p_ddl->b_decoding && b_eos) ddl_vidc_decode_eos_run(p_ddl); else ddl_release_command_channel( p_ddl_context, p_ddl->n_command_channel); b_status = TRUE; } } } return b_status; }