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

📄 jpeg.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:

			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 + -