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 vidc_720p_decode_bitstream_header(u32 ch_id, u32 dec_unit_size, u32 start_byte_num, u32 ext_buffer_start, u32 ext_buffer_end, enum vidc_720p_memory_access_method memory_access_model, u32 decode_order) { VIDC_IO_OUT(REG_965480, decode_order); VIDC_IO_OUT(REG_639999, 0x8080); VIDC_IO_OUT(REG_275113_ADDR, ext_buffer_start); VIDC_IO_OUT(REG_988007_ADDR, ext_buffer_end); VIDC_IO_OUT(REG_87912, ext_buffer_end); VIDC_IO_OUT(REG_761892, dec_unit_size); VIDC_IO_OUT(REG_66693, start_byte_num); VIDC_IO_OUT(REG_841539, memory_access_model); vidc_720p_submit_command(ch_id, VIDC_720P_CMD_INITCODEC); }
void vidc_720p_decode_bitstream_header(u32 n_ch_id, u32 n_dec_unit_size, u32 n_start_byte_num, u32 n_ext_buffer_start, u32 n_ext_buffer_end, enum vidc_720p_memory_access_method_type e_memory_access_model) { VIDC_IO_OUT(REG_965480, 0x0); VIDC_IO_OUT(REG_275113_ADDR, n_ext_buffer_start); VIDC_IO_OUT(REG_988007_ADDR, n_ext_buffer_end); VIDC_IO_OUT(REG_87912, n_ext_buffer_end); VIDC_IO_OUT(REG_761892, n_dec_unit_size); VIDC_IO_OUT(REG_66693, n_start_byte_num); VIDC_IO_OUT(REG_841539, e_memory_access_model); vidc_720p_submit_command(n_ch_id, VIDC_720P_CMD_INITCODEC); }
void vidc_720p_issue_eos(u32 i_ch_id) { VIDC_IO_OUT(REG_896825, 0x1); VIDC_IO_OUT(REG_761892, 0); vidc_720p_submit_command(i_ch_id, VIDC_720P_CMD_FRAMERUN); }
void vidc_720p_encode_init_codec(u32 i_ch_id, enum vidc_720p_memory_access_method memory_access_model) { VIDC_IO_OUT(REG_841539, memory_access_model); vidc_720p_submit_command(i_ch_id, VIDC_720P_CMD_INITCODEC); }
void vidc_720p_set_channel(u32 i_ch_id, enum vidc_720p_enc_dec_selection enc_dec_sel, enum vidc_720p_codec codec, u32 *pi_fw, u32 i_firmware_size) { u32 std_sel = 0; VIDC_IO_OUT(REG_661565, 0); if (enc_dec_sel) std_sel = VIDC_REG_713080_ENC_ON_BMSK; std_sel |= (u32) codec; VIDC_IO_OUT(REG_713080, std_sel); switch (codec) { default: case VIDC_720P_DIVX: case VIDC_720P_XVID: case VIDC_720P_MPEG4: { if (enc_dec_sel == VIDC_720P_ENCODER) VIDC_IO_OUT(REG_765787, pi_fw); else VIDC_IO_OUT(REG_225040, pi_fw); break; } case VIDC_720P_H264: { if (enc_dec_sel == VIDC_720P_ENCODER) VIDC_IO_OUT(REG_942456, pi_fw); else VIDC_IO_OUT(REG_942170_ADDR_3, pi_fw); break; } case VIDC_720P_H263: { if (enc_dec_sel == VIDC_720P_ENCODER) VIDC_IO_OUT(REG_765787, pi_fw); else VIDC_IO_OUT(REG_942170_ADDR_6, pi_fw); break; } case VIDC_720P_VC1: { VIDC_IO_OUT(REG_880188, pi_fw); break; } case VIDC_720P_MPEG2: { VIDC_IO_OUT(REG_40293, pi_fw); break; } } VIDC_IO_OUT(REG_591577, i_firmware_size); vidc_720p_submit_command(i_ch_id, VIDC_720P_CMD_CHSET); }
u32 vidc_720p_engine_reset(u32 ch_id, enum vidc_720p_endian dma_endian, enum vidc_720p_interrupt_level_selection interrupt_sel, u32 interrupt_mask ) { u32 op_done = 0; u32 counter = 0; VIDC_LOGERR_STRING("ENG-RESET!!"); /* issue the engine reset command */ vidc_720p_submit_command(ch_id, VIDC_720P_CMD_MFC_ENGINE_RESET); do { VIDC_BUSY_WAIT(20); VIDC_IO_IN(REG_982553, &op_done); counter++; } while (!op_done && counter < 10); if (!op_done) { /* Reset fails */ return false ; } /* write invalid channel id */ VIDC_IO_OUT(REG_97293, 4); /* Set INT_PULSE_SEL */ if (interrupt_sel == VIDC_720P_INTERRUPT_LEVEL_SEL) VIDC_IO_OUT(REG_491082, 0); else VIDC_IO_OUT(REG_491082, 1); if (!interrupt_mask) { /* Disable interrupt */ VIDC_IO_OUT(REG_609676, 1); } else { /* Enable interrupt */ VIDC_IO_OUT(REG_609676, 0); } /* Clear any pending interrupt */ VIDC_IO_OUT(REG_614776, 1); /* Set INT_ENABLE_REG */ VIDC_IO_OUT(REG_418173, interrupt_mask); /*Sets the DMA endianness */ VIDC_IO_OUT(REG_736316, dma_endian); /*Restore ARM endianness */ VIDC_IO_OUT(REG_215724, 0); /* retun engine reset success */ return true ; }
void vidc_720p_decode_frame(u32 ch_id, u32 ext_buffer_start, u32 ext_buffer_end, u32 dec_unit_size, u32 start_byte_num, u32 input_frame_tag) { VIDC_IO_OUT(REG_275113_ADDR, ext_buffer_start); VIDC_IO_OUT(REG_988007_ADDR, ext_buffer_end); VIDC_IO_OUT(REG_87912, ext_buffer_end); VIDC_IO_OUT(REG_66693, start_byte_num); VIDC_IO_OUT(REG_94750, input_frame_tag); VIDC_IO_OUT(REG_761892, dec_unit_size); vidc_720p_submit_command(ch_id, VIDC_720P_CMD_FRAMERUN); }
void vidc_720p_encode_frame(u32 ch_id, u32 ext_buffer_start, u32 ext_buffer_end, u32 start_byte_number, u32 y_addr, u32 c_addr) { VIDC_IO_OUT(REG_275113_ADDR, ext_buffer_start); VIDC_IO_OUT(REG_988007_ADDR, ext_buffer_end); VIDC_IO_OUT(REG_87912, ext_buffer_start); VIDC_IO_OUT(REG_66693, start_byte_number); VIDC_IO_OUT(REG_99105, y_addr); VIDC_IO_OUT(REG_777113_ADDR, c_addr); vidc_720p_submit_command(ch_id, VIDC_720P_CMD_FRAMERUN); }
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; }