Beispiel #1
0
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 vidc_1080p_dec_disp_info *dec_disp_info =
		&decoder->dec_disp_info;
	struct ddl_mask *dpb_mask = &decoder->dpb_mask;
	u32 ret_status = true;

	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;
		vidc_1080p_get_display_frame_result(dec_disp_info);
		ddl_vidc_decode_dynamic_property(ddl, false);
		if (dec_disp_info->display_status ==
			VIDC_1080P_DISPLAY_STATUS_DPB_EMPTY) {
			ddl_decoder_eos_done_callback(ddl);
		} else {
			struct vidc_1080p_dec_frame_start_param dec_param;
			if (dec_disp_info->display_status ==
				VIDC_1080P_DISPLAY_STATUS_DISPLAY_ONLY) {
				u32 vcd_status;

				vcd_status = ddl_decoder_ouput_done_callback(
					ddl, false);
				if (vcd_status)
					return true;
			} else
				DDL_MSG_ERROR("EOS-STATE-CRITICAL-"
					"WRONG-DISP-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);
			ret_status = false;
		}
	}
	return ret_status;
}
static void get_dec_status(struct vidc_1080p_dec_disp_info *dec_disp_info,
	u32 output_order, u32 *status, u32 *rsl_chg)
{
	if (output_order == VCD_DEC_ORDER_DISPLAY) {
		vidc_1080p_get_display_frame_result(dec_disp_info);
		*status = dec_disp_info->display_status;
		*rsl_chg = dec_disp_info->disp_resl_change;
	} else {
		vidc_1080p_get_decode_frame_result(dec_disp_info);
		*status = dec_disp_info->decode_status;
		*rsl_chg = dec_disp_info->dec_resl_change;
	}
}
static void get_dec_status(struct ddl_client_context *ddl,
	 struct vidc_1080p_dec_disp_info *dec_disp_info,
	u32 output_order, u32 *status, u32 *rsl_chg)
{
	if (output_order == VCD_DEC_ORDER_DISPLAY) {
		vidc_1080p_get_display_frame_result(dec_disp_info);
		*status = dec_disp_info->display_status;
		*rsl_chg = dec_disp_info->disp_resl_change;
	} else {
		vidc_1080p_get_decode_frame_result(dec_disp_info);
		vidc_sm_get_dec_order_resl(
			&ddl->shared_mem[ddl->command_channel],
			&dec_disp_info->img_size_x,
			&dec_disp_info->img_size_y);
		*status = dec_disp_info->decode_status;
		*rsl_chg = dec_disp_info->dec_resl_change;
	}
}
Beispiel #4
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;
}