int set_jpeg_dec_mem(jpeg_data_t *jpeg_data,jpegdec_config_t *config) { config->canvas_width = CANVAS_ALIGNED(config->dec_w); planes[0] = (unsigned char *)jpeg_dec_mem.canv_addr; planes[1] = planes[0] + CANVAS_ALIGNED(config->canvas_width) *config->dec_h; planes[2] = planes[1] + CANVAS_ALIGNED(config->canvas_width/2) * config->dec_h/2; planes[3] = planes[2] + CANVAS_ALIGNED(config->canvas_width/2) * config->dec_h/2; planes[3] = ((unsigned long) planes[3] +0xffff)&0xffff0000; if ((planes[3]+CANVAS_ALIGNED(config->canvas_width) *config->dec_h*4) > (jpeg_dec_mem.canv_addr+jpeg_dec_mem.canv_len)) { ALOGD("Not enough system memory\n"); return -1; } config->addr_y = planes[0]; config->addr_u = planes[1]; config->addr_v = planes[2]; if(config->dec_w==0 ||config->dec_h==0) { config->dec_w= jpeg_data->info.width; config->dec_h= jpeg_data->info.height; } // scaleSize(config->dec_w, config->dec_h, jpeg_data->info.width, jpeg_data->info.height, (Qt::AspectRatioMode)config->opt); config->opt = 0; config->dec_x = 0; config->dec_y = 0; config->angle = CLKWISE_0; clear_plane(0,config,0); clear_plane(1,config,0); clear_plane(2,config,0); 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{
int rebuild_jpg_config_para(jpeg_data_t *jpeg_data,jpegdec_config_t *config) { int ret = 0; if((scale_w*jpeg_data->info.height)!= (scale_h*jpeg_data->info.width)){ sMode = IGNOREASPECTRATIO; }else{ sMode = KEEPASPECTRATIO; } #ifdef JPEG_DBG printf("current sMode is %d\n",sMode); #endif switch(sMode){ case KEEPASPECTRATIO: ret = compute_keep_ratio(jpeg_data,config); break; case IGNOREASPECTRATIO: ret = compute_keep_ratio_by_expanding(jpeg_data,config); if(ret < 0){ ret = compute_keep_ratio(jpeg_data,config); } break; case KEEPASPECTRATIOBYEXPANDING: ret = compute_keep_ratio_by_expanding(jpeg_data,config); if(ret < 0){ ret = compute_keep_ratio(jpeg_data,config); } break; default: break; } if(config->dec_h<2) { printf("too small to decode with hwjpeg decoder.\n"); return -1; } config->canvas_width = CANVAS_ALIGNED(config->dec_w); planes[0] = (unsigned char *)CMEM_alloc(0, config->canvas_width * config->dec_h, &cmemParm); planes[1] = (unsigned char *)CMEM_alloc(0, CANVAS_ALIGNED((config->canvas_width/2)) *config->dec_h/2, &cmemParm); planes[2] = (unsigned char *)CMEM_alloc(0, CANVAS_ALIGNED((config->canvas_width/2)) * config->dec_h/2, &cmemParm); if ((!planes[0]) || (!planes[1]) || (!planes[2])) { printf("Not enough memory\n"); if (planes[0]) CMEM_free(planes[0], &cmemParm); if (planes[1]) CMEM_free(planes[1], &cmemParm); if (planes[2]) CMEM_free(planes[2], &cmemParm); return -1; } config->addr_y = CMEM_getPhys(planes[0]); config->addr_u = CMEM_getPhys(planes[1]); config->addr_v = CMEM_getPhys(planes[2]); if(config->dec_w==0 ||config->dec_h==0) { config->dec_w= jpeg_data->info.width; config->dec_h= jpeg_data->info.height; } // scaleSize(config->dec_w, config->dec_h, jpeg_data->info.width, jpeg_data->info.height, (Qt::AspectRatioMode)config->opt); config->opt = 0; config->dec_x = 0; config->dec_y = 0; config->angle = CLKWISE_0; clear_plane(0,config); clear_plane(1,config); clear_plane(2,config); return 0; }