Пример #1
0
PUBLIC void START_HW_ENCODE(uint16 total_mcu_num)
{
	int32 cmd = 0;
	JPEG_CODEC_T *jpeg_fw_codec = Get_JPEGEncCodec();
	
	//VLC Module cfg
	if(ALONE_MODE == jpeg_fw_codec->work_mode)
	{
		cmd = ((jpeg_fw_codec->mcu_num_y * jpeg_fw_codec->mcu_num_x)  & 0x1ffff);
		VSP_WRITE_REG(VSP_VLC_REG_BASE+VLC_CFG_OFF, cmd, "VLC_CFG_OFF: total mcu number");
	}else
	{
		cmd = (total_mcu_num & 0x1ffff);
		VSP_WRITE_REG(VSP_VLC_REG_BASE+VLC_CFG_OFF, cmd, "VLC_CFG_OFF: total mcu number of current slice");
	}
	
	/*start MEA*/
	VSP_WRITE_REG(VSP_MEA_REG_BASE+MEA_MCU_NUM_OFF, total_mcu_num, "MEA_MCU_NUM: total mcu number");
	//hardware will auto switch mbio bfr between 0 and 1. sw can't interfere. but sw should fill the corresponding mbio bfr for hw. xiaowei@20090417
	VSP_WRITE_REG(VSP_MEA_REG_BASE+MEA_VDB_BUF_ST_OFF, 1, "DBK_VDB_BUF_ST: buf0 is valid now");
	VSP_WRITE_REG(VSP_MEA_REG_BASE+MEA_CTRL_OFF, 1, "MEA_CTRL:  sw is ready for mea start");
	
#if _CMODEL_
	START_SW_ENCODE(total_mcu_num);
#endif //_CMODEL_
}
PUBLIC void JpegEnc_HwSubModuleCfg(void)
{
	int32 cmd = 0;
	JPEG_CODEC_T *jpeg_fw_codec = Get_JPEGEncCodec();

	SCI_ASSERT(jpeg_fw_codec != PNULL);

	//BSM Module cfg
	cmd = (jpeg_fw_codec->pingpang_buf_len+3)>>2;
	if(cmd > 0x1FFFFF) {
		cmd = 0x1FFFFF;
	}
	/*cmd = (0<<31) | ((jpeg_fw_codec->pingpang_buf_len+3)>>2);*/
	JPG_WRITE_REG(JPG_BSM_REG_BASE+BSM_CFG0_OFFSET, cmd, "BSM_CFG0: buffer0 for write, and the max buffer size");
#if _CMODEL_
	g_bs_pingpang_bfr0 = jpeg_fw_codec->stream_0;
	g_bs_pingpang_bfr1 = jpeg_fw_codec->stream_1;
	init_bsm();
#endif	
	//VLC Module cfg, config total mcu number here, it will be modified for slice mode in JPEG_HWEncStart() function.
	cmd = ((jpeg_fw_codec->mcu_num_y * jpeg_fw_codec->mcu_num_x)  & 0xfffff);
	JPG_WRITE_REG(JPG_VLC_REG_BASE+VLC_TOTAL_MCU_OFFSET, cmd, "VLC_CFG_OFF: total mcu number");
	
	//DCT Module cfg
	cmd = (DCT_QUANT_EN << 8) | (DCT_AUTO_MODE << 1) | (DCT_MODE);
	JPG_WRITE_REG(JPG_DCT_REG_BASE+DCT_CFG_OFFSET, cmd, "DCT_CONFIG: enable quant, auto-mode, dct-mode");
	JPG_WRITE_REG(JPG_DCT_REG_BASE+DCT_CFG_DONE_OFFSET, 1, "DCT_CFG_FINISH: config finished");
	
	//MBIO Module cfg
	JPG_WRITE_REG(JPG_MBIO_REG_BASE+CFG_OFFSET, (MBIO_RUN_FREE_MODE), "MBIO_CFG: disable post-filter and free_run_mode");

	return;
}
PUBLIC void JpegEnc_HwTopUpdateYUVAddr(uint32 y_phy_addr,uint32_t u_phy_addr,uint32_t v_phy_addr)
{
	JPEG_CODEC_T *jpeg_fw_codec = Get_JPEGEncCodec();
//	uint32 pTableAddr = (uint32)VSP_MEMO10_ADDR;

	jpeg_fw_codec->YUV_Info_0.y_data_ptr = (unsigned char*)y_phy_addr;
	jpeg_fw_codec->YUV_Info_1.y_data_ptr = (unsigned char*)y_phy_addr;
	jpeg_fw_codec->YUV_Info_0.u_data_ptr = (unsigned char*)u_phy_addr;
	jpeg_fw_codec->YUV_Info_1.u_data_ptr = (unsigned char*)u_phy_addr;

	//Source Buffer0 and Buffer1 Addr Init
        JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR0_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_0.y_data_ptr), "Source Y0 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR1_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_0.u_data_ptr), "Source U0 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR6_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_0.v_data_ptr), "Source V0 Frame buffer ");

	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR2_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_1.y_data_ptr), "Source Y1 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR3_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_1.u_data_ptr), "Source U1 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR7_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_1.v_data_ptr), "Source V1 Frame buffer ");

	SCI_TRACE_LOW("jpeg, update yu addr,0x%x,0x%x.\n",y_phy_addr,u_phy_addr);
}
Пример #4
0
void START_SW_ENCODE(uint16 total_mcu_num)
{
	JPEG_CODEC_T *JpegCodec = Get_JPEGEncCodec();
	uint32 raw_height = total_mcu_num * JpegCodec->mcu_height * JpegCodec->mcu_width/JpegCodec->width;
	uint16 x = 0, y = 0;
	uint8 *y_coeff = JpegCodec->YUV_Info_0.y_data_ptr;
	uint8 *u_coeff = JpegCodec->YUV_Info_0.u_data_ptr;
	uint8 *v_coeff = JpegCodec->YUV_Info_0.v_data_ptr;
	uint16 mcu_num_x = JpegCodec->mcu_num_x;
	uint16 mcu_num_y = (uint16)(raw_height / (JpegCodec->mcu_height));

	int32 clock_time = 1000;

//	JPEG_CallBack_Frame_To_MCU CopyMCUToCoeff;

	if(JpegCodec->mea_bfr1_valid)
	{
		y_coeff = JpegCodec->YUV_Info_1.y_data_ptr;
		u_coeff = JpegCodec->YUV_Info_1.u_data_ptr;
		v_coeff = JpegCodec->YUV_Info_1.v_data_ptr;
	}

	g_mea_reg_ptr->MEA_CFG2 = 0; //reset!
	
	switch(JpegCodec->input_mcu_info) 
	{
	case JPEG_FW_YUV422:
//		CopyMCUToCoeff = CopyCoeffToMCU422_UV;
		g_block_num_in_one_mcu = 4;
		break;
	case JPEG_FW_YUV420:		
//		CopyMCUToCoeff = CopyCoeffToMCU420_UV;
		g_block_num_in_one_mcu = 6;
		break;	
	default:
		break;
	}
	
	/*for every MCU do following*/
	for (y = 0; y < mcu_num_y; y++)
	{
		for (x = 0; x < mcu_num_x; x++)
		{
		//	fprintf (g_pfVlcEvent, "y: %d   x: %d\n", y, x);
			if(x==7 && y == 15)
			{
				PRINTF("");
			}
			/*1, copy coeff data to correspondig blocks*/
//			CopyMCUToCoeff((uint8 *)y_coeff, (uint8 *)u_coeff, (uint8 *)v_coeff, x, y);
			
			/*quantilization is done in huffman encode*/
			/*2, call EncodeMCU*/
			JPEG_EncodeMCU();
		}
	}

	if((JpegCodec->work_mode == SWITCH_MODE) || ((JpegCodec->is_last_slice)&&(JpegCodec->work_mode == ALONE_MODE)))
	{
		g_int_vlc_done = 1;
		clear_vlc();
// 		clear_bsm_bfr(1, 1);

		g_pre_dc_value[0] = 0;
		g_pre_dc_value[1] = 0;
		g_pre_dc_value[2] = 0;
	}

#if 0//defined(TEST_VECTOR)
// 	clear_vlc_buffer();
	
	/*byte align*/
	{
		extern uint32 jremain_bit_num;
		int stuffingBis;
		int nBits = 32 - jremain_bit_num;  //left bits in bsm
		
		nBits = nBits & 7;
		
		stuffingBis = 8 - nBits;

		//if(stuffingBis < 8)
		{
			outputBits_vrf(0, stuffingBis);
		}
	}
#endif
// jpeg_end:	
	if(raw_height < JpegCodec->c_height)
	{
		JPEG_TRACE("Slice encoding end...\n");
	}else
	{
		JPEG_TRACE("JPEG encoding Finished...\n\n");
	}

	MEA_INT_PROC();
}
PUBLIC void JpegEnc_HwTopRegCfg(void)
{
	int32 cmd = 0;
	JPEG_CODEC_T *jpeg_fw_codec = Get_JPEGEncCodec();
//	uint32 pTableAddr = (uint32)VSP_MEMO10_ADDR;
	uint32 int_mask = 0;
	uint32 endian_sel = 0;	
	
	SCI_ASSERT(jpeg_fw_codec != PNULL);

#if _CMODEL_
//	AllocMCUBuf();
//	enc_init_bitstream(jpeg_fw_codec);
	VSP_Init_CModel();
//	Generate_VlcTable();
#endif //_CMODEL_

#if 0
	VSP_Reset();
#else
	//backup the INT register for the VSP reset will clear it
	int_mask = JPG_READ_REG(JPG_GLB_REG_BASE+GLB_INT_EN_OFFSET, "GLB_INT_EN_OFFSET: read  INT bit");

//	JPEG_TRACE("[JpegEnc_VspTopRegCfg] int mask = 0x%x", int_mask);

	/*reset vsp*/
	JPG_Reset();
#endif

//	cmd = (1<<3);
//	VSP_WRITE_REG(VSP_DCAM_REG_BASE+DCAM_CFG_OFF, cmd, "DCAM_CFG: DCAM init");	
	
	//Source Size init
	cmd = (jpeg_fw_codec->c_width & 0x01fff);
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_PITCH_OFFSET, cmd, "configure jpeg pitch, pixel unit");

#if defined(_VSP_) && defined(SMALL_SYS)
	//enable dcam interrupt
	//*(volatile uint32 *)0x60b00024 |= (1<<42);	
	*(volatile uint32 *)0x60b00024 |= (1<<3) | (1 << 1);	//
#endif

#if 0
	//INT Enable
	cmd =  (1 << 7) | (1 << 8) | (1 << 14);
	JPG_WRITE_REG(VSP_DCAM_REG_BASE+DCAM_INT_MASK_OFF, cmd, "DCAM_INT_MASK: enable related INT bit");
#else
	//restore the INT
	int_mask |=   (1 << 3)  |(1 << 1)| (1 << 0);
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_INT_EN_OFFSET, int_mask, "GLB_INT_EN_OFFSET: enable related INT bit");

	JPEG_TRACE("[JpegEnc_HwTopRegCfg] after reset, int mask = 0x%x", JPG_READ_REG(JPG_GLB_REG_BASE+GLB_INT_EN_OFFSET, "GLB_INT_EN_OFFSET: read  INT bit"));	
#endif

#ifndef DCAM_VSP_LCD
	#if defined(SMALL_SYS) && defined(_ARM_)
                *(volatile uint32 *)0x7130000 |= (1<<20); //INTC1 enable
                *(volatile uint32 *)0x7150008 |= (1<<10) //JPEG interrupt is bit10 of INTC1
		//enable dcam interrupt
		//*(volatile uint32 *)0x20a00010 |= (1<<27);
		//INT Enable
		//cmd =  (1 << 7) | (1 << 8) | (1 << 9);
			//init int
		DCAMMODULE_Init();
//		VSP_WRITE_REG(VSP_DCAM_REG_BASE+DCAM_INT_MASK_OFF, cmd, "DCAM_INT_MASK: enable related INT bit");
		//register the int fun;

		DCAMMODULE_RegisterIntFunc(VSP_BSM_DONE_ID, BSM_INT_PROC);
		DCAMMODULE_RegisterIntFunc(VSP_MEA_DONE_ID, MBIO_INT_PROC);
//		DCAMMODULE_RegisterIntFunc(VSP_TIMEOUT_ID, TIME_OUT_INT_PROC);
		DCAMMODULE_RegisterIntFunc(VSP_VLC_DONE_ID, VLC_DONE_INT_PROC);	
	#endif
#endif

#if _CMODEL_
	//Source Buffer0 and Buffer1 Addr Init
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR0_OFFSET, SRC_FRAME0_Y>>2, "Source Y0 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR1_OFFSET, SRC_FRAME0_UV>>2, "Source UV0 Frame buffer ");

	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR2_OFFSET, SRC_FRAME1_Y>>2, "Source Y1 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR3_OFFSET, SRC_FRAME1_UV>>2, "Source UV1 Frame buffer ");

//	VSP_WRITE_REG(VSP_AHBM_REG_BASE+AHBM_BASE_ADDR_OFFSET, (uint32)/*jpeg_fw_codec->stream_0*/0>>26, "AHBM_BASE_ADDR: PSRAM base address offset");

	//encoded bitstream addr0 and addr1
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR4_OFFSET, BIT_STREAM_ENC_0>>2, "Encoded bit stream buffer0 ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR5_OFFSET, BIT_STREAM_ENC_1>>2, "Encoded bit stream buffer1 ");
#else
	//Source Buffer0 and Buffer1 Addr Init
//	VSP_WRITE_REG(pTableAddr+ 16, (uint32)(jpeg_fw_codec->YUV_Info_0.y_data_ptr)>>2, "Source Y0 Frame buffer ");
//	VSP_WRITE_REG(pTableAddr+ 20, (uint32)(jpeg_fw_codec->YUV_Info_1.y_data_ptr)>>2, "Source Y1 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR0_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_0.y_data_ptr), "Source Y0 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR1_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_0.u_data_ptr), "Source U0 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR6_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_0.v_data_ptr), "Source V0 Frame buffer ");

	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR0_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_1.y_data_ptr), "Source Y1 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR1_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_1.u_data_ptr), "Source U1 Frame buffer ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR6_OFFSET, (uint32)(jpeg_fw_codec->YUV_Info_1.v_data_ptr), "Source V1 Frame buffer ");

//	VSP_WRITE_REG(VSP_AHBM_REG_BASE+AHBM_BASE_ADDR_OFFSET, (uint32)jpeg_fw_codec->stream_0>>26, "AHBM_BASE_ADDR: PSRAM base address offset");

	//encoded bitstream addr0 and addr1
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR4_OFFSET,  (uint32)(jpeg_fw_codec->stream_0), "Encoded bit stream buffer0 ");
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_FRM_ADDR5_OFFSET, (uint32)(jpeg_fw_codec->stream_1), "Encoded bit stream buffer1 ");
#endif //_CMODEL_

	SCI_TRACE_LOW("stream0: %x, stream1: %x.\n", (uint32_t)jpeg_fw_codec->stream_0,(uint32_t)jpeg_fw_codec->stream_1);

	//VSP_CFG0
	cmd = (1 << 6) | (0 << 4) | (1 << 2)| (1 << 1) | (1 << 0);
	JPG_WRITE_REG(JPG_GLB_REG_BASE+GLB_CTRL_OFFSET, cmd, "GLB_CTRL: enable JPEG encoder");
	
	//VSP_CFG1
        jpeg_fw_codec->uv_interleaved = (jpeg_fw_codec->YUV_Info_0.v_data_ptr == NULL)?1:0;//1: uv_interleaved, two plane, 0: three plane
	cmd = (((!jpeg_fw_codec->uv_interleaved) << 27)) | (jpeg_fw_codec->input_mcu_info << 24) | ((jpeg_fw_codec->mcu_num_y & 0x3ff) << 12) | (jpeg_fw_codec->mcu_num_x & 0x3ff);
	JPG_WRITE_REG(JPG_GLB_REG_BASE+MB_CFG_OFFSET, cmd, "uv_interleaved, input mcu infor, mcu max number x and y");
	
	//cmd = ((uint32)0xffff << 0) | (0 << 16);
//	cmd = (0<< 31)|(0 << 30)|((uint32)TIME_OUT_CLK);
//	VSP_WRITE_REG(VSP_DCAM_REG_BASE+DCAM_VSP_TIME_OUT_OFF, cmd, "DCAM_VSP_TIME_OUT: disable hardware timer out");

//	cmd = (cmd<<27)|0x1ff;
	JPG_WRITE_REG(JPG_GLB_REG_BASE+BUS_GAP_OFFSET, 0, "BUS_GAP: 0");
#if 0 
	cmd  |= (1<<18)|(1<<21);
#endif
//        cmd = VSP_READ_REG(VSP_AHBM_REG_BASE,"READ VSP_AHBM_REG_BASE");
//        cmd |= (1<<21);
//        VSP_WRITE_REG(VSP_AHBM_REG_BASE,cmd,"configure interleave mode of input yuv(bit21):0,uvuv;1,vuvu");
	//now, for uv_interleaved
//	cmd = ((jpeg_fw_codec->c_height>>jpeg_fw_codec->scale_factor) * (jpeg_fw_codec->c_width>>jpeg_fw_codec->scale_factor))>>2; //word unit

#if 0 //def CHIP_ENDIAN_LITTLE
	if (jpeg_fw_codec->YUV_Info_0.input_endian == 1) 
	{
		//little endian
		endian_sel = 0x5;
	}else
	{
		//big endian	
		endian_sel = 0x4;
	}
#endif	

//	VSP_WRITE_REG(VSP_AHBM_REG_BASE+AHBM_ENDAIN_SEL_OFFSET, cmd, "configure uv offset");
	
	//MEA
//	VSP_WRITE_REG(VSP_MEA_REG_BASE+MEA_REF_CFG_OFF, (0), "MEA_REF_CFG: transfer_en disable");
//	VSP_WRITE_REG(VSP_MEA_REG_BASE+MEA_CFG1_OFF, (1<<5), "MEA_CFG1: Use hardware pipeline");
	return;
}
PUBLIC JPEG_RET_E JpegEnc_InitParam(JPEG_ENC_INPUT_PARA_T *input_para_ptr)
{
	int32 h_ratio_max, v_ratio_max;
	JPEG_CODEC_T *jpeg_fw_codec = Get_JPEGEncCodec();
	
	SCI_ASSERT(jpeg_fw_codec != PNULL);
	SCI_ASSERT(input_para_ptr != PNULL);

	//check the input parameter!
	if((input_para_ptr->yuv_0_info.input_mcu_info != JPEG_FW_YUV422) &&(input_para_ptr->yuv_0_info.input_mcu_info != JPEG_FW_YUV420) &&
		(input_para_ptr->yuv_1_info.input_mcu_info != JPEG_FW_YUV422) &&(input_para_ptr->yuv_1_info.input_mcu_info != JPEG_FW_YUV420) )
	{
		JPEG_TRACE("mcu information is not valid, only supported yuv422 or yuv420\n");
		return JPEG_FAILED;
	}
	if(jpeg_fw_codec->compress_level > JPEG_QUALITY_MAX)
	{
		JPEG_TRACE("Quant level is not valid, please set right value from [0,4]\n");
		return JPEG_FAILED;
	}
	if((input_para_ptr->width < 1)||(input_para_ptr->height < 1))
	{
		JPEG_TRACE("Too small image size!\n");
		return JPEG_FAILED;
	}
	
	SCI_MEMSET(jpeg_fw_codec, 0, (sizeof(JPEG_CODEC_T)));
	
	jpeg_fw_codec->RST_Count = M_RST0;
	jpeg_fw_codec->mbio_bfr0_valid = TRUE;
	jpeg_fw_codec->mbio_bfr1_valid = FALSE;

	//Load parameter into JPEG Codec  
	jpeg_fw_codec->work_mode = (uint8)input_para_ptr->work_mode;
	jpeg_fw_codec->is_first_slice = input_para_ptr->is_first_slice;
	jpeg_fw_codec->is_last_slice = input_para_ptr->is_last_slice;
	jpeg_fw_codec->input_mcu_info = (uint8)(input_para_ptr->yuv_0_info.input_mcu_info);
	jpeg_fw_codec->width = (uint16)input_para_ptr->width;
	jpeg_fw_codec->height = (uint16)input_para_ptr->height;
	jpeg_fw_codec->compress_level = input_para_ptr->quant_level;
	SCI_MEMCPY(&(jpeg_fw_codec->YUV_Info_0), &(input_para_ptr->yuv_0_info), (sizeof(YUV_FORMAT_T)));
	SCI_MEMCPY(&(jpeg_fw_codec->YUV_Info_1), &(input_para_ptr->yuv_1_info), (sizeof(YUV_FORMAT_T)));
	jpeg_fw_codec->stream_0 = input_para_ptr->stream_buf0;
	jpeg_fw_codec->stream_1 = input_para_ptr->stream_buf1;
	jpeg_fw_codec->pingpang_buf_len = input_para_ptr->bitstream_buf_len;
	//.....
	
	jpeg_fw_codec->dc_huff_tbl[JPEG_FW_LUM_ID].bits = &jpeg_fw_lum_dc_bits_default[0];
	jpeg_fw_codec->dc_huff_tbl[JPEG_FW_LUM_ID].huffval = &jpeg_fw_lum_dc_huffvalue_default[0];
	jpeg_fw_codec->ac_huff_tbl[JPEG_FW_LUM_ID].bits = &jpeg_fw_lum_ac_bits_default[0];
	jpeg_fw_codec->ac_huff_tbl[JPEG_FW_LUM_ID].huffval = &jpeg_fw_lum_ac_huffvalue_default[0];
	
	jpeg_fw_codec->dc_huff_tbl[JPEG_FW_CHR_ID].bits = &jpeg_fw_chr_dc_bits_default[0];
	jpeg_fw_codec->dc_huff_tbl[JPEG_FW_CHR_ID].huffval = &jpeg_fw_chr_dc_huffvalue_default[0];
	jpeg_fw_codec->ac_huff_tbl[JPEG_FW_CHR_ID].bits = &jpeg_fw_chr_ac_bits_default[0];
	jpeg_fw_codec->ac_huff_tbl[JPEG_FW_CHR_ID].huffval = &jpeg_fw_chr_ac_huffvalue_default[0];

	jpeg_fw_codec->restart_interval = input_para_ptr->restart_interval;
	jpeg_fw_codec->restart_to_go	= 0;
	jpeg_fw_codec->next_restart_num = 0;
	
	/*init sample ratio*/	
	switch(jpeg_fw_codec->input_mcu_info)
	{
	case JPEG_FW_YUV420:
		jpeg_fw_codec->ratio[JPEG_FW_Y_ID].h_ratio = 2;
		jpeg_fw_codec->ratio[JPEG_FW_Y_ID].v_ratio = 2;
		jpeg_fw_codec->ratio[JPEG_FW_U_ID].h_ratio = 1;
		jpeg_fw_codec->ratio[JPEG_FW_U_ID].v_ratio = 1;
		jpeg_fw_codec->ratio[JPEG_FW_V_ID].h_ratio = 1;
		jpeg_fw_codec->ratio[JPEG_FW_V_ID].v_ratio = 1;
		break;
	case JPEG_FW_YUV422:
		jpeg_fw_codec->ratio[JPEG_FW_Y_ID].h_ratio = 2;
		jpeg_fw_codec->ratio[JPEG_FW_Y_ID].v_ratio = 1;
		jpeg_fw_codec->ratio[JPEG_FW_U_ID].h_ratio = 1;
		jpeg_fw_codec->ratio[JPEG_FW_U_ID].v_ratio = 1;
		jpeg_fw_codec->ratio[JPEG_FW_V_ID].h_ratio = 1;
		jpeg_fw_codec->ratio[JPEG_FW_V_ID].v_ratio = 1;
		break;
	default:
		return JPEG_FAILED;
	}
	
	/*get the mcu size*/
	v_ratio_max = JPEG_FW_MAX3(jpeg_fw_codec->ratio[JPEG_FW_Y_ID].v_ratio, jpeg_fw_codec->ratio[JPEG_FW_U_ID].v_ratio, jpeg_fw_codec->ratio[JPEG_FW_V_ID].v_ratio);
	h_ratio_max = JPEG_FW_MAX3(jpeg_fw_codec->ratio[JPEG_FW_Y_ID].h_ratio, jpeg_fw_codec->ratio[JPEG_FW_U_ID].h_ratio, jpeg_fw_codec->ratio[JPEG_FW_V_ID].h_ratio);
	jpeg_fw_codec->mcu_height = 8 * v_ratio_max;
	jpeg_fw_codec->mcu_width = 8 * h_ratio_max;
	
	jpeg_fw_codec->mcu_num_x = (jpeg_fw_codec->width + jpeg_fw_codec->mcu_width -1)/jpeg_fw_codec->mcu_width;
	jpeg_fw_codec->mcu_num_y = (jpeg_fw_codec->height + jpeg_fw_codec->mcu_height -1)/jpeg_fw_codec->mcu_height;
	
	//Adjusted image width and height
	jpeg_fw_codec->c_width = jpeg_fw_codec->mcu_num_x * jpeg_fw_codec->mcu_width;
	jpeg_fw_codec->c_height = jpeg_fw_codec->mcu_num_y * jpeg_fw_codec->mcu_height;

		
	return JPEG_SUCCESS;
}
PUBLIC void JpegEnc_QTableCfg(void)
{
	uint8 tbl_id = 0;
	JPEG_QUALITY_E level = 0;
	int32 qtable_addr = JPG_MEMO0_ADDR;
	int32 cmd = 0;
	JPEG_CODEC_T *jpeg_fw_codec = Get_JPEGEncCodec();
	
	SCI_ASSERT(jpeg_fw_codec != PNULL);

	jpeg_fw_codec->tbl_map[JPEG_FW_Y_ID].quant_tbl_id = JPEG_FW_LUM_ID;
	jpeg_fw_codec->tbl_map[JPEG_FW_U_ID].quant_tbl_id = JPEG_FW_CHR_ID;
	jpeg_fw_codec->tbl_map[JPEG_FW_V_ID].quant_tbl_id = JPEG_FW_CHR_ID;

	level = jpeg_fw_codec->compress_level;

	jpeg_fw_codec->quant_tbl[JPEG_FW_LUM_ID] = jpeg_fw_lum_quant_tbl_default[level];
	jpeg_fw_codec->quant_tbl[JPEG_FW_CHR_ID] = jpeg_fw_chr_quant_tbl_default[level];

	jpeg_fw_codec->quant_tbl_new[JPEG_FW_LUM_ID] = jpeg_fw_new_lum_quant_tbl_default[level];
	jpeg_fw_codec->quant_tbl_new[JPEG_FW_CHR_ID] = jpeg_fw_new_chr_quant_tbl_default[level];
		
	jpeg_fw_codec->quant_tbl_shift[JPEG_FW_LUM_ID] = jpeg_fw_new_lum_quant_tbl_default_shift[level];
	jpeg_fw_codec->quant_tbl_shift[JPEG_FW_CHR_ID] = jpeg_fw_new_chr_quant_tbl_default_shift[level];
	
//	cmd = (1<<4) | (1<<3);		
//	VSP_WRITE_REG(VSP_DCAM_REG_BASE+DCAM_CFG_OFF, cmd, "DCAM_CFG: allow software to access the vsp buffer");
		
//	VSP_READ_REG_POLL(VSP_DCAM_REG_BASE+DCAM_CFG_OFF, 1<<7, 1<<7, TIME_OUT_CLK, "DCAM_CFG: polling dcam clock status");	
        open_jpg_iram();

	for(tbl_id = 0; tbl_id < 2; tbl_id++)
	{
		int32 i;
		uint16 tmp1 = 0, tmp2 = 0;
		int32 tmp = 0;
		int32 index1 = 0;
		int32 index2 = 0;
		uint16 *quant_tbl_ptr = (uint16*)(&(jpeg_fw_codec->quant_tbl_new[tbl_id][0]));
		uint8 *quant_shift_tbl_ptr = (uint8*)(&(jpeg_fw_codec->quant_tbl_shift[tbl_id][0])); 
		const uint8 *ASIC_DCT_Matrix = (uint8*)jpeg_fw_ASIC_DCT_Matrix;

		for (i=0; i<64; i+=2)
		{
			index1 = ASIC_DCT_Matrix[i];
			index2 = ASIC_DCT_Matrix[i+1];		/*lint !e661*/
			tmp1 = (((quant_tbl_ptr[index1])<<4) | (uint16)(quant_shift_tbl_ptr[index1]-11));
			tmp2 = (((quant_tbl_ptr[index2])<<4) | (uint16)(quant_shift_tbl_ptr[index2]-11));
			tmp = (tmp2 << 16) | (tmp1 & 0xFFFF);
			
			JPG_WRITE_REG(qtable_addr, tmp, " VSP_MEMO0_ADDR: configure Q table");
			qtable_addr += 4;
		}
	}
	
//	cmd = (0<<4) | (1<<3);	
//	VSP_WRITE_REG(VSP_DCAM_REG_BASE+DCAM_CFG_OFF, cmd, "DCAM_CFG: allow hardware to access the vsp buffer");
		
//	VSP_READ_REG_POLL(VSP_DCAM_REG_BASE+DCAM_CFG_OFF, 0, 0, TIME_OUT_CLK, "DCAM_CFG: polling dcam clock status");
        close_jpg_iram();

	return;
}