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;
}
Beispiel #3
0
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");
	}
}
Beispiel #4
0
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");
	}
}
Beispiel #6
0
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;
}