📄 img_comm.c
字号:
{
close_image_data_path(scenario_id);
return KAL_FALSE;
}
while (IMGDMA_IBW2_IS_BUSY) {}; /* wait until resize complete */
#endif
#if (defined(JPEG_DRV_V2))
stop_image_dma(scenario_id);
IMGDMA_Close(scenario_id);
RESZ_Stop(scenario_id);
RESZ_Close(scenario_id);
IMGPROC_Stop(scenario_id);
IMGPROC_Close(scenario_id);
intmem_deinit();
extmem_deinit();
#elif (defined(JPEG_DRV_V3))
close_image_data_path(scenario_id);
#endif
return KAL_TRUE;
} /* image_resize_process() */
#endif /* (defined(MT6219) || defined(MT6226) || defined(MT6226M) || defined(MT6227)) */ /* MT6219, MT6226, MT6227 */
#if (defined(MT6228) || defined(MT6229)||defined(MT6230))
void (*ibw2_cb) (void);
void (*vid_enc_w_cb) (void);
void (*vid_enc_w_cb1) (kal_uint32 yuv_address);
void (*vid_enc_r_cb) (void);
/*****************************************************************************
* FUNCTION
* image_data_path_reset_delay
* DESCRIPTION
* This function is to cover image data path hw reset bug, especially in TV out.
* PARAMETERS
* scenario_id [IN]
* RETURNS
*
*****************************************************************************/
void image_data_path_reset_delay(kal_uint32 delay)
{
#ifdef TV_OUT_SUPPORT
kal_uint32 i;
for(i=0;i<delay;i++)
{
}
#endif
}/*image_data_path_reset_delay*/
/*****************************************************************************
* FUNCTION
* open_image_data_path
* DESCRIPTION
*
* PARAMETERS
* scenario_id [IN]
* RETURNS
*
*****************************************************************************/
kal_bool open_image_data_path(MMDI_SCENERIO_ID scenario_id)
{
kal_uint32 save_irq_mask;
/* special case because MPEG_SNAPSHOT will be active in MPEG4_DECODE period */
if ((current_image_data_path_owner == SCENARIO_MPEG_DECODE_ID) && (scenario_id == SCENARIO_MPEG_SNAPSHOT_ID))
return KAL_TRUE;
if (current_image_data_path_owner != SCENARIO_UNKNOW_ID)
ASSERT(0);
save_irq_mask = SaveAndSetIRQMask();
DRV_Reg(DRVPDN_CON3) &= (~DRVPDN_CON3_PRZ); /* Turn on PRZ clock */
DRV_Reg(DRVPDN_CON3) &= (~DRVPDN_CON3_RESZLB); /* Turn on resizer dedicated line buffer clock */
DRV_Reg(DRVPDN_CON3) &= (~DRVPDN_CON3_CRZ); /* Turn on CRZ clock */
DRV_Reg(DRVPDN_CON3) &= (~DRVPDN_CON3_DRZ); /* Turn on DRZ clock */
DRV_Reg(DRVPDN_CON3) &= (~DRVPDN_CON3_IMGPROC); /* Turn on image processor clock */
DRV_Reg(DRVPDN_CON3) &= (~DRVPDN_CON3_IMGDMA); /* Turn on image DMA clock */
current_image_data_path_owner = scenario_id;
RestoreIRQMask(save_irq_mask);
if (image_data_path_sleep_mode_handler == 0xFF)
image_data_path_sleep_mode_handler = L1SM_GetHandle();
L1SM_SleepDisable(image_data_path_sleep_mode_handler);
if ((scenario_id == SCENARIO_CAMERA_CAPTURE_JPEG_ID) ||
(scenario_id == SCENARIO_JPEG_ENCODE_ID) ||
(scenario_id == SCENARIO_JPEG_DECODE_ID) || (scenario_id == SCENARIO_JPEG_RESIZE_ID) ||
#if (defined(WEBCAM_SUPPORT))
(scenario_id == SCENARIO_USBVIDEO_CAPTURE_JPEG_ID) ||
#endif
(scenario_id == SCENARIO_MPEG_SNAPSHOT_ID))
{
jpeg_codec_power_up();
}
if (scenario_id == SCENARIO_IMG_EFFECT_ID)
{ /* enable IPP for configure the parameters of IPP */
RESET_IPP;
ENABLE_IPP;
IPP_CTRL_REG = 0;
}
return KAL_TRUE;
} /* open_image_data_path() */
/*****************************************************************************
* FUNCTION
* close_image_data_path
* DESCRIPTION
*
* PARAMETERS
* scenario_id [IN]
* RETURNS
* void
*****************************************************************************/
void close_image_data_path(MMDI_SCENERIO_ID scenario_id)
{
kal_uint32 save_irq_mask;
kal_uint32 reg;
if (scenario_id == SCENARIO_MPEG_SNAPSHOT_ID)
{ /* special case because MPEG_SNAPSHOT will be active in MPEG4_DECODE period */
close_jpeg_encode_data_path();
current_image_data_path_owner = SCENARIO_UNKNOW_ID;
return;
}
if (current_image_data_path_owner != scenario_id)
ASSERT(0);
switch (scenario_id)
{
case SCENARIO_CAMERA_PREVIEW_ID:
close_camera_preview_data_path();
break;
#if (defined(WEBCAM_SUPPORT))
case SCENARIO_USBVIDEO_CAPTURE_JPEG_ID:
#endif
case SCENARIO_CAMERA_CAPTURE_JPEG_ID:
close_camera_capture_jpeg_data_path();
break;
case SCENARIO_CAMERA_CAPTURE_MEM_ID:
close_camera_capture_mem_data_path();
break;
case SCENARIO_CAMERA_CAPTURE_BARCODE_ID:
close_camera_capture_barcode_data_path();
break;
case SCENARIO_MPEG_ENCODE_ID:
close_video_encode_data_path();
break;
case SCENARIO_MPEG_DECODE_ID:
close_video_decode_data_path();
break;
case SCENARIO_JPEG_DECODE_ID:
close_jpeg_decode_data_path();
break;
case SCENARIO_JPEG_ENCODE_ID:
close_jpeg_encode_data_path();
break;
case SCENARIO_JPEG_RESIZE_ID:
close_jpeg_resize_data_path();
break;
case SCENARIO_IMG_EFFECT_ID:
close_image_effect_data_path();
break;
case SCENARIO_RESIZE_ID:
close_image_resize_data_path();
break;
}
/* release dedicated memory */
SET_PRZ_SHARED_MEMORY;
SET_CRZ_SHARED_MEMORY;
save_irq_mask = SaveAndSetIRQMask();
/*IMGDMA*/
reg = DRV_Reg32(IMGDMA_STATUS_REG);
REG_IMGDMA_INT_ACK=0xffff;
/*IMGPROC*/
reg = DRV_Reg32(IMGPROC_INTR);
/*PRZ*/
reg = DRV_Reg32(PRZ_INT_STATUS_REG);
/*CRZ*/
reg = DRV_Reg32(CRZ_INT_STATUS_REG);
/*DRZ*/
REG_DRZ_INT_ACK=0xffff;
DRV_Reg(DRVPDN_CON3) |= (DRVPDN_CON3_PRZ); /* Turn off PRZ clock */
DRV_Reg(DRVPDN_CON3) |= (DRVPDN_CON3_RESZLB); /* Turn off resizer dedicated line buffer clock */
DRV_Reg(DRVPDN_CON3) |= (DRVPDN_CON3_CRZ); /* Turn off CRZ clock */
DRV_Reg(DRVPDN_CON3) |= (DRVPDN_CON3_DRZ); /* Turn off DRZ clock */
DRV_Reg(DRVPDN_CON3) |= (DRVPDN_CON3_IMGPROC); /* Turn off image processor clock */
DRV_Reg(DRVPDN_CON3) |= (DRVPDN_CON3_IMGDMA); /* Turn off image DMA clock */
RestoreIRQMask(save_irq_mask);
current_image_data_path_owner = SCENARIO_UNKNOW_ID;
tv_output_owner = TV_OUT_OWNER_MMI;
L1SM_SleepEnable(image_data_path_sleep_mode_handler);
if (scenario_id != SCENARIO_MPEG_DECODE_ID)
{
intmem_deinit();
extmem_deinit();
}
} /* close_image_data_path() */
/*****************************************************************************
* FUNCTION
* config_camera_preview_data_path
* DESCRIPTION
*
* PARAMETERS
* scenario_id [IN]
* preview_para [?]
* RETURNS
*
*****************************************************************************/
kal_uint8 config_camera_preview_data_path(MMDI_SCENERIO_ID scenario_id, camera_preview_data_path_struct *preview_para)
{
kal_uint16 crz_out_width, crz_out_height;
//kal_uint8 h_ratio,v_ratio;
IMGDMA_IBW4_STRUCT ibw4_struct;
IMGDMA_IBW2_STRUCT ibw2_struct;
IMGDMA_IBR2_STRUCT ibr2_struct;
IMGDMA_VIDEO_ENCODE_STRUCT video_encode_dma_struct;
RESZ_CRZ_STRUCT crz_struct;
RESZ_PRZ_STRUCT prz_struct;
vid_enc_w_cb = 0;
vid_enc_w_cb1 = 0;
if (current_image_data_path_owner != scenario_id)
ASSERT(0);
if (scenario_id != SCENARIO_CAMERA_PREVIEW_ID)
ASSERT(0);
if (preview_para->tv_output == KAL_TRUE)
{
if ((preview_para->tv_output_buffer_size)<((preview_para->tv_output_width * preview_para->tv_output_height*3)>>1))
ASSERT(0);
}
kal_mem_cpy(&camera_preview_config_data, preview_para, sizeof(camera_preview_data_path_struct));
intmem_init((kal_uint32*) preview_para->intmem_start_address, preview_para->intmem_size);
extmem_init((kal_uint32*) preview_para->extmem_start_address, preview_para->extmem_size);
if (preview_para->tv_output == KAL_TRUE)
{
crz_out_width = preview_para->tv_output_width;
crz_out_height = preview_para->tv_output_height;
}
else
{
crz_out_width = preview_para->preview_width;
crz_out_height = preview_para->preview_height;
}
/* XXXXXO config IBR2 */
ibr2_struct.restart = KAL_TRUE;
ibr2_struct.int_en = KAL_FALSE;
ibr2_struct.pixel_engine = PIXEL_ENGINE_CRZ;
if (preview_para->overlay_frame_mode == KAL_TRUE)
{
ibr2_struct.overlay_frame_mode = KAL_TRUE;
ibr2_struct.overlay_frame_buffer_address = preview_para->overlay_frame_buffer_address;
ibr2_struct.overlay_frame_width = preview_para->overlay_frame_width;
ibr2_struct.overlay_frame_height = preview_para->overlay_frame_height;
ibr2_struct.overlay_frame_target_width = crz_out_width;
ibr2_struct.overlay_frame_target_height = crz_out_height;
ibr2_struct.overlay_color_depth = preview_para->overlay_color_depth;
ibr2_struct.overlay_frame_source_key = preview_para->overlay_frame_source_key;
}
else
ibr2_struct.overlay_frame_mode = KAL_FALSE;
IMGDMA_IBR2Config(&ibr2_struct);
/*XXXXX config CRZ */
crz_struct.image_src=RESZ_SOURCE_ISP;
crz_struct.dedicate_memory=KAL_TRUE;
crz_struct.continous=KAL_TRUE;
crz_struct.int_en=KAL_FALSE;
crz_struct.src_height=preview_para->image_src_height;
crz_struct.src_width=preview_para->image_src_width;
crz_struct.tar_height=crz_out_height;
crz_struct.tar_width=crz_out_width;
crz_struct.work_mem_line=16;
crz_struct.work_mem_addr=0x40000000;/* dummy for hardware issue */
RESZ_CRZConfig(&crz_struct);
/* XXXXXO config IBW4 */
ibw4_struct.pixel_engine = PIXEL_ENGINE_CRZ;
ibw4_struct.auto_restart = KAL_TRUE;
ibw4_struct.int_en = KAL_FALSE;
ibw4_struct.width = crz_out_width - 1;
ibw4_struct.height = crz_out_height - 1;
IMGDMA_IBW4Config(&ibw4_struct);
/*XXXXX config PRZ */
prz_struct.image_src=RESZ_SOURCE_IBW4;
prz_struct.dedicate_memory=KAL_FALSE;
prz_struct.continous=KAL_TRUE;
prz_struct.int_en=KAL_FALSE;
prz_struct.output_2_IPP=KAL_TRUE;
prz_struct.coarse_en=KAL_FALSE;
prz_struct.src_height=crz_out_height;
prz_struct.src_width=crz_out_width;
prz_struct.tar_height=preview_para->preview_height;
prz_struct.tar_width=preview_para->preview_width;
prz_struct.work_mem_line=4;
prz_struct.work_mem_addr=(kal_uint32) intmem_get_buffer((preview_para->preview_width * RESIZER_WORKING_MEM_LINE_NUMBER *3));
RESZ_PRZConfig(&prz_struct);
/* configure IPP1 */
RESET_IPP;
ENABLE_IPP;
IPP_CTRL_REG = 0;
SET_IPP_GRAPH_MODE(IPP_PREVIEW_PLAYBACK_MODE);
SET_IPP_HUE_SAT(IPP_HUE_SAT_ADJUST_EFFECT);
/* XXXXXO config IBW2 */
ibw2_struct.frame1_base_addr = preview_para->frame_buffer_address;
ibw2_struct.frame2_base_addr = preview_para->frame_buffer_address1;
ibw2_struct.width = preview_para->preview_width;
ibw2_struct.height = preview_para->preview_height;
if (preview_para->image_pitch_mode == KAL_TRUE)
{
ibw2_struct.pitch = KAL_TRUE;
ibw2_struct.pitch1_bytes = preview_para->image_pitch_bytes;
ibw2_struct.pitch2_bytes = preview_para->image_pitch_bytes;
}
else
{
ibw2_struct.pitch = KAL_FALSE;
}
ibw2_struct.lcd_trigger = KAL_TRUE;
ibw2_struct.dest_color_mode = preview_para->image_data_format;
ibw2_struct.pixel_engine = PIXEL_ENGINE_IPP1;
ibw2_struct.direct_couple = KAL_FALSE;
ibw2_struct.int_en = KAL_FALSE;
ibw2_struct.restart = KAL_TRUE;
ibw2_struct.pan = KAL_FALSE;
ibw2_struct.enable_IBW2 = KAL_TRUE;
ibw2_struct.cb = NULL;
IMGDMA_IBW2Config(&ibw2_struct);
if (preview_para->tv_output == KAL_TRUE)
{ /* output for LCD display */
/* XXXXXO config Video encode DMA write */
video_encode_dma_struct.rdma_destination_engine = PIXEL_ENGINE_NONE;
video_encode_dma_struct.wdma_pixel_engine = PIXEL_ENGINE_CRZ;
video_encode_dma_struct.restart = KAL_TRUE;
video_encode_dma_struct.w_trigger_r = KAL_FALSE;
video_encode_dma_struct.read_done_int = KAL_FALSE;
video_encode_dma_struct.wrtie_done_int = KAL_TRUE;
video_encode_dma_struct.y_base_addr1 = (kal_uint32) preview_para->tv_output_buffer1_address;
video_encode_dma_struct.u_base_addr1 = (kal_uint32) preview_para->tv_output_buffer1_address +
crz_out_width * crz_out_height;
video_encode_dma_struct.v_base_addr1 = (kal_uint32) preview_para->tv_output_buffer1_address +
((crz_out_width * crz_out_height * 5) >> 2);
video_encode_dma_struct.y_base_addr2 = (kal_uint32) preview_para->tv_output_buffer2_address;
video_encode_dma_struct.u_base_addr2 = (kal_uint32) preview_para->tv_output_buffer2_address +
crz_out_width * crz_out_height;
video_encode_dma_struct.v_base_addr2 = (kal_uint32) preview_para->tv_output_buffer2_address +
((crz_out_width * crz_out_height * 5) >> 2);
video_encode_dma_struct.encode_width = crz_out_width;
video_encode_dma_struct.encode_height = crz_out_height;
IMGDMA_VIDEOENCODE_DMAConfig(&video_encode_dma_struct);
tv_output_owner = TV_OUT_OWNER_VID_DMA_W;
tv_out_current_fb = 0;
vid_enc_w_cb = preview_vid_enc_w_cb;
set_tv_output_data_format(TV_DATA_YUV420);
set_tv_src_size(TV_OUT_OWNER_VID_DMA_W, crz_out_width, crz_out_height);
}
return 0;
} /* config_camera_preview_data_path() */
kal_uint32 crz_uncount_value;
/*****************************************************************************
* FUNCTION
* reconfig_camera_preview_data_path
* DESCRIPTION
*
* PARAMETERS
* scenario_id [IN]
* preview_para [?]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -