int main(int argc, char **argv) { int ret; int i; while(1){ //------------------------------------------- ret=video_fb_init_preview(); switch (ret)//不同等级的清理------ { case 1: close(video_fd); printf("clean level 1.\n"); break; case 2: for(i=0;i<3;i++) { if(-1==munmap(buffers[i].start,buffers[i].length)) printf("munmap error:%d \n",i); } close(video_fd); printf("clean level 2.\n"); break; case 3: fb_munmap(fbdev.fb_mem, fbdev.fb_size); //释放framebuffer映射 close(fb); //关闭Framebuffer设备 for(i=0;i<3;i++) { if(-1==munmap(buffers[i].start,buffers[i].length)) printf("munmap error:%d \n",i); } close(video_fd); printf("clean level 3.\n"); break; default:printf("unkown return .\n"); break; } exit(1); //去除quit时进入死循环 } return 0; }
/************ function implementation ********************/ int main(int argc, char *argv[]) { /* * declaration for jpeg decompression */ struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; FILE *infile; unsigned char *buffer; /* * declaration for framebuffer device */ int fbdev; char *fb_device; unsigned char *fbmem; unsigned int screensize; unsigned int fb_width; unsigned int fb_height; unsigned int fb_depth; unsigned int x; unsigned int y; /* * check auguments */ /*if (argc != 2) { usage("insuffient auguments"); exit(-1); }*/ /* * open framebuffer device */ if((fb_device = getenv("FRAMEBUFFER")) == NULL) { fb_device = FB_DEV; } fbdev = fb_open(fb_device); /* * get status of framebuffer device */ fb_stat(fbdev, &fb_width, &fb_height, &fb_depth); printf("%d ", fb_width); printf("%d ", fb_height); printf("%d\n", fb_depth); /* * map framebuffer device to shared memory */ screensize = fb_width * fb_height * fb_depth / 8; fbmem = fb_mmap(fbdev, screensize); if(fbmem == 0) { printf("fb mmap error"); } /*open input jpeg file */ char jpgname[32] = {0}; int jpgcnt = 0; // SystemSetBlankInterVal(0); while(1) { //for(jpgcnt = 0; jpgcnt < 10; jpgcnt++) { /* * init jpeg decompress object error handler */ sprintf(jpgname, "%s","./picture.jpg"); //sprintf(jpgname, "/var/run/%d.jpg", jpgcnt); printf("begint to display %s\n", jpgname); cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); if((infile = fopen(jpgname, "rb+")) == NULL) { fprintf(stderr, "open %s failed\n", "1.jpg"); exit(-1); } /* * bind jpeg decompress object to infile */ jpeg_stdio_src(&cinfo, infile); /* * read jpeg header */ jpeg_read_header(&cinfo, TRUE); /* * decompress process. * note: after jpeg_start_decompress() is called * the dimension infomation will be known, * so allocate memory buffer for scanline immediately */ jpeg_start_decompress(&cinfo); /*if ((cinfo.output_width > fb_width) || (cinfo.output_height > fb_height)) { printf("too large JPEG file,cannot display\n"); return (-1); }*/ buffer = (unsigned char *) malloc(cinfo.output_width * cinfo.output_components); y = 0; while(cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, &buffer, 1); if(fb_depth == 16) { unsigned short color; for(x = 0; x < cinfo.output_width; x++) { color = RGB888toRGB565(buffer[x * 3], buffer[x * 3 + 1] , buffer[x * 3 + 2]); fb_pixel(fbmem, fb_width, fb_height, x, y, color); } } else if(fb_depth == 24) { memcpy((unsigned char *) fbmem + y * fb_width * 3, buffer, cinfo.output_width * cinfo.output_components); } y++; // next scanline } /* * finish decompress, destroy decompress object */ jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); /* * release memory buffer */ free(buffer); /* * close jpeg inputing file */ fclose(infile); usleep(400000); } } /* * unmap framebuffer's shared memory */ fb_munmap(fbmem, screensize); /* * close framebuffer device */ fb_close(fbdev); return (0); }