📄 usbvideo_cam_if.c
字号:
jpeg_encode_config_data.image_quality=g_usbvideo_camera_data.image_quality;
jpeg_encode_config_data.jpeg_gray_mode=g_usbvideo_camera_data.jpeg_gray_mode;
jpeg_encode_config_data.jpeg_file_start_address=g_usbvideo_camera_data.target_buffer_start_address;
jpeg_encode_config_data.jpeg_file_buffer_size=g_usbvideo_camera_data.target_buffer_size;
jpeg_codec_power_up();
mp4_reset();
config_image_dma(scene_id,g_usbvideo_camera_data.target_width,g_usbvideo_camera_data.target_height);
config_jpeg_encoder(&jpeg_encode_config_data);
config_image_processor(scene_id);
config_pixel_resizer(scene_id);
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
/* Prepare IPP Data */
ipp_capture_jpeg_data.intmem_start_address = g_usbvideo_camera_data.intmem_start_address;
ipp_capture_jpeg_data.intmem_size = g_usbvideo_camera_data.intmem_size;
ipp_capture_jpeg_data.extmem_start_address = g_usbvideo_camera_data.extmem_start_address;
ipp_capture_jpeg_data.extmem_size = g_usbvideo_camera_data.extmem_size;
ipp_capture_jpeg_data.image_src_width = g_usbvideo_camera_data.source_width;
ipp_capture_jpeg_data.image_src_height = g_usbvideo_camera_data.source_height;
ipp_capture_jpeg_data.image_capture_width = g_usbvideo_camera_data.target_width;
ipp_capture_jpeg_data.image_capture_height = g_usbvideo_camera_data.target_height;
ipp_capture_jpeg_data.image_quality = g_usbvideo_camera_data.image_quality;
ipp_capture_jpeg_data.jpeg_yuv_mode = JPEG_FORMAT_YUV420;
ipp_capture_jpeg_data.jpeg_file_start_address1 = g_usbvideo_camera_data.target_buffer_start_address;
ipp_capture_jpeg_data.jpeg_file_buffer_size1 = g_usbvideo_camera_data.target_buffer_size;
ipp_capture_jpeg_data.cam_capture_jpeg_cb = 0;
open_image_data_path(scene_id);
config_camera_usbvideo_jpeg_data_path(scene_id,&ipp_capture_jpeg_data);
#endif
jpeg_encoder_encode_result=0;
} /* config_usbvideo_preview_jpeg() */
/*************************************************************************
* FUNCTION
* usbvideo_camera_preview
*
* DESCRIPTION
* This function starts camera preview
*
* PARAMETERS
* usbvideo_data : the parameters for camera preview process
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void usbvideo_camera_preview(usbvideo_camera_process_struct* usbvideo_param)
{
if (usbvideo_cam_operation_state != USBVIDEO_CAM_STANDBY_STATE)
ASSERT(0);
g_usbvideo_cam_buff = USBVideo_Get_Video_Buffer();
if(g_usbvideo_cam_buff!=NULL)
{
g_usbvideo_cam_size = usbvideo_param->target_size_enum;
g_usbvideo_camera_data.target_width = VIDEO_SIZE[g_usbvideo_cam_size-1].width;
g_usbvideo_camera_data.target_height = VIDEO_SIZE[g_usbvideo_cam_size-1].height;
g_usbvideo_camera_data.target_buffer_size = VIDEO_SIZE[g_usbvideo_cam_size-1].max_frame_size;
ENABLE_CMOS_SESNOR;
config_usbvideo_preview_jpeg(usbvideo_param);
usbvideo_cam_operation_state = USBVIDEO_CAM_PREVIEW_CHECK_STATE;
/* Start Sensor Interrupt */
SET_CAMERA_CAPTURE_MODE;
SET_CAMERA_FRAME_RATE(0);
ENABLE_VIEW_FINDER_MODE;
}
}
/*************************************************************************
* FUNCTION
* exit_usbvideo_camera_preview
*
* DESCRIPTION
* This function exit camera preview
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void exit_usbvideo_camera_preview(void)
{
if (usbvideo_cam_operation_state==USBVIDEO_CAM_PREVIEW_CHECK_STATE)
{
kal_uint32 save_irq_mask;
save_irq_mask=SaveAndSetIRQMask();
usbvideo_cam_operation_state=USBVIDEO_CAM_STANDBY_STATE;
RestoreIRQMask(save_irq_mask);
ae_on_off(KAL_FALSE);
awb_on_off(KAL_FALSE);
if(jpeg_encoder_operation_state==JPEG_ENCODER_ENCODING_STATE)
{
kal_uint32 i;
/* wait until JPEG encode completely */
for (i=0;i<20;i++)
{
kal_sleep_task(20);
if ((jpeg_encoder_encode_result & JPEG_ENCODE_STALL)||
(jpeg_encoder_encode_result & JPEG_ENCODE_DONE))
i=100;
}
DISABLE_CMOS_SESNOR;
DISABLE_VIEW_FINDER_MODE;
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
RESZ_Stop(scene_id);
RESZ_Close(scene_id);
clean_imgprc_coefficient(scene_id);
IMGPROC_Stop(scene_id);
IMGPROC_Close(scene_id);
stop_image_dma(scene_id);
IMGDMA_Close(scene_id);
intmem_deinit();
extmem_deinit();
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
close_image_data_path(scene_id);
#endif
}
}
else if (usbvideo_cam_operation_state!=USBVIDEO_CAM_STANDBY_STATE)
ASSERT(0);
jpeg_codec_power_down();
} /* exit_usbvideo_camera_preview() */
/*************************************************************************
* FUNCTION
* usbvideo_camera_capture
*
* DESCRIPTION
* This function start camera capture
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void usbvideo_camera_capture(usbvideo_camera_process_struct *usbvideo_param)
{
if (usbvideo_cam_operation_state != USBVIDEO_CAM_STANDBY_STATE)
ASSERT(0);
g_usbvideo_cam_buff = USBVideo_Get_Still_Buffer();
if(g_usbvideo_cam_buff!=NULL)
{
g_usbvideo_cam_size = usbvideo_param->target_size_enum;
g_usbvideo_camera_data.target_width = STILL_SIZE[g_usbvideo_cam_size-1].width;
g_usbvideo_camera_data.target_height = STILL_SIZE[g_usbvideo_cam_size-1].height;
g_usbvideo_camera_data.target_buffer_size = STILL_SIZE[g_usbvideo_cam_size-1].max_frame_size;
ENABLE_CMOS_SESNOR;
config_usbvideo_preview_jpeg(usbvideo_param);
usbvideo_cam_operation_state=USBVIDEO_CAM_CAPTURE_STATE;
SET_CAMERA_CAPTURE_MODE;
SET_CAMERA_FRAME_RATE(0);
ENABLE_VIEW_FINDER_MODE;
}
} /* usbvideo_camera_capture() */
/*************************************************************************
* FUNCTION
* exit_usbvideo_camera_capture
*
* DESCRIPTION
* This function exit camera capture
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void exit_usbvideo_camera_capture(void)
{
if (usbvideo_cam_operation_state==USBVIDEO_CAM_CAPTURE_STATE)
{
kal_uint32 save_irq_mask;
save_irq_mask=SaveAndSetIRQMask();
usbvideo_cam_operation_state=USBVIDEO_CAM_STANDBY_STATE;
RestoreIRQMask(save_irq_mask);
ae_on_off(KAL_FALSE);
awb_on_off(KAL_FALSE);
if(jpeg_encoder_operation_state==JPEG_ENCODER_ENCODING_STATE)
{
kal_uint32 i;
/* wait until JPEG encode completely */
for (i=0;i<20;i++)
{
kal_sleep_task(20);
if ((jpeg_encoder_encode_result & JPEG_ENCODE_STALL)||
(jpeg_encoder_encode_result & JPEG_ENCODE_DONE))
i=100;
}
DISABLE_CMOS_SESNOR;
DISABLE_VIEW_FINDER_MODE;
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
RESZ_Stop(scene_id);
RESZ_Close(scene_id);
clean_imgprc_coefficient(scene_id);
IMGPROC_Stop(scene_id);
IMGPROC_Close(scene_id);
stop_image_dma(scene_id);
IMGDMA_Close(scene_id);
intmem_deinit();
extmem_deinit();
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
close_image_data_path(scene_id);
jpeg_encoder_operation_state=JPEG_ENCODER_STANDBY_STATE;
#endif
}
}
else if (usbvideo_cam_operation_state!=USBVIDEO_CAM_STANDBY_STATE)
ASSERT(0);
jpeg_codec_power_down();
} /* usbvideo_camera_capture() */
static void usbvideo_camera_frame_timeout(void *parameter)
{
GPTI_StopItem(usbvideo_camera_jpeg_timer_handle);
if((usbvideo_cam_operation_state==USBVIDEO_CAM_OFF_STATE) ||
(usbvideo_cam_operation_state==USBVIDEO_CAM_STANDBY_STATE))
return;
if ((*(volatile unsigned int *) 0x80690000) & 0x10000)
{
DISABLE_VIEW_FINDER_MODE;
#if (defined(MT6219))
*((volatile unsigned int *) 0x80610004) = 0x600000;
*((volatile unsigned int *) 0x80610004) = 0x60;
#elif (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
*((volatile unsigned int *) 0x80610004) = 0x60000;
*((volatile unsigned int *) 0x80610004) = 0x6;
#endif
RESET_JPEG_ENCODER;
ENABLE_JPEG_ENCODER;
ENABLE_VIEW_FINDER_MODE;
usbvideo_camera_jpeg_timer++;
GPTI_StartItem(usbvideo_camera_jpeg_timer_handle, 73, usbvideo_camera_frame_timeout, NULL);
}
else
{
jpeg_encode_config_data.image_quality=JPEG_ENCODER_POOR_QUALITY;
usbvideo_camera_frame_ready();
}
// If retry too many times, ASSERT
if(usbvideo_camera_jpeg_timer>50)
ASSERT(0);
}
/*************************************************************************
* FUNCTION
* usbvideo_camera_frame_ready
*
* DESCRIPTION
* This function complete frame(HISR) and get next video buffer
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void usbvideo_camera_frame_ready(void)
{
kal_uint32 time=0;
// JPEG Encode Done
if(usbvideo_camera_jpeg_timer>0)
{
usbvideo_camera_jpeg_timer = 0;
jpeg_encoder_encode_result = 0;
jpeg_file_size = 0;
usbvideo_complete_flag = KAL_FALSE;
}
else if(jpeg_encoder_encode_result&JPEG_ENCODE_DONE)
{
time = GPT_return_current_count();
jpeg_file_size = DRV_Reg32(JPEG_ENCODER_DMA_ADDR_REG)-DRV_Reg32(JPEG_ENCODER_DEST_ADDR_REG);
usbvideo_complete_flag = KAL_TRUE;
}
else if(jpeg_encoder_encode_result&JPEG_ENCODE_STALL)
{
jpeg_encoder_encode_result = 0;
jpeg_file_size = 0;
usbvideo_complete_flag = KAL_FALSE;
usbvideo_camera_jpeg_timer = 0;
GPTI_StartItem(usbvideo_camera_jpeg_timer_handle, 100, usbvideo_camera_frame_timeout, NULL);
return;
}
DISABLE_VIEW_FINDER_MODE;
SET_CAMERA_PREVIEW_MODE;
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6229)||defined(MT6230))
if((REG_ISP_INT_ENABLE & REG_CAMERA_INT_FLASH_DONE_ENABLE_BIT)== 0)
{
if( ae_count==camera_oper_data.ae_setting_cal_delay_frame )
DISABLE_AE_COUNT;
}
#elif (defined(MT6228))
if((REG_ISP_INT_ENABLE & REG_CAMERA_INT_VSYNC_ENABLE_BIT)== 0)
{
if( ae_count==camera_oper_data.ae_setting_cal_delay_frame )
DISABLE_AE_COUNT;
}
#endif
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
DISABLE_CMOS_SESNOR;
#endif
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
RESZ_Stop(scene_id);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -