static u32 ddl_encoder_seq_done_callback(struct ddl_context *ddl_context, struct ddl_client_context *ddl) { struct ddl_encoder_data *encoder; DDL_MSG_MED("ddl_encoder_seq_done_callback"); if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_INITCODECDONE)) { DDL_MSG_ERROR("STATE-CRITICAL-INITCODEC"); ddl_client_fatal_cb(ddl); return true; } #ifdef DDL_PROFILE ddl_calc_core_time(1); #endif 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("INIT_CODEC_DONE"); encoder = &ddl->codec_data.encoder; vidc_1080p_get_encoder_sequence_header_size( &encoder->seq_header_length); if ((encoder->codec.codec == VCD_CODEC_H264) && (encoder->profile.profile == VCD_PROFILE_H264_BASELINE)) if ((encoder->seq_header.align_virtual_addr) && (encoder->seq_header_length > 6)) encoder->seq_header.align_virtual_addr[6] = 0xC0; ddl_context->ddl_callback(VCD_EVT_RESP_START, VCD_S_SUCCESS, NULL, 0, (u32 *) ddl, ddl->client_data); ddl_release_command_channel(ddl_context, ddl->command_channel); return true; }
static void ddl_encoder_frame_run_callback(struct ddl_context *ddl_context) { struct ddl_client_context *ddl = ddl_context->current_ddl; struct ddl_encoder_data *encoder = &(ddl->codec_data.encoder); u32 eos_present = false; if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_FRAME_DONE) ) { VIDC_LOG_STRING("STATE-CRITICAL-ENCFRMRUN"); ddl_client_fatal_cb(ddl_context); return; } VIDC_LOG_STRING("ENC_FRM_RUN_DONE"); ddl_move_command_state(ddl_context, DDL_CMD_INVALID); vidc_720p_enc_frame_info(&encoder->enc_frame_info); ddl->output_frame.vcd_frm.ip_frm_tag = ddl->input_frame.vcd_frm.ip_frm_tag; ddl->output_frame.vcd_frm.data_len = encoder->enc_frame_info.enc_size; ddl->output_frame.vcd_frm.flags |= VCD_FRAME_FLAG_ENDOFFRAME; ddl_get_frame (&(ddl->output_frame.vcd_frm), encoder->enc_frame_info.frame); ddl_process_encoder_metadata(ddl); ddl_encode_dynamic_property(ddl, false); ddl->input_frame.frm_trans_end = false; ddl_context->ddl_callback(VCD_EVT_RESP_INPUT_DONE, VCD_S_SUCCESS, &(ddl->input_frame), sizeof(struct ddl_frame_data_tag), (u32 *) ddl, ddl_context->client_data); #ifdef CORE_TIMING_INFO ddl_calc_core_time(1); #endif /* check the presence of EOS */ eos_present = ((VCD_FRAME_FLAG_EOS & ddl->input_frame.vcd_frm.flags)); ddl->output_frame.frm_trans_end = !eos_present; ddl_context->ddl_callback(VCD_EVT_RESP_OUTPUT_DONE, VCD_S_SUCCESS, &(ddl->output_frame), sizeof(struct ddl_frame_data_tag), (u32 *) ddl, ddl_context->client_data); if (eos_present) { VIDC_LOG_STRING("ENC-EOS_DONE"); ddl_context->ddl_callback(VCD_EVT_RESP_EOS_DONE, VCD_S_SUCCESS, NULL, 0, (u32 *)ddl, ddl_context->client_data); } ddl_move_client_state(ddl, DDL_CLIENT_WAIT_FOR_FRAME); DDL_IDLE(ddl_context); }
static void ddl_encoder_frame_run_callback(struct ddl_context_type *p_ddl_context) { struct ddl_client_context_type *p_ddl = p_ddl_context->p_current_ddl; struct ddl_encoder_data_type *p_encoder = &(p_ddl->codec_data.encoder); u32 b_eos_present = FALSE; if (!DDLCLIENT_STATE_IS(p_ddl, DDL_CLIENT_WAIT_FOR_FRAME_DONE) ) { VIDC_LOG_STRING("STATE-CRITICAL-ENCFRMRUN"); ddl_client_fatal_cb(p_ddl_context); return; } VIDC_LOG_STRING("ENC_FRM_RUN_DONE"); ddl_move_command_state(p_ddl_context, DDL_CMD_INVALID); vidc_720p_enc_frame_info(&p_encoder->enc_frame_info); p_ddl->output_frame.vcd_frm.n_ip_frm_tag = p_ddl->input_frame.vcd_frm.n_ip_frm_tag; p_ddl->output_frame.vcd_frm.n_data_len = p_encoder->enc_frame_info.n_enc_size; p_ddl->output_frame.vcd_frm.n_flags |= VCD_FRAME_FLAG_ENDOFFRAME; ddl_get_frame_type (&(p_ddl->output_frame.vcd_frm), p_encoder->enc_frame_info.n_frame_type); ddl_process_encoder_metadata(p_ddl); ddl_encode_dynamic_property(p_ddl, FALSE); p_ddl->input_frame.b_frm_trans_end = FALSE; p_ddl_context->ddl_callback(VCD_EVT_RESP_INPUT_DONE, VCD_S_SUCCESS, &(p_ddl->input_frame), sizeof(struct ddl_frame_data_type_tag), (u32 *) p_ddl, p_ddl_context->p_client_data); #ifdef CORE_TIMING_INFO ddl_calc_core_time(1); #endif b_eos_present = ((VCD_FRAME_FLAG_EOS & p_ddl->input_frame.vcd_frm.n_flags)); p_ddl->output_frame.b_frm_trans_end = !b_eos_present; p_ddl_context->ddl_callback(VCD_EVT_RESP_OUTPUT_DONE, VCD_S_SUCCESS, &(p_ddl->output_frame), sizeof(struct ddl_frame_data_type_tag), (u32 *) p_ddl, p_ddl_context->p_client_data); if (b_eos_present) { VIDC_LOG_STRING("ENC-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_move_client_state(p_ddl, DDL_CLIENT_WAIT_FOR_FRAME); DDL_IDLE(p_ddl_context); }
static u32 ddl_decoder_output_done_callback( struct ddl_client_context *ddl, u32 frame_transact_end) { struct ddl_decoder_data *decoder = &(ddl->codec_data.decoder); struct vidc_720p_dec_disp_info *dec_disp_info = &(decoder->dec_disp_info); struct ddl_frame_data_tag *output_frame = &ddl->output_frame; struct vcd_frame_data *output_vcd_frm = &(output_frame->vcd_frm); u32 vcd_status; u32 free_luma_dpb = 0; output_vcd_frm->physical = (u8 *)dec_disp_info->y_addr; if (decoder->codec.codec == VCD_CODEC_MPEG4 || decoder->codec.codec == VCD_CODEC_VC1 || decoder->codec.codec == VCD_CODEC_VC1_RCV || (decoder->codec.codec >= VCD_CODEC_DIVX_3 && decoder->codec.codec <= VCD_CODEC_XVID)){ vidc_720p_decode_skip_frm_details(&free_luma_dpb); if (free_luma_dpb) output_vcd_frm->physical = (u8 *) free_luma_dpb; } vcd_status = ddl_decoder_dpb_transact( decoder, output_frame, DDL_DPB_OP_MARK_BUSY); if (vcd_status != VCD_S_SUCCESS) { VIDC_LOGERR_STRING("CorruptedOutputBufferAddress"); ddl_hw_fatal_cb(ddl->ddl_context); return vcd_status; } output_vcd_frm->ip_frm_tag = dec_disp_info->tag_top; if (dec_disp_info->crop_exists == 0x1) { output_vcd_frm->dec_op_prop.disp_frm.left = dec_disp_info->crop_left_offset; output_vcd_frm->dec_op_prop.disp_frm.top = dec_disp_info->crop_top_offset; output_vcd_frm->dec_op_prop.disp_frm.right = dec_disp_info->img_size_x - dec_disp_info->crop_right_offset; output_vcd_frm->dec_op_prop.disp_frm.bottom = dec_disp_info->img_size_y - dec_disp_info->crop_bottom_offset; } else { output_vcd_frm->dec_op_prop.disp_frm.left = 0; output_vcd_frm->dec_op_prop.disp_frm.top = 0; output_vcd_frm->dec_op_prop.disp_frm.right = dec_disp_info->img_size_x; output_vcd_frm->dec_op_prop.disp_frm.bottom = dec_disp_info->img_size_y; } if (!dec_disp_info->disp_is_interlace) { output_vcd_frm->interlaced = false; output_vcd_frm->intrlcd_ip_frm_tag = VCD_FRAMETAG_INVALID; } else { output_vcd_frm->interlaced = true; output_vcd_frm->intrlcd_ip_frm_tag = dec_disp_info->tag_bottom; } output_vcd_frm->offset = 0; output_vcd_frm->data_len = decoder->y_cb_cr_size; if (free_luma_dpb) { output_vcd_frm->data_len = 0; output_vcd_frm->flags |= VCD_FRAME_FLAG_DECODEONLY; } output_vcd_frm->flags |= VCD_FRAME_FLAG_ENDOFFRAME; ddl_process_decoder_metadata(ddl); output_frame->frm_trans_end = frame_transact_end; #ifdef CORE_TIMING_INFO ddl_calc_core_time(0); #endif ddl->ddl_context->ddl_callback( VCD_EVT_RESP_OUTPUT_DONE, vcd_status, output_frame, sizeof(struct ddl_frame_data_tag), (void *)ddl, ddl->ddl_context->client_data); return vcd_status; }
static u32 ddl_decoder_ouput_done_callback( struct ddl_client_context *ddl, u32 frame_transact_end) { 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_frame_data_tag *output_frame = &(ddl->output_frame); struct vcd_frame_data *output_vcd_frm = &(output_frame->vcd_frm); u32 vcd_status, free_luma_dpb = 0, disp_pict = 0; output_vcd_frm->physical = (u8 *) (dec_disp_info->display_y_addr << 11); output_vcd_frm->frame = VCD_FRAME_YUV; if (decoder->codec.codec == VCD_CODEC_MPEG4 || decoder->codec.codec == VCD_CODEC_VC1 || decoder->codec.codec == VCD_CODEC_VC1_RCV || (decoder->codec.codec >= VCD_CODEC_DIVX_3 && decoder->codec.codec <= VCD_CODEC_XVID)) { vidc_sm_get_displayed_picture_frame(&ddl->shared_mem [ddl->command_channel], &disp_pict); if (!disp_pict) output_vcd_frm->frame = VCD_FRAME_NOTCODED; if (output_vcd_frm->frame == VCD_FRAME_NOTCODED) { vidc_sm_get_available_luma_dpb_address( &ddl->shared_mem[ddl->command_channel], &free_luma_dpb); if (free_luma_dpb) output_vcd_frm->physical = (u8 *)(free_luma_dpb << 11); } } vcd_status = ddl_decoder_dpb_transact(decoder, output_frame, DDL_DPB_OP_MARK_BUSY); if (vcd_status) { DDL_MSG_ERROR("CORRUPTED_OUTPUT_BUFFER_ADDRESS"); ddl_hw_fatal_cb(ddl); } else { vidc_sm_get_frame_tags(&ddl->shared_mem [ddl->command_channel], &dec_disp_info->tag_top, &dec_disp_info->tag_bottom); output_vcd_frm->ip_frm_tag = dec_disp_info->tag_top; vidc_sm_get_picture_times(&ddl->shared_mem [ddl->command_channel], &dec_disp_info->pic_time_top, &dec_disp_info->pic_time_bottom); if (dec_disp_info->crop_exists) { vidc_sm_get_crop_info(&ddl->shared_mem [ddl_context->response_cmd_ch_id], &dec_disp_info->crop_left_offset, &dec_disp_info->crop_right_offset, &dec_disp_info->crop_top_offset, &dec_disp_info->crop_bottom_offset); output_vcd_frm->dec_op_prop.disp_frm.left = dec_disp_info->crop_left_offset; output_vcd_frm->dec_op_prop.disp_frm.top = dec_disp_info->crop_top_offset; output_vcd_frm->dec_op_prop.disp_frm.right = decoder->frame_size.width - dec_disp_info->crop_right_offset; output_vcd_frm->dec_op_prop.disp_frm.bottom = decoder->frame_size.height - dec_disp_info->crop_bottom_offset; } else { output_vcd_frm->dec_op_prop.disp_frm.left = 0; output_vcd_frm->dec_op_prop.disp_frm.top = 0; output_vcd_frm->dec_op_prop.disp_frm.right = decoder->frame_size.width; output_vcd_frm->dec_op_prop.disp_frm.bottom = decoder->frame_size.height; } if (dec_disp_info->display_coding == VIDC_1080P_DISPLAY_CODING_PROGRESSIVE_SCAN) { output_vcd_frm->interlaced = false; output_vcd_frm->intrlcd_ip_frm_tag = VCD_FRAMETAG_INVALID; } else { output_vcd_frm->interlaced = true; if (!dec_disp_info->tag_bottom) output_vcd_frm->intrlcd_ip_frm_tag = VCD_FRAMETAG_INVALID; else output_vcd_frm->intrlcd_ip_frm_tag = dec_disp_info->tag_bottom; } output_vcd_frm->offset = 0; output_vcd_frm->data_len = decoder->y_cb_cr_size; if (free_luma_dpb) { output_vcd_frm->data_len = 0; output_vcd_frm->flags |= VCD_FRAME_FLAG_DECODEONLY; } output_vcd_frm->flags |= VCD_FRAME_FLAG_ENDOFFRAME; output_frame->frm_trans_end = frame_transact_end; #ifdef DDL_PROFILE ddl_calc_core_time(0); #endif ddl_context->ddl_callback(VCD_EVT_RESP_OUTPUT_DONE, vcd_status, output_frame, sizeof(struct ddl_frame_data_tag), (u32 *)ddl, ddl->client_data); } return vcd_status; }
static void ddl_encoder_frame_run_callback( struct ddl_client_context *ddl) { struct ddl_context *ddl_context = ddl->ddl_context; struct ddl_encoder_data *encoder = &(ddl->codec_data.encoder); struct vcd_frame_data *output_frame = &(ddl->output_frame.vcd_frm); u32 bottom_frame_tag; DDL_MSG_MED("ddl_encoder_frame_run_callback"); if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_FRAME_DONE) && !DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE)) { DDL_MSG_ERROR("STATE-CRITICAL-ENCFRMRUN"); ddl_client_fatal_cb(ddl); } else { DDL_MSG_LOW("ENC_FRM_RUN_DONE"); ddl->cmd_state = DDL_CMD_INVALID; vidc_1080p_get_encode_frame_info(&encoder->enc_frame_info); vidc_sm_get_frame_tags(&ddl->shared_mem [ddl->command_channel], &output_frame->ip_frm_tag, &bottom_frame_tag); if (encoder->enc_frame_info.enc_frame_size || (encoder->enc_frame_info.enc_frame == VIDC_1080P_ENCODE_FRAMETYPE_SKIPPED) || DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE)) { u8 *input_buffer_address = NULL; #ifdef DDL_PROFILE ddl_calc_core_time(1); #endif output_frame->data_len = encoder->enc_frame_info.enc_frame_size; output_frame->flags |= VCD_FRAME_FLAG_ENDOFFRAME; ddl_get_encoded_frame(output_frame, encoder->codec.codec, encoder->enc_frame_info.enc_frame); ddl_vidc_encode_dynamic_property(ddl, false); ddl->input_frame.frm_trans_end = false; input_buffer_address = ddl_context->dram_base_a.\ align_virtual_addr + encoder->enc_frame_info.enc_luma_address; ddl_get_input_frame_from_pool(ddl, input_buffer_address); ddl_context->ddl_callback(VCD_EVT_RESP_INPUT_DONE, VCD_S_SUCCESS, &(ddl->input_frame), sizeof(struct ddl_frame_data_tag), (u32 *)ddl, ddl->client_data); ddl->output_frame.frm_trans_end = DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE) ? false : true; ddl_context->ddl_callback(VCD_EVT_RESP_OUTPUT_DONE, VCD_S_SUCCESS, &(ddl->output_frame), sizeof(struct ddl_frame_data_tag), (u32 *)ddl, ddl->client_data); if (DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_EOS_DONE)) { struct vidc_1080p_enc_frame_start_param enc_param; if (encoder->i_period.b_frames) { if (ddl->extra_output_buf_count >= 0) { ddl->output_frame = ddl->\ extra_output_frame[ddl->\ extra_output_buf_count]; ddl->\ extra_output_buf_count--; output_frame = &ddl->output_frame.\ vcd_frm; } else output_frame = NULL; } else output_frame = NULL; memset(&enc_param, 0, sizeof(enc_param)); enc_param.cmd_seq_num = ++ddl_context->cmd_seq_num; enc_param.inst_id = ddl->instance_id; enc_param.shared_mem_addr_offset = DDL_ADDR_OFFSET(ddl_context->\ dram_base_a, ddl->shared_mem [ddl->command_channel]); if (output_frame) { enc_param.stream_buffer_addr_offset = DDL_OFFSET(ddl_context->\ dram_base_a.\ align_physical_addr, output_frame->physical); } enc_param.stream_buffer_size = encoder->client_output_buf_req.sz; enc_param.encode = VIDC_1080P_ENC_TYPE_LAST_FRAME_DATA; ddl->cmd_state = DDL_CMD_ENCODE_FRAME; ddl_context->vidc_encode_frame_start [ddl->command_channel] (&enc_param); } else { 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_release_command_channel(ddl_context, ddl->command_channel); } } else { ddl_context->ddl_callback( VCD_EVT_RESP_TRANSACTION_PENDING, VCD_S_SUCCESS, NULL, 0, (u32 *)ddl, ddl->client_data); 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_release_command_channel(ddl_context, ddl->command_channel); } } }
static u32 ddl_decoder_output_done_callback( struct ddl_client_context *ddl, u32 frame_transact_end) { 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_frame_data_tag *output_frame = &(ddl->output_frame); struct vcd_frame_data *output_vcd_frm = &(output_frame->vcd_frm); u32 vcd_status, free_luma_dpb = 0, disp_pict = 0, is_interlaced; get_dec_op_done_data(dec_disp_info, decoder->output_order, &output_vcd_frm->physical, &is_interlaced); output_vcd_frm->frame = VCD_FRAME_YUV; if (decoder->codec.codec == VCD_CODEC_MPEG4 || decoder->codec.codec == VCD_CODEC_VC1 || decoder->codec.codec == VCD_CODEC_VC1_RCV || (decoder->codec.codec >= VCD_CODEC_DIVX_3 && decoder->codec.codec <= VCD_CODEC_XVID)) { vidc_sm_get_displayed_picture_frame(&ddl->shared_mem [ddl->command_channel], &disp_pict); if (!disp_pict) output_vcd_frm->frame = VCD_FRAME_NOTCODED; if (output_vcd_frm->frame == VCD_FRAME_NOTCODED) { vidc_sm_get_available_luma_dpb_address( &ddl->shared_mem[ddl->command_channel], &free_luma_dpb); if (free_luma_dpb) output_vcd_frm->physical = (u8 *)(free_luma_dpb << 11); } } vcd_status = ddl_decoder_dpb_transact(decoder, output_frame, DDL_DPB_OP_MARK_BUSY); if (vcd_status) { DDL_MSG_ERROR("CORRUPTED_OUTPUT_BUFFER_ADDRESS"); ddl_hw_fatal_cb(ddl); } else { vidc_sm_get_metadata_status(&ddl->shared_mem [ddl->command_channel], &decoder->meta_data_exists); if (decoder->output_order == VCD_DEC_ORDER_DISPLAY) vidc_sm_get_frame_tags(&ddl->shared_mem [ddl->command_channel], &dec_disp_info->tag_top, &dec_disp_info->tag_bottom); output_vcd_frm->ip_frm_tag = dec_disp_info->tag_top; vidc_sm_get_picture_times(&ddl->shared_mem [ddl->command_channel], &dec_disp_info->pic_time_top, &dec_disp_info->pic_time_bottom); get_dec_op_done_crop(decoder->output_order, dec_disp_info, &output_vcd_frm->dec_op_prop.disp_frm, &decoder->frame_size, &ddl->shared_mem[ddl_context->response_cmd_ch_id]); output_vcd_frm->interlaced = is_interlaced; output_vcd_frm->intrlcd_ip_frm_tag = (!is_interlaced || !dec_disp_info->tag_bottom) ? VCD_FRAMETAG_INVALID : dec_disp_info->tag_bottom; output_vcd_frm->offset = 0; output_vcd_frm->data_len = decoder->y_cb_cr_size; if (free_luma_dpb) { output_vcd_frm->data_len = 0; output_vcd_frm->flags |= VCD_FRAME_FLAG_DECODEONLY; } output_vcd_frm->flags |= VCD_FRAME_FLAG_ENDOFFRAME; output_frame->frm_trans_end = frame_transact_end; #ifdef DDL_PROFILE ddl_calc_core_time(0); #endif ddl_process_decoder_metadata(ddl); ddl_context->ddl_callback(VCD_EVT_RESP_OUTPUT_DONE, vcd_status, output_frame, sizeof(struct ddl_frame_data_tag), (u32 *)ddl, ddl->client_data); } return vcd_status; }
static u32 ddl_decoder_output_done_callback( struct ddl_client_context_type *p_ddl, u32 b_frame_transact_end) { struct ddl_decoder_data_type *p_decoder = &(p_ddl->codec_data.decoder); struct vidc_720p_dec_disp_info_type *p_dec_disp_info = &(p_decoder->dec_disp_info); struct ddl_frame_data_type_tag *p_output_frame = &p_ddl->output_frame; struct vcd_frame_data_type *p_output_vcd_frm = &(p_output_frame->vcd_frm); u32 vcd_status; u32 n_free_luma_dpb = 0; p_output_vcd_frm->p_physical = (u8 *)p_dec_disp_info->n_y_addr; if (p_decoder->codec_type.e_codec == VCD_CODEC_MPEG4 || p_decoder->codec_type.e_codec == VCD_CODEC_VC1 || p_decoder->codec_type.e_codec == VCD_CODEC_VC1_RCV || (p_decoder->codec_type.e_codec >= VCD_CODEC_DIVX_3 && p_decoder->codec_type.e_codec <= VCD_CODEC_XVID)){ vidc_720p_decode_skip_frm_details(&n_free_luma_dpb); if (n_free_luma_dpb) p_output_vcd_frm->p_physical = (u8 *) n_free_luma_dpb; } vcd_status = ddl_decoder_dpb_transact( p_decoder, p_output_frame, DDL_DPB_OP_MARK_BUSY); if (vcd_status != VCD_S_SUCCESS) { VIDC_LOGERR_STRING("CorruptedOutputBufferAddress"); ddl_hw_fatal_cb(p_ddl->p_ddl_context); return vcd_status; } p_output_vcd_frm->n_ip_frm_tag = p_dec_disp_info->n_tag_top; if (p_dec_disp_info->n_crop_exists == 0x1) { p_output_vcd_frm->dec_op_prop.disp_frm.n_left = p_dec_disp_info->n_crop_left_offset; p_output_vcd_frm->dec_op_prop.disp_frm.n_top = p_dec_disp_info->n_crop_top_offset; p_output_vcd_frm->dec_op_prop.disp_frm.n_right = p_dec_disp_info->n_img_size_x - p_dec_disp_info->n_crop_right_offset; p_output_vcd_frm->dec_op_prop.disp_frm.n_bottom = p_dec_disp_info->n_img_size_y - p_dec_disp_info->n_crop_bottom_offset; } else { p_output_vcd_frm->dec_op_prop.disp_frm.n_left = 0; p_output_vcd_frm->dec_op_prop.disp_frm.n_top = 0; p_output_vcd_frm->dec_op_prop.disp_frm.n_right = p_dec_disp_info->n_img_size_x; p_output_vcd_frm->dec_op_prop.disp_frm.n_bottom = p_dec_disp_info->n_img_size_y; } if (!p_dec_disp_info->n_disp_is_interlace) { p_output_vcd_frm->b_interlaced = FALSE; p_output_vcd_frm->n_intrlcd_ip_frm_tag = VCD_FRAMETAG_INVALID; } else { p_output_vcd_frm->b_interlaced = TRUE; p_output_vcd_frm->n_intrlcd_ip_frm_tag = p_dec_disp_info->n_tag_bottom; } p_output_vcd_frm->n_offset = 0; p_output_vcd_frm->n_data_len = p_decoder->n_y_cb_cr_size; if (n_free_luma_dpb) { p_output_vcd_frm->n_data_len = 0; p_output_vcd_frm->n_flags |= VCD_FRAME_FLAG_DECODEONLY; } p_output_vcd_frm->n_flags |= VCD_FRAME_FLAG_ENDOFFRAME; ddl_process_decoder_metadata(p_ddl); p_output_frame->b_frm_trans_end = b_frame_transact_end; #ifdef CORE_TIMING_INFO ddl_calc_core_time(0); #endif p_ddl->p_ddl_context->ddl_callback( VCD_EVT_RESP_OUTPUT_DONE, vcd_status, p_output_frame, sizeof(struct ddl_frame_data_type_tag), (void *)p_ddl, p_ddl->p_ddl_context->p_client_data); return vcd_status; }