aml_image_info_t* read_jpeg_image(const char* url , int width, int height,int mode , int flag,
    int thumbpref,int colormode)
{  
    char* outimage = NULL; 
    aml_image_info_t* input_image_info;
    aml_image_info_t* output_image_info;   
    int input_image_width;    
    char* input_data;
    char* output_data;
    int fd_jpegdec;
    int i;

	sMode=mode;
	if(mode>SCRETCHFULLSCREEN) sMode=KEEPASPECTRATIO;
    if((width <= 0)||(height <=0)){
    	 width = 1280;
    	 height = 720;		
	}
	
	input_image_info = (aml_image_info_t*)malloc(sizeof(aml_image_info_t));
    output_image_info = (aml_image_info_t*)malloc(sizeof(aml_image_info_t));
    memset((char*)output_image_info , 0 , sizeof(aml_image_info_t));	
     int wait_timeout = 0 ;
     int fd = open(url,O_RDONLY ) ; 
     if(fd < 0){
		ALOGD("amljpeg:source file:%s open error\n",url);
        goto exit;   
     }
	//we need some step to decompress jpeg image to output 
	// 1  request yuv space from cmem to store decompressed data
	// 2  config and decompress jpg picture.
	// 3	 request  new rgb space from cmem to store output rgb data.
	// 4  ge2d move yuv data to rgb space.
	// 5  release request mem to cmem module.
	jpegdec_config_t  config={0};
	jpeg_data_t  jpeg_data;
	int fd_ge2d=-1;
	config_para_t ge2d_config;
	int format=colormode;
    ge2d_op_para_t op_para;
	int bpl 	 ;

	memset((char*)&ge2d_config,0,sizeof(config_para_t));	
	scale_x = 0;
	scale_y = 0;
	scale_w = width;
	scale_h = height;	
/*default value for no scaler input*/	
	if(thumbpref!=0)  {
		decoder_opt=JPEGDEC_OPT_THUMBNAIL_PREFERED;
	} else {
		decoder_opt=0;
	}
	if((scale_w == 0)||(scale_h ==0)){
	    scale_w  = 160 ;
	    scale_h  = 100;     
	}
	config.opt=(unsigned)sMode ;
	jpeg_data.fd_amport=fd_amport;
	
	fd_jpegdec= open(FILE_NAME_JPEGDEC, O_RDWR); 
    if(fd_jpegdec <0 ){
        perror("open amjpec device error\r\n")	; 	
        return 0;
    }

	if(!(JPEGDEC_STAT_DONE&read_jpeg_data(fd,&jpeg_data,DEC_STAT_MAX,&config,thumbpref,fd_jpegdec)))
	{    
		ALOGD("can't decode jpg pic\n");			
		goto exit;
	} 

	ALOGD("deocde jpg pic completed\n");
    input_image_width = CANVAS_ALIGNED(scale_w);
	
	//open fb device to handle ge2d op FILE_NAME_GE2D
    fd_ge2d= open(FILE_NAME_GE2D, O_RDWR); 
	if(fd_ge2d<0)
	{    
		ALOGD("can't open framebuffer device\n" );  			
		goto exit;
	}
/*antiflicking setting*/	
    if(flag){
	    ioctl(fd_ge2d,FBIOPUT_GE2D_ANTIFLICKER_ENABLE,1);    
	}else{
	    ioctl(fd_ge2d,FBIOPUT_GE2D_ANTIFLICKER_ENABLE,0);   
	}
	if(format==0) {
	    ALOGD("default data!\n" );
	    if(jpeg_data.info.comp_num==3 ||jpeg_data.info.comp_num==4)
	    {
		    format = COLOR_S32_ARGB;
	    } else {
		    ALOGD("unsupported color format\n" );  		
		    goto exit;
	    }
	} 
	clear_plane(3,&config,format);
	ALOGD("start ge2d image format convert!!!!!\n");
	ge2d_config.src_dst_type = ALLOC_ALLOC;
//    ge2d_config.src_dst_type = ALLOC_OSD1;        //only for test
	ge2d_config.alu_const_color=0xff0000ff;
	ge2d_config.src_format = GE2D_FORMAT_M24_YUV420;
	ge2d_config.dst_format = ImgFormat2Ge2dFormat(format);
	if(0xffffffff==ge2d_config.dst_format)
	{	    
		ALOGD("can't get proper ge2d format\n" );  			
		goto exit;
	}

	ge2d_config.src_planes[0].addr = config.addr_y;
	ge2d_config.src_planes[0].w =    config.canvas_width;
	ge2d_config.src_planes[0].h =    config.dec_h;
	ge2d_config.src_planes[1].addr = config.addr_u;
	ge2d_config.src_planes[1].w =    config.canvas_width/2;
	ge2d_config.src_planes[1].h =    config.dec_h / 2;

	ge2d_config.src_planes[2].addr = config.addr_v;
	ge2d_config.src_planes[2].w = config.canvas_width/2;
	ge2d_config.src_planes[2].h = config.dec_h / 2;
	ge2d_config.dst_planes[0].addr=planes[3];	
//	ge2d_config.dst_planes[0].w=  scale_w;
    ge2d_config.dst_planes[0].w= input_image_width ;
	ge2d_config.dst_planes[0].h = scale_h;
//#ifdef JPEG_DBG 	
//	ALOGD("planes[3]addr : 0x%x-0x%x" ,planes[3],ge2d_config.dst_planes[0].addr);		
//#endif	
	ioctl(fd_ge2d, FBIOPUT_GE2D_CONFIG, &ge2d_config);
/*crop case*/
	
    switch(mode){
        case  KEEP_SIZE:
    		op_para.src1_rect.x = 0;
    		op_para.src1_rect.y = 0;
    		op_para.src1_rect.w = config.dec_w;
    		op_para.src1_rect.h = config.dec_h;
    		op_para.dst_rect.x = 0;
    		op_para.dst_rect.y = 0;
    		op_para.dst_rect.w = config.dec_w;
    		op_para.dst_rect.h = config.dec_h;	  
    		scale_w = config.dec_w;  
    		scale_h = config.dec_h ;  
            break;
        case  KEEPASPECTRATIO:
        case  KEEPASPECTRATIOWITHCROP:
    	    if((config.dec_w > scale_w )||(config.dec_h > scale_h)){
            	op_para.src1_rect.x = (config.dec_w - scale_w)>>1;
            	op_para.src1_rect.y = (config.dec_h - scale_h)>>1;
            	op_para.src1_rect.w = scale_w;
            	op_para.src1_rect.h = scale_h;
            	op_para.dst_rect.x = 0;
            	op_para.dst_rect.y = 0;
            	op_para.dst_rect.w = scale_w;
            	op_para.dst_rect.h = scale_h;		    
    	    }else{	
aml_image_info_t* read_jpeg_image_rgb_test(char* url , int width, int height,int mode , int flag)
{    
    aml_image_info_t* output_image_info;
    output_image_info = (aml_image_info_t*)malloc(sizeof(aml_image_info_t));
    memset((char*)output_image_info , 0 , sizeof(aml_image_info_t));   
/*default para*/	
    if((width <= 0)||(height <=0)||(mode > 2) ){
    	 width = 1280;
    	 height = 720;		
    	 mode = KEEPASPECTRATIO;
	}

     int wait_timeout = 0 ;
     char* outimage = NULL; 

     int fd = open(url,O_RDWR ) ; 
     if(fd < 0){
        goto exit;   
     }
     printf("open 15.jpeg sucessfuly\n");
	//we need some step to decompress jpeg image to output 
	// 1  request yuv space from cmem to store decompressed data
	// 2  config and decompress jpg picture.
	// 3	 request  new rgb space from cmem to store output rgb data.
	// 4  ge2d move yuv data to rgb space.
	// 5  release request mem to cmem module.
	jpegdec_config_t  config;
	jpeg_data_t  jpeg_data;
	int fd_ge2d=-1;
	config_para_t ge2d_config;
	int format;
    	ge2d_op_para_t op_para;
	int bpl 	 ;

	memset((char*)&ge2d_config,0,sizeof(config_para_t));	
	scale_x = 0;
	scale_y = 0;
	scale_w = width;
	scale_h = height;	
/*default value for no scaler input*/	
#if 1
	if(scale_w>0 && scale_w<=200 && scale_h>0 && scale_h<=200)  {
		decoder_opt=JPEGDEC_OPT_THUMBNAIL_PREFERED;
	} else {
		decoder_opt=0;
	}
#else
	decoder_opt=0;
#endif
	if((scale_w == 0)||(scale_h ==0)){
	    scale_w  = 160 ;
	    scale_h  = 100;     
	}
	config.opt=(unsigned)sMode ;
	jpeg_data.fd_amport=fd_amport;
	if(!(JPEGDEC_STAT_DONE&read_jpeg_data(fd,&jpeg_data,DEC_STAT_MAX,&config)))
	{
#ifdef JPEG_DBG 	    
		printf("can't decode jpg pic");	
#endif			
		goto exit;
	}

#ifdef JPEG_DBG 	
	printf("deocde jpg pic completed");
#endif
	planes[3]=(unsigned char *)CMEM_alloc(0,CANVAS_ALIGNED(scale_w)*scale_h*4,&cmemParm);
	if(!planes[3])
	{
#ifdef JPEG_DBG 	    
		printf("can't get rgb memory from heap");
#endif		
		goto exit;
	}
#ifdef JPEG_DBG 	
	printf("planes[3]=(unsigned char *)CMEM_alloc(0,%d * %d *4,&cmemParm)\n",scale_w ,scale_h); 
#endif	
 	clear_plane(3,&config);

	//open fb device to handle ge2d op FILE_NAME_GE2D
    fd_ge2d= open(FILE_NAME_GE2D, O_RDWR);
//#ifdef JPEG_DBG     
//    printf("fd_ge2d= open(%s, O_RDWR)\n",dev.toLatin1().constData());
//#endif    
	if(fd_ge2d<0)
	{
#ifdef JPEG_DBG 	    
		printf("can't open framebuffer device" );  	
#endif			
		goto exit;
	}
/*antiflicking setting*/	
    if(flag){
	    ioctl(fd_ge2d,FBIOPUT_GE2D_ANTIFLICKER_ENABLE,1);    
	}else{
	    ioctl(fd_ge2d,FBIOPUT_GE2D_ANTIFLICKER_ENABLE,0);   
	}
	if(jpeg_data.info.comp_num==3 ||jpeg_data.info.comp_num==4)
	{
		format = Format_RGB32;
	}else{
#ifdef JPEG_DBG 	
		printf("unsupported color format" );  	
#endif		
		goto exit;
	}
#ifdef JPEG_DBG 	
	printf("start ge2d image format convert!!!!!\n");
#endif	
	ge2d_config.src_dst_type = ALLOC_ALLOC;
//    ge2d_config.src_dst_type = ALLOC_OSD1;        //only for test
	ge2d_config.alu_const_color=0xff0000ff;
	ge2d_config.src_format = GE2D_FORMAT_M24_YUV420;
	ge2d_config.dst_format = ImgFormat2Ge2dFormat(format);
	if(0xffffffff==ge2d_config.dst_format)
	{
#ifdef JPEG_DBG 	    
		printf("can't get proper ge2d format" );  	
#endif			
		goto exit;
	}

	ge2d_config.src_planes[0].addr = config.addr_y;
	ge2d_config.src_planes[0].w =    config.canvas_width;
	ge2d_config.src_planes[0].h =    config.dec_h;
	ge2d_config.src_planes[1].addr = config.addr_u;
	ge2d_config.src_planes[1].w =    config.canvas_width/2;
	ge2d_config.src_planes[1].h =    config.dec_h / 2;

	ge2d_config.src_planes[2].addr = config.addr_v;
	ge2d_config.src_planes[2].w = config.canvas_width/2;
	ge2d_config.src_planes[2].h = config.dec_h / 2;
	ge2d_config.dst_planes[0].addr=CMEM_getPhys(planes[3]);	
	ge2d_config.dst_planes[0].w=  scale_w;
	ge2d_config.dst_planes[0].h = scale_h;
//#ifdef JPEG_DBG 	
//	printf("planes[3]addr : 0x%x-0x%x" ,planes[3],ge2d_config.dst_planes[0].addr);		
//#endif	
	ioctl(fd_ge2d, FBIOPUT_GE2D_CONFIG, &ge2d_config);
/*crop case*/	
	if((config.dec_w > scale_w )||(config.dec_h > scale_h)){
    	op_para.src1_rect.x = (config.dec_w - scale_w)>>1;
    	op_para.src1_rect.y = (config.dec_h - scale_h)>>1;
    	op_para.src1_rect.w = scale_w;
    	op_para.src1_rect.h = scale_h;
    	op_para.dst_rect.x = 0;
    	op_para.dst_rect.y = 0;
    	op_para.dst_rect.w = scale_w;
    	op_para.dst_rect.h = scale_h;		    
	}else{