int clear_plane(int index,jpegdec_config_t *config,int format)
{
	int fd_ge2d=-1;
	config_para_t ge2d_config;
    ge2d_op_para_t op_para;
    memset((char*)&ge2d_config,0,sizeof(config_para_t));
    fd_ge2d= open(FILE_NAME_GE2D, O_RDWR);
	if(fd_ge2d<0)
	{    
		ALOGD("can't open framebuffer device" );  		
		goto exit;
	}
	ALOGD("start clean plane buffer %d!!!!!\n", index);
	ge2d_config.src_dst_type = ALLOC_ALLOC;

//	qCritical("planes[3]addr : 0x%x-0x%x" ,planes[3],ge2d_config.dst_planes[0].addr);		
    
    switch(index){
        case 0:
        op_para.color=0x008080ff;
        ge2d_config.src_format = GE2D_FORMAT_S8_Y;
	    ge2d_config.dst_format = GE2D_FORMAT_S8_Y;
    	ge2d_config.dst_planes[0].addr = config->addr_y;
    	ge2d_config.dst_planes[0].w = config->canvas_width;
    	ge2d_config.dst_planes[0].h = config->dec_h;     
    	op_para.src1_rect.x = config->dec_x;
    	op_para.src1_rect.y = config->dec_y;
    	op_para.src1_rect.w = config->dec_w;
    	op_para.src1_rect.h = config->dec_h;      	   
    	op_para.dst_rect.x = config->dec_x;
    	op_para.dst_rect.y = config->dec_y;
    	op_para.dst_rect.w = config->dec_w;
    	op_para.dst_rect.h = config->dec_h;        	
        break;
        case 1:
        op_para.color=0x008080ff;
        ge2d_config.src_format = GE2D_FORMAT_S8_CB;
	    ge2d_config.dst_format = GE2D_FORMAT_S8_CB;
    	ge2d_config.dst_planes[0].addr = config->addr_u;
    	ge2d_config.dst_planes[0].w = config->canvas_width/2;
    	ge2d_config.dst_planes[0].h = config->dec_h / 2;      
    	op_para.src1_rect.x = config->dec_x/2;
    	op_para.src1_rect.y = config->dec_y/2;
    	op_para.src1_rect.w = config->dec_w/2;
    	op_para.src1_rect.h = config->dec_h/2;       	
    	op_para.dst_rect.x = config->dec_x/2;
    	op_para.dst_rect.y = config->dec_y/2;
    	op_para.dst_rect.w = config->dec_w/2;
    	op_para.dst_rect.h = config->dec_h/2;        	
        break;
        case 2:
        op_para.color=0x008080ff;
        ge2d_config.src_format = GE2D_FORMAT_S8_CR;
	    ge2d_config.dst_format = GE2D_FORMAT_S8_CR;    
    	ge2d_config.dst_planes[0].addr = config->addr_v;
    	ge2d_config.dst_planes[0].w = config->canvas_width/2;
    	ge2d_config.dst_planes[0].h = config->dec_h / 2;
    	op_para.src1_rect.x = config->dec_x/2;    
    	op_para.src1_rect.y = config->dec_y/2;    
    	op_para.src1_rect.w = config->dec_w/2;    
    	op_para.src1_rect.h = config->dec_h/2;    
    	op_para.dst_rect.x = config->dec_x/2;
    	op_para.dst_rect.y = config->dec_y/2;
    	op_para.dst_rect.w = config->dec_w/2;
    	op_para.dst_rect.h = config->dec_h/2;        		    
        break;
        case 3:
        op_para.color=0x000000ff;
        ge2d_config.src_format = ImgFormat2Ge2dFormat(format);
        ge2d_config.dst_format = ImgFormat2Ge2dFormat(format);
    	ge2d_config.dst_planes[0].addr=planes[3];
    	ge2d_config.dst_planes[0].w= scale_w;
    	ge2d_config.dst_planes[0].h = scale_h;    
    	op_para.src1_rect.x = scale_x; 
    	op_para.src1_rect.y = scale_y; 
    	op_para.src1_rect.w = scale_w; 
    	op_para.src1_rect.h = scale_h;       	
    	op_para.dst_rect.x = scale_x;  
    	op_para.dst_rect.y = scale_y;  
    	op_para.dst_rect.w = scale_w;  
    	op_para.dst_rect.h = scale_h;    	    
        break;
        case 4:
        ge2d_config.src_dst_type = OSD0_OSD0;
        op_para.color=0x000000ff;
        ge2d_config.src_format = ImgFormat2Ge2dFormat(format);
        ge2d_config.dst_format = ImgFormat2Ge2dFormat(format);
    	op_para.src1_rect.x = scale_x; 
    	op_para.src1_rect.y = scale_y; 
    	op_para.src1_rect.w = scale_w; 
    	op_para.src1_rect.h = scale_h;       	
    	op_para.dst_rect.x = scale_x;  
    	op_para.dst_rect.y = scale_y;  
    	op_para.dst_rect.w = scale_w;  
    	op_para.dst_rect.h = scale_h;            
        break;
        default:
        break;                            
    }
	ioctl(fd_ge2d, FBIOPUT_GE2D_CONFIG, &ge2d_config);
   ioctl(fd_ge2d, FBIOPUT_GE2D_FILLRECTANGLE, &op_para);     
exit:       
	if(fd_ge2d >=0){
	    close(fd_ge2d);		
	    fd_ge2d = -1;
    }       
    ALOGD("finish clean plane buffer %d!!!!!\n", index);
    return 0;     
}
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{