void ddl_client_fatal_cb(struct ddl_context *ddl_context) { struct ddl_client_context *ddl = ddl_context->current_ddl; if (ddl_context->cmd_state == DDL_CMD_DECODE_FRAME) ddl_decode_dynamic_property(ddl, false); else if (ddl_context->cmd_state == DDL_CMD_ENCODE_FRAME) ddl_encode_dynamic_property(ddl, false); ddl_move_command_state(ddl_context, DDL_CMD_INVALID); ddl_move_client_state(ddl, DDL_CLIENT_FATAL_ERROR); ddl_context->ddl_callback ( VCD_EVT_IND_HWERRFATAL, VCD_ERR_CLIENT_FATAL, NULL, 0, (void *)ddl, ddl_context->client_data ); DDL_IDLE(ddl_context); }
static u32 ddl_eos_frame_done_callback(struct ddl_context *ddl_context) { struct ddl_client_context *ddl = ddl_context->current_ddl; struct ddl_decoder_data *decoder = &(ddl->codec_data.decoder); struct vidc_720p_dec_disp_info *dec_disp_info = &(decoder->dec_disp_info); if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE)) { VIDC_LOGERR_STRING("STATE-CRITICAL-EOSFRMRUN"); ddl_client_fatal_cb(ddl_context); return true; } VIDC_LOG_STRING("EOS_FRM_RUN_DONE"); ddl_move_command_state(ddl_context, DDL_CMD_INVALID); vidc_720p_decode_display_info(dec_disp_info); ddl_decode_dynamic_property(ddl, false); if (dec_disp_info->disp_status == VIDC_720P_DISPLAY_ONLY) { if (ddl_decoder_output_done_callback(ddl, false) != VCD_S_SUCCESS) return true; } else VIDC_LOG_STRING("STATE-CRITICAL-WRONG-DISP-STATUS"); ddl_decoder_dpb_transact(decoder, NULL, DDL_DPB_OP_SET_MASK); ddl_move_command_state(ddl_context, DDL_CMD_EOS); vidc_720p_submit_command(ddl->channel_id, VIDC_720P_CMD_FRAMERUN); return false; }
void ddl_release_client_internal_buffers(struct ddl_client_context_type *p_ddl) { if (p_ddl->b_decoding) { struct ddl_decoder_data_type *p_decoder = &(p_ddl->codec_data.decoder); ddl_pmem_free(p_decoder->h264Vsp_temp_buffer); ddl_pmem_free(p_decoder->dpb_comv_buffer); ddl_pmem_free(p_decoder->ref_buffer); DDL_FREE(p_decoder->dp_buf.a_dec_pic_buffers); ddl_decode_dynamic_property(p_ddl, FALSE); p_decoder->decode_config.n_sequence_header_len = 0; p_decoder->decode_config.p_sequence_header = NULL; p_decoder->dpb_mask.n_client_mask = 0; p_decoder->dpb_mask.n_hw_mask = 0; p_decoder->dp_buf.n_no_of_dec_pic_buf = 0; p_decoder->n_dynamic_prop_change = 0; } else { struct ddl_encoder_data_type *p_encoder = &(p_ddl->codec_data.encoder); ddl_pmem_free(p_encoder->enc_dpb_addr); ddl_pmem_free(p_encoder->seq_header); ddl_encode_dynamic_property(p_ddl, FALSE); p_encoder->n_dynamic_prop_change = 0; } }
u32 ddl_handle_seqhdr_fail_error(struct ddl_context *ddl_context) { struct ddl_client_context *ddl = ddl_context->current_ddl; struct ddl_decoder_data *decoder = &ddl->codec_data.decoder; u32 status = false; if (ddl_context->cmd_state == DDL_CMD_HEADER_PARSE && DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_INITCODECDONE)) { switch (ddl_context->cmd_err_status) { case UNSUPPORTED_FEATURE_IN_PROFILE: case HEADER_NOT_FOUND: case INVALID_SPS_ID: case INVALID_PPS_ID: case RESOLUTION_NOT_SUPPORTED: ERR("SEQ-HDR-FAILED!!!"); if ((ddl_context->cmd_err_status == RESOLUTION_NOT_SUPPORTED) && (decoder->codec.codec == VCD_CODEC_H264 || decoder->codec.codec == VCD_CODEC_H263 || decoder->codec.codec == VCD_CODEC_MPEG4 || decoder->codec.codec == VCD_CODEC_VC1_RCV || decoder->codec.codec == VCD_CODEC_VC1)) { ddl_client_fatal_cb(ddl_context); status = true; break; } if (decoder->header_in_start) { decoder->header_in_start = false; ddl_context->ddl_callback(VCD_EVT_RESP_START, VCD_ERR_SEQHDR_PARSE_FAIL, NULL, 0, (void *)ddl, ddl_context->client_data); } else { if (ddl->input_frame.vcd_frm.flags & VCD_FRAME_FLAG_EOS) ddl->input_frame.frm_trans_end = false; else ddl->input_frame.frm_trans_end = true; ddl_decode_dynamic_property(ddl, false); ddl_context->ddl_callback( VCD_EVT_RESP_INPUT_DONE, VCD_ERR_SEQHDR_PARSE_FAIL, &ddl->input_frame, sizeof(struct ddl_frame_data_tag), (void *)ddl, ddl_context->client_data); if (ddl->input_frame.vcd_frm.flags & VCD_FRAME_FLAG_EOS) ddl_context->ddl_callback( VCD_EVT_RESP_EOS_DONE, VCD_S_SUCCESS, NULL, 0, (void *)ddl, ddl_context->client_data); } ddl_move_client_state(ddl, DDL_CLIENT_WAIT_FOR_INITCODEC); DDL_IDLE(ddl_context); status = true; } } return status; }
static void ddl_eos_done_callback(struct ddl_context_type *p_ddl_context) { struct ddl_client_context_type *p_ddl = p_ddl_context->p_current_ddl; u32 n_displaystatus; if (!DDLCOMMAND_STATE_IS(p_ddl_context, DDL_CMD_EOS)) { VIDC_LOGERR_STRING("UNKWN_EOSDONE"); ddl_client_fatal_cb(p_ddl_context); return; } if (!p_ddl || !p_ddl->b_decoding || !DDLCLIENT_STATE_IS(p_ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE) ) { VIDC_LOG_STRING("STATE-CRITICAL-EOSDONE"); ddl_client_fatal_cb(p_ddl_context); return; } ddl_move_command_state(p_ddl_context, DDL_CMD_INVALID); vidc_720p_eos_info(&n_displaystatus); if ((enum vidc_720p_display_status_type)n_displaystatus != VIDC_720P_EMPTY_BUFFER) { VIDC_LOG_STRING("EOSDONE-EMPTYBUF-ISSUE"); } ddl_decode_dynamic_property(p_ddl, FALSE); ddl_move_client_state(p_ddl, DDL_CLIENT_WAIT_FOR_FRAME); VIDC_LOG_STRING("EOS_DONE"); p_ddl_context->ddl_callback(VCD_EVT_RESP_EOS_DONE, VCD_S_SUCCESS, NULL, 0, (u32 *) p_ddl, p_ddl_context->p_client_data); DDL_IDLE(p_ddl_context); }
static u32 ddl_eos_done_callback(struct ddl_context *ddl_context) { struct ddl_client_context *ddl = ddl_context->current_ddl; u32 displaystatus, resl_change; if (!DDLCOMMAND_STATE_IS(ddl_context, DDL_CMD_EOS)) { VIDC_LOGERR_STRING("UNKWN_EOSDONE"); ddl_client_fatal_cb(ddl_context); return true; } if (!ddl || !ddl->decoding || !DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE) ) { VIDC_LOG_STRING("STATE-CRITICAL-EOSDONE"); ddl_client_fatal_cb(ddl_context); return true; } ddl_move_command_state(ddl_context, DDL_CMD_INVALID); vidc_720p_eos_info(&displaystatus, &resl_change); if ((enum vidc_720p_display_status)displaystatus != VIDC_720P_EMPTY_BUFFER) { VIDC_LOG_STRING("EOSDONE-EMPTYBUF-ISSUE"); } ddl_decode_dynamic_property(ddl, false); if (resl_change == 0x1) { ddl->codec_data.decoder.header_in_start = false; ddl->codec_data.decoder.decode_config.sequence_header = ddl->input_frame.vcd_frm.physical; ddl->codec_data.decoder.decode_config.sequence_header_len = ddl->input_frame.vcd_frm.data_len; ddl_decode_init_codec(ddl); return false; } ddl_move_client_state(ddl, DDL_CLIENT_WAIT_FOR_FRAME); VIDC_LOG_STRING("EOS_DONE"); ddl_context->ddl_callback(VCD_EVT_RESP_EOS_DONE, VCD_S_SUCCESS, NULL, 0, (u32 *) ddl, ddl_context->client_data); DDL_IDLE(ddl_context); return true; }
static void ddl_input_failed_cb(struct ddl_context *ddl_context, u32 vcd_event, u32 vcd_status) { struct ddl_client_context *ddl = ddl_context->current_ddl; ddl_move_command_state(ddl_context, DDL_CMD_INVALID); if (ddl->decoding) ddl_decode_dynamic_property(ddl, false); else ddl_encode_dynamic_property(ddl, false); ddl_context->ddl_callback(vcd_event, vcd_status, &ddl->input_frame, sizeof(struct ddl_frame_data_tag), (void *)ddl, ddl_context->client_data); ddl_move_client_state(ddl, DDL_CLIENT_WAIT_FOR_FRAME); }
void ddl_handle_npf_decoding_error(struct ddl_context *ddl_context) { struct ddl_client_context *ddl = ddl_context->current_ddl; struct ddl_decoder_data *decoder = &ddl->codec_data.decoder; if (!ddl->decoding) { ERR("FWISSUE-ENC-NPF!!!"); ddl_client_fatal_cb(ddl_context); return; } vidc_720p_decode_display_info(&decoder->dec_disp_info); ddl_decode_dynamic_property(ddl, false); ddl->output_frame.vcd_frm.ip_frm_tag = decoder->dec_disp_info.tag_top; ddl->output_frame.vcd_frm.physical = NULL; ddl->output_frame.frm_trans_end = false; ddl->ddl_context->ddl_callback( VCD_EVT_RESP_OUTPUT_DONE, VCD_ERR_INTRLCD_FIELD_DROP, &ddl->output_frame, sizeof(struct ddl_frame_data_tag), (void *)ddl, ddl->ddl_context->client_data); ddl_decode_frame_run(ddl); }
static u32 ddl_decoder_frame_run_callback(struct ddl_context *ddl_context) { struct ddl_client_context *ddl = ddl_context->current_ddl; struct vidc_720p_dec_disp_info *dec_disp_info = &(ddl->codec_data.decoder.dec_disp_info); u32 callback_end = false; u32 status = true, eos_present = false;; if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_FRAME_DONE)) { VIDC_LOG_STRING("STATE-CRITICAL-DECFRMRUN"); ddl_client_fatal_cb(ddl_context); return true; } VIDC_LOG_STRING("DEC_FRM_RUN_DONE"); ddl_move_command_state(ddl_context, DDL_CMD_INVALID); vidc_720p_decode_display_info(dec_disp_info); ddl_decode_dynamic_property(ddl, false); if (dec_disp_info->resl_change) { VIDC_LOG_STRING ("DEC_FRM_RUN_DONE: RECONFIG"); ddl_move_client_state(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE); ddl_move_command_state(ddl_context, DDL_CMD_EOS); vidc_720p_submit_command(ddl->channel_id, VIDC_720P_CMD_FRAMERUN_REALLOCATE); return false; } if ((VCD_FRAME_FLAG_EOS & ddl->input_frame.vcd_frm.flags)) { callback_end = false; eos_present = true; } if (dec_disp_info->disp_status == VIDC_720P_DECODE_ONLY || dec_disp_info->disp_status == VIDC_720P_DECODE_AND_DISPLAY) { if (!eos_present) callback_end = (dec_disp_info->disp_status == VIDC_720P_DECODE_ONLY); ddl_decoder_input_done_callback(ddl, callback_end); } if (dec_disp_info->disp_status == VIDC_720P_DECODE_AND_DISPLAY || dec_disp_info->disp_status == VIDC_720P_DISPLAY_ONLY) { if (!eos_present) callback_end = (dec_disp_info->disp_status == VIDC_720P_DECODE_AND_DISPLAY); if (ddl_decoder_output_done_callback(ddl, callback_end) != VCD_S_SUCCESS) return true; } if (dec_disp_info->disp_status == VIDC_720P_DISPLAY_ONLY || dec_disp_info->disp_status == VIDC_720P_EMPTY_BUFFER) { /* send the same input once again for decoding */ ddl_decode_frame_run(ddl); /* client need to ignore the interrupt */ status = false; } else if (eos_present) { /* send EOS command to HW */ ddl_decode_eos_run(ddl); /* client need to ignore the interrupt */ status = false; } else { ddl_move_client_state(ddl, DDL_CLIENT_WAIT_FOR_FRAME); /* move to Idle */ DDL_IDLE(ddl_context); } return status; }
static u32 ddl_decoder_frame_run_callback(struct ddl_context_type *p_ddl_context) { struct ddl_client_context_type *p_ddl = p_ddl_context->p_current_ddl; struct vidc_720p_dec_disp_info_type *p_dec_disp_info = &(p_ddl->codec_data.decoder.dec_disp_info); u32 b_callback_end = FALSE; u32 status = TRUE, eos_present = FALSE;; if (!DDLCLIENT_STATE_IS(p_ddl, DDL_CLIENT_WAIT_FOR_FRAME_DONE)) { VIDC_LOG_STRING("STATE-CRITICAL-DECFRMRUN"); ddl_client_fatal_cb(p_ddl_context); return TRUE; } VIDC_LOG_STRING("DEC_FRM_RUN_DONE"); ddl_move_command_state(p_ddl_context, DDL_CMD_INVALID); vidc_720p_decode_display_info(p_dec_disp_info); ddl_decode_dynamic_property(p_ddl, FALSE); if (p_dec_disp_info->n_resl_change) { VIDC_LOGERR_STRING ("ddl_dec_frm_done:Dec_reconfig_not_supported"); ddl_client_fatal_cb(p_ddl_context); return TRUE; } if ((VCD_FRAME_FLAG_EOS & p_ddl->input_frame.vcd_frm.n_flags)) { b_callback_end = FALSE; eos_present = TRUE; } if (p_dec_disp_info->e_disp_status == VIDC_720P_DECODE_ONLY || p_dec_disp_info->e_disp_status == VIDC_720P_DECODE_AND_DISPLAY) { if (!eos_present) b_callback_end = (p_dec_disp_info->e_disp_status == VIDC_720P_DECODE_ONLY); ddl_decoder_input_done_callback(p_ddl, b_callback_end); } if (p_dec_disp_info->e_disp_status == VIDC_720P_DECODE_AND_DISPLAY || p_dec_disp_info->e_disp_status == VIDC_720P_DISPLAY_ONLY) { if (!eos_present) b_callback_end = (p_dec_disp_info->e_disp_status == VIDC_720P_DECODE_AND_DISPLAY); if (ddl_decoder_output_done_callback(p_ddl, b_callback_end) != VCD_S_SUCCESS) return TRUE; } if (p_dec_disp_info->e_disp_status == VIDC_720P_DISPLAY_ONLY) { ddl_decode_frame_run(p_ddl); status = FALSE; } else if (eos_present) { ddl_decode_eos_run(p_ddl); status = FALSE; } else { ddl_move_client_state(p_ddl, DDL_CLIENT_WAIT_FOR_FRAME); DDL_IDLE(p_ddl_context); } return status; }