bool CDVDVideoCodecA10::HardwarePictureScaler(ScalerParameter *cdx_scaler_para) { unsigned long arg[4] = {0,0,0,0}; __disp_scaler_para_t scaler_para; bool is_open; memset(&scaler_para, 0, sizeof(__disp_scaler_para_t)); scaler_para.input_fb.addr[0] = cdx_scaler_para->addr_y_in;// scaler_para.input_fb.addr[1] = cdx_scaler_para->addr_c_in;// scaler_para.input_fb.size.width = cdx_scaler_para->width_in;// scaler_para.input_fb.size.height = cdx_scaler_para->height_in;// scaler_para.input_fb.format = DISP_FORMAT_YUV420; scaler_para.input_fb.seq = DISP_SEQ_UVUV; scaler_para.input_fb.mode = DISP_MOD_MB_UV_COMBINED; scaler_para.input_fb.br_swap = 0; scaler_para.input_fb.cs_mode = DISP_BT601; scaler_para.source_regn.x = 0; scaler_para.source_regn.y = 0; scaler_para.source_regn.width = cdx_scaler_para->width_in;// scaler_para.source_regn.height = cdx_scaler_para->height_in;// scaler_para.output_fb.addr[0] = (unsigned int)cdx_scaler_para->addr_y_out;// scaler_para.output_fb.addr[1] = cdx_scaler_para->addr_u_out;// scaler_para.output_fb.addr[2] = cdx_scaler_para->addr_v_out;// scaler_para.output_fb.size.width = cdx_scaler_para->width_out;// scaler_para.output_fb.size.height = cdx_scaler_para->height_out;// scaler_para.output_fb.format = DISP_FORMAT_YUV420; scaler_para.output_fb.seq = DISP_SEQ_P3210; scaler_para.output_fb.mode = DISP_MOD_NON_MB_PLANAR; scaler_para.output_fb.br_swap = 0; scaler_para.output_fb.cs_mode = DISP_YCC; is_open = m_hscaler; if (!is_open && !scaler_open()) { CLog::Log(LOGERROR, "A10: scaler_open failed.\n"); return false; } arg[1] = m_hscaler; arg[2] = (unsigned long) &scaler_para; ioctl(m_hdisp, DISP_CMD_SCALER_EXECUTE, (unsigned long) arg); if (!is_open) scaler_close(); return true; }
/* * Dispose, Free all resources */ void CDVDVideoCodecA10::Dispose() { if (m_yuvdata) { mem_pfree(m_yuvdata); m_yuvdata = NULL; } scaler_close(); disp_close(); if (m_hcedarv) { m_hcedarv->ioctrl(m_hcedarv, CEDARV_COMMAND_STOP, 0); m_hcedarv->close(m_hcedarv); libcedarv_exit(m_hcedarv); m_hcedarv = NULL; cas(&g_cedaropen, 1, 0); CLog::Log(LOGDEBUG, "A10: cedar dispose."); } }
s32 bsp_disp_exit(u32 mode) { u32 num_screens; u32 screen_id; u32 num_scalers; u32 scaler_id; struct disp_lcd *lcd; struct disp_manager *manager; num_screens = bsp_disp_feat_get_num_screens(); num_scalers = bsp_disp_feat_get_num_scalers(); if(mode == DISP_EXIT_MODE_CLEAN_ALL) { /* close all mod and unregister all irq */ for(scaler_id = 0; scaler_id < num_scalers; scaler_id++) { scaler_close(scaler_id); } scaler_exit(); for(screen_id = 0; screen_id < num_screens; screen_id++) { lcd = disp_get_lcd(screen_id); manager = disp_get_layer_manager(screen_id); manager->exit(manager); lcd->exit(lcd); } } else if(mode == DISP_EXIT_MODE_CLEAN_PARTLY) { /* unregister all irq */ // OSAL_InterruptDisable(AW_IRQ_DEBE0); // OSAL_UnRegISR(AW_IRQ_DEBE0, manager_event_proc, (void*)0); OSAL_InterruptDisable(AW_IRQ_LCD0); OSAL_UnRegISR(AW_IRQ_LCD0, disp_lcd_event_proc, (void*)0); // OSAL_InterruptDisable(AW_IRQ_DEBE1); // OSAL_UnRegISR(AW_IRQ_DEBE1, manager_event_proc, (void*)0); OSAL_InterruptDisable(AW_IRQ_LCD1); OSAL_UnRegISR(AW_IRQ_LCD1, disp_lcd_event_proc, (void*)0); } return DIS_SUCCESS; }