📄 jpeg.c
字号:
visual_active_hisr(VISUAL_JPEG_ENC_HISR_ID);
}
}
else
{
IRQUnmask(IRQ_JPEG_ENC_CODE);
}
} /* jpeg_enc_LISR() */
#endif /* MT6228, MT6229*/
/*************************************************************************
* FUNCTION
* jpeg_decoder_HISR
*
* DESCRIPTION
* jpeg decoder HISR entry
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void jpeg_decoder_HISR(void)
{
kal_uint8 *jpg_ptr;
kal_uint32 temp_address[6];
kal_uint8 jpeg_decoder_flag=KAL_FALSE;
volatile kal_uint16 i;
if (jpeg_decoder_operation_state == JPEG_DECODER_DECODING_STATE)
{
if (jpeg_decoder_decode_result & JPEG_DECODE_FILE_OVERFLOW)
{
jpeg_decoder_operation_state=JPEG_DECODER_STANDBY_STATE;
if (jpeg_decode_wait_event==KAL_TRUE)
{
jpeg_decoder_return_code=JPEG_DECODE_DECODER_OVERFLOW_FAIL;
kal_set_eg_events(jpeg_codec_event_id,JPEG_DECODE_BREAK_INT_EVENT,KAL_OR);
}
else
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_DECODER_OVERFLOW_FAIL);
}
#if (defined(JPEG_DRV_V1)||defined(JPEG_DRV_V2))
IRQUnmask(IRQ_JPEG_CODE);
#elif (defined(JPEG_DRV_V3))
IRQUnmask(IRQ_JPEG_DEC_CODE);
#endif
return;
}
if (jpeg_decoder_decode_result & JPEG_DECODE_COMPLETE)
{
if (jpeg_file_para.jpg_progressive==KAL_TRUE)
{
if (jpeg_file_para.progressive_decode_times!=0)
{
temp_address[0]=REG_JPEG_DECODER_TABLE_ADDR;
temp_address[1]=REG_JPEG_DECODER_COMP0_PROG_START_ADDR;
temp_address[2]=REG_JPEG_DECODER_COMP1_PROG_START_ADDR;
temp_address[3]=REG_JPEG_DECODER_COMP2_PROG_START_ADDR;
temp_address[4]=REG_JPEG_DECODER_FILE_SIZE;
temp_address[5]=REG_JEPG_DECODER_STOP_ADDR;
RESET_JPEG_DECODER;
REG_JPEG_DECODER_CTRL=jpeg_file_para.jpeg_decoder_ctrl_reg;
REG_JPEG_DECODER_JPEG_FILE_START_ADDR = jpeg_decode_config_data.jpeg_file_buffer_address;
REG_JPEG_DECODER_TABLE_ADDR = temp_address[0];
REG_JPEG_DECODER_COMP0_PROG_START_ADDR = temp_address[1];
REG_JPEG_DECODER_COMP1_PROG_START_ADDR = temp_address[2];
REG_JPEG_DECODER_COMP2_PROG_START_ADDR = temp_address[3];
REG_JPEG_DECODER_FILE_SIZE=temp_address[4];
REG_JEPG_DECODER_STOP_ADDR=temp_address[5];
REG_JEPG_DECODER_INTERLEAVE_FIRST_MCU_INDEX+=jpeg_file_para.interleave_mcu_increament_index;
REG_JEPG_DECODER_INTERLEAVE_LAST_MCU_INDEX+=jpeg_file_para.interleave_mcu_increament_index;
REG_JEPG_DECODER_COMP0_FIRST_MCU_INDEX+=jpeg_file_para.non_interleav_mcu_increament_index_y;
REG_JEPG_DECODER_COMP0_LAST_MCU_INDEX+=jpeg_file_para.non_interleav_mcu_increament_index_y;
REG_JEPG_DECODER_COMP1_FIRST_MCU_INDEX+=jpeg_file_para.non_interleav_mcu_increament_index_u;
REG_JEPG_DECODER_COMP1_LAST_MCU_INDEX+=jpeg_file_para.non_interleav_mcu_increament_index_u;
REG_JEPG_DECODER_COMP2_FIRST_MCU_INDEX+=jpeg_file_para.non_interleav_mcu_increament_index_v;
REG_JEPG_DECODER_COMP2_LAST_MCU_INDEX+=jpeg_file_para.non_interleav_mcu_increament_index_v;
jpeg_file_para.progressive_decode_times--;
jpeg_decoder_decode_result=0;
if ((jpeg_file_offset==jpeg_file_para.thumbnail_offset)&&
((jpeg_decode_config_data.jpeg_file_buffer_size-16)<jpeg_decode_config_data.jpeg_file_size))
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_DECODING);
}
else
{
#if (defined(JPEG_DRV_V1)||defined(JPEG_DRV_V2))
IRQUnmask(IRQ_JPEG_CODE);
#elif (defined(JPEG_DRV_V3))
IRQUnmask(IRQ_JPEG_DEC_CODE);
#endif
START_JPEG_DECODER;
}
}
else
jpeg_decoder_flag=KAL_TRUE;
}
else
jpeg_decoder_flag=KAL_TRUE;
#if (defined(JPEG_DRV_V1))
if (jpeg_decoder_flag==KAL_TRUE)
{
if (jpeg_file_resizer_result==JPEG_RESIZER_COMPLETE)
{
jpeg_decoder_operation_state = JPEG_DECODER_STANDBY_STATE;
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_SUCCESS);
}
else if (jpeg_file_resizer_result==JPEG_RESIZER_FAIL)
{
jpeg_decoder_operation_state = JPEG_DECODER_STANDBY_STATE;
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_RESIZER_FAIL);
}
}
#endif
#if (defined(JPEG_DRV_V1)||defined(JPEG_DRV_V2))
IRQUnmask(IRQ_JPEG_CODE);
#elif (defined(JPEG_DRV_V3))
IRQUnmask(IRQ_JPEG_DEC_CODE);
#endif
return ;
}
else if (jpeg_decoder_decode_result & JPEG_DECODE_BREAK)
{
if (jpeg_decode_wait_event==KAL_TRUE)
{
kal_set_eg_events(jpeg_codec_event_id,JPEG_DECODE_BREAK_INT_EVENT,KAL_OR);
}
else
{
if (jpeg_decode_next_block==KAL_TRUE)
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_DECODING);
}
else
{
if (jpeg_decode_break==KAL_TRUE)
{ /* trigger the JPEG decoder again */
jpg_ptr=(kal_uint8 *) (REG_JEPG_DECODER_STOP_ADDR-16);
for (i=0;i<16;i++)
{
*(jpg_ptr+i)=0;
}
jpeg_decode_break=KAL_FALSE;
REG_JPEG_DECODER_JPEG_FILE_START_ADDR=REG_JEPG_DECODER_STOP_ADDR-16;
}
else
{
jpeg_decoder_operation_state=JPEG_DECODER_STANDBY_STATE;
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_DECODER_BREAK_FAIL);
}
}
}
#if (defined(JPEG_DRV_V1)||defined(JPEG_DRV_V2))
IRQUnmask(IRQ_JPEG_CODE);
#elif (defined(JPEG_DRV_V3))
IRQUnmask(IRQ_JPEG_DEC_CODE);
#endif
return;
}
}
#if (defined(JPEG_DRV_V1)||defined(JPEG_DRV_V2))
IRQUnmask(IRQ_JPEG_CODE);
#elif (defined(JPEG_DRV_V3))
IRQUnmask(IRQ_JPEG_DEC_CODE);
#endif
} /* jpeg_decoder_HISR() */
/*************************************************************************
* FUNCTION
* jpeg_encoder_HISR
*
* DESCRIPTION
* jpeg encoder HISR entry
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void jpeg_encoder_HISR(void)
{
#if (defined(JPEG_DRV_V3))
kal_uint8 i;
#endif
#if ((defined(JPEG_DRV_V2)||defined(JPEG_DRV_V3)))
if (isp_operation_state==ISP_CAPTURE_JPEG_STATE)
{
#if ((defined(JPEG_DRV_V2))&&defined(ISP_SUPPORT))
kal_set_eg_events(camera_isp_event_id,CAMERA_JPEG_ENCODE_EVENT,KAL_OR);
#endif
#if (defined(JPEG_DRV_V3))
if ((jpeg_encoder_encode_result & JPEG_ENCODE_STALL)&&
(REG_JPEG_ENCODER_DMA_ADDR>=REG_JPEG_ENCODER_STOP_ADDR))
{
if (camera_capture_jpeg_config_data.cam_capture_jpeg_cb!=NULL)
{
camera_capture_jpeg_config_data.cam_capture_jpeg_cb(JPEG_ENCODE_BUFFER_FULL);
}
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
if (wait_last_capture_frame==KAL_TRUE)
{
wait_last_capture_frame=KAL_FALSE;
}
}
if (jpeg_encoder_encode_result & JPEG_ENCODE_DONE)
{
camera_capture_jpeg_config_data.jpeg_file_info->jpeg_file_size[current_captured_file_number-1]=
camera_capture_jpeg_config_data.jpeg_file_info->jpeg_file_address[current_captured_file_number]-
camera_capture_jpeg_config_data.jpeg_file_info->jpeg_file_address[current_captured_file_number-1];
if (camera_capture_jpeg_config_data.cam_capture_jpeg_cb!=NULL)
{
camera_capture_jpeg_config_data.cam_capture_jpeg_cb(current_captured_file_number);
}
if (wait_last_capture_frame==KAL_TRUE)
wait_last_capture_frame=KAL_FALSE;
}
#endif
}
#if (defined(WEBCAM_SUPPORT))
else if((usbvideo_cam_operation_state==USBVIDEO_CAM_PREVIEW_CHECK_STATE)||
(usbvideo_cam_operation_state==USBVIDEO_CAM_CAPTURE_STATE) )
{
usbvideo_camera_frame_ready();
}
#endif
else if (jpeg_encoder_operation_state == JPEG_ENCODER_ENCODING_STATE)
{
kal_set_eg_events(jpeg_codec_event_id,JPEG_ENCODE_INT_EVENT,KAL_OR);
#if (defined(JPEG_DRV_V3))
/* for JPEG reisze process */
if (jpeg_decode_wait_event==KAL_TRUE)
{
jpeg_decoder_operation_state=JPEG_DECODER_STANDBY_STATE;
jpeg_decoder_return_code=JPEG_DECODE_SUCCESS;
kal_set_eg_events(jpeg_codec_event_id,JPEG_DECODE_BREAK_INT_EVENT,KAL_OR);
}
#endif
}
#if (defined(JPEG_DRV_V1)||defined(JPEG_DRV_V2))
IRQUnmask(IRQ_JPEG_CODE);
#elif (defined(JPEG_DRV_V3))
IRQUnmask(IRQ_JPEG_ENC_CODE);
#endif
#endif
} /* jpeg_encoder_HISR() */
/*************************************************************************
* FUNCTION
* jpeg_decode_cb_HISR
*
* DESCRIPTION
* jpeg decoder HISR callback entry
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
#if (defined(JPEG_DRV_V2)||defined(JPEG_DRV_V3))
void jpeg_decode_cb_HISR(void)
{
if (jpeg_decoder_operation_state==JPEG_DECODER_DECODING_STATE)
{
if (jpeg_decoder_decode_result & JPEG_DECODE_COMPLETE)
{
jpeg_decoder_operation_state=JPEG_DECODER_STANDBY_STATE;
if (jpeg_decode_wait_event==KAL_TRUE)
{
jpeg_decoder_return_code=JPEG_DECODE_SUCCESS;
kal_set_eg_events(jpeg_codec_event_id,JPEG_DECODE_BREAK_INT_EVENT,KAL_OR);
}
else
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_SUCCESS);
}
}
else
{
jpeg_decoder_operation_state=JPEG_DECODER_STANDBY_STATE;
if (jpeg_decode_wait_event==KAL_TRUE)
{
jpeg_decoder_return_code=JPEG_DECODE_SUCCESS;
kal_set_eg_events(jpeg_codec_event_id,JPEG_DECODE_BREAK_INT_EVENT,KAL_OR);
/* prevent wait event dead lock */
}
else
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
{
if (jpeg_decoder_decode_result & JPEG_DECODE_FILE_OVERFLOW)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_DECODER_OVERFLOW_FAIL);
else
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_SUCCESS);
}
}
}
}
}
#endif
/*************************************************************************
* FUNCTION
* resizer_LISR
*
* DESCRIPTION
* resizer LISR entry
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
#if (defined(JPEG_DRV_V1))
void resizer_LISR(void)
{
kal_uint32 int_status;
IRQMask(IRQ_RESZ_CODE);
#if (defined(MT6218B))
int_status=REG_RESIZER_YUV2RGB_INT_STATUS;
if (int_status & RESIZER_YUV2RGB_INT_STATUS_BIT)
jpeg_file_resizer_result=JPEG_RESIZER_COMPLETE;
else
jpeg_file_resizer_result=JPEG_RESIZER_FAIL;
#elif (defined(MT6217))
int_status=REG_RESIZER_INT_STATUS;
if (int_status & RESIZER_YUV2RGB_INT_STATUS_BIT)
jpeg_file_resizer_result=JPEG_RESIZER_COMPLETE;
else
jpeg_file_resizer_result=JPEG_RESIZER_FAIL;
#endif
visual_active_hisr(VISUAL_RESIZER_HISR_ID);
} /* resizer_LISR() */
#endif
/*************************************************************************
* FUNCTION
* resizer_HISR
*
* DESCRIPTION
* resizer HISR entry
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
#if (defined(JPEG_DRV_V1))
void resizer_HISR(void)
{
if (jpeg_decoder_operation_state == JPEG_DECODER_DECODING_STATE)
{
if (jpeg_decoder_decode_result & JPEG_DECODE_COMPLETE)
{
jpeg_decoder_operation_state = JPEG_DECODER_STANDBY_STATE;
if (jpeg_file_resizer_result==JPEG_RESIZER_COMPLETE)
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_SUCCESS);
}
else if (jpeg_file_resizer_result==JPEG_RESIZER_FAIL)
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_RESIZER_FAIL);
}
}
else
{
jpeg_decoder_operation_state = JPEG_DECODER_STANDBY_STATE;
if (jpeg_file_resizer_result==JPEG_RESIZER_COMPLETE)
{
#if (defined(MT6218B))
if ((!IS_FINE_RESIZE_BUSY) && (!IS_YUV2RGB_BUSY))
#elif (defined(MT6217))
if (!IS_YUV2RGB_BUSY)
#endif
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_SUCCESS);
}
else
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_RESIZER_FAIL);
}
}
else
{
if (jpeg_decode_config_data.jpeg_decode_cb!=NULL)
jpeg_decode_config_data.jpeg_decode_cb(JPEG_DECODE_RESIZER_FAIL);
}
}
}
IRQUnmask(IRQ_RESZ_CODE);
} /* resizer_HISR() */
#endif
/*************************************************************************
* FUNCTION
* jpeg_codec_init
*
* DESCRIPTION
* This function power on the jpeg decoder and resizer and init the stack timer
* for jpeg deocder and resizer
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void jpeg_codec_init(void)
{
#if (defined(JPEG_DRV_V1)||defined(JPEG_DRV_V2)||defined(JPEG_DRV_V3))
if (jpeg_codec_event_id==NULL)
jpeg_codec_event_id=kal_create_event_group("JPEG_EVT");
#endif
#if (defined(JPEG_DRV_V1))
IRQ_Register_LISR(IRQ_JPEG_CODE, jpeg_LISR,"JPEG codec ISR");
IRQ_Register_LISR(IRQ_RESZ_CODE, resizer_LISR,"Resizer ISR");
VISUAL_Register_HISR(VISUAL_JPEG_DEC_HISR_ID,jpeg_decoder_HISR);
IRQUnmask(IRQ_JPEG_CODE);
VISUAL_Register_HISR(VISUAL_RESIZER_HISR_ID,resizer_HISR);
IRQSensitivity(IRQ_RESZ_CODE,LEVEL_SENSITIVE);
IRQUnmask(IRQ_RESZ_CODE);
jpeg_decoder_operation_state = JPEG_DECODER_STANDBY_STATE;
#elif (defined(JPEG_DRV_V2))
jpeg_decoder_operation_state=JPEG_DECODER_STANDBY_STATE;
jpeg_encoder_operation_state=JPEG_ENCODER_STANDBY_STATE;
IRQ_Register_LISR(IRQ_JPEG_CODE, jpeg_LISR,"JPEG codec ISR");
VISUAL_Register_HISR(VISUAL_JPEG_DEC_HISR_ID,jpeg_decoder_HISR);
VISUAL_Register_HISR(VISUAL_JPEG_ENC_HISR_ID,jpeg_encoder_HISR);
VISUAL_Register_HISR(VISUAL_JPEG_DEC_CB_HISR_ID,jpeg_decode_cb_HISR);
IRQUnmask(IRQ_JPEG_CODE);
#elif (defined(JPEG_DRV_V3))
jpeg_decoder_operation_state=JPEG_DECODER_STANDBY_STATE;
jpeg_encoder_operation_state=JPEG_ENCODER_STANDBY_STATE;
IRQ_Register_LISR(IRQ_JPEG_DEC_CODE, jpeg_dec_LISR,"JPEG decode ISR");
IRQ_Register_LISR(IRQ_JPEG_ENC_CODE, jpeg_enc_LISR,"JPEG encode ISR");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -