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;
}
示例#3
0
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;
}
示例#4
0
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;
}