⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 img_comm.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	{
	 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 + -