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{