s3c2410板子,zc301摄像头采集图像,利用framebuffer在LCD上显示,利用jpeglib.h解压图像时,出现错误,如图所示:程序源码如下; 请各位大神帮忙指点一下,,谢谢啦 /usr/include/jpeglib.h:914:parse error before "FILE"
#include <sys/types.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <linux/fb.h>
#include <jpeglib.h>
#include <jerror.h>
#include "v4l.c"
#include "v4l.h"
#include <stdio.h>
#include <stdlib.h>
//#include <unistd.h>
//#include <fcntl.h>
//#include <string.h>
//#include <linux/fb.h>
#define norm VIDEO_MODE_NTSC
#define DEFAULT_FIL_NAME "picture"
unsigned short RGB888toRGB555(unsigned char red,unsigned char green,unsigned char blue)
{unsigned short B=(blue>>3)&0x001F;
unsigned short G=((green>>2)<<5)%0x07E0;
unsigned short R=((red>>3)<<11)&0xF800;
return (unsigned short )(R|G|B);
}
int fb_pixel(void *fbmem,int width,int height,int x,int y,unsigned short color)
{if((x>width)||(y>height))
return (-1);
unsigned short *dst=((unsigned short *)fbmem+y*width+x);
*dst=color;
return 0;
}
int main()
{int fbfd=0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize=0;
char *fbp=0;
int x=0,y=0;
long int loca
tion=0;
int sav=0;
fbfd=open("/dev/fb0",O_RDWR);
if(!fbfd){
printf("Error:can't open framebuffer device.
");
exit(1);
}
printf("the framebufffer device was opened successfully.
");
if(ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo)){
printf("Error:read fixed information .
");
exit(2);
}
if(ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo)){
printf("Error:reading variable information.
");
exit(3);
}
printf("vinfo.xres=%d
",vinfo.xres);
printf("vinfo.yres=%d
",vinfo.yres);
printf("vinfo.bits_per_bits=%d
",vinfo.bits_per_pixel);
printf("vinfo.xoffset=%d
",vinfo.xoffset);
printf("vinfo.yoffset=%d
",vinfo.yoffset);
printf("finfo.line_length=%d
",finfo.line_length);
screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;
fbp=(char *)mmap(NULL,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);
if((int)fbp==-1){
printf("Error:failed to map framebuffer device to memory.
");
exit(4);
}
printf("the framebuffer device was mapped to memory successfully.
");
int i=1;
v4ldevice VD;
v4ldevice *vd=&VD;
char *buffer=NULL;
v4l_open("/dev/video0",vd); //打开设备
v4l_grab_init(vd,NTSC_WIDTH,NTSC_HEIGHT);
v4l_mmap_init(vd);
//开始获取图
v4l_grab_sync(vd,vd->frame_current);//等待传完一帧
while(1)
{ vd->frame_current^=1;
v4l_grab_start(vd,vd->frame_current);
v4l_grab_sync(vd,vd->frame_current);
buffer=(char *)v4l_get_address(vd);//得到这一帧的地址
printf("img address %p
",buffer);
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE * infile;
// (void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
unsigned char *buffer1;
if((infile=fopen(buffer,"rb"))==NULL){
fprintf(stderr,"open %s failed
",*buffer);
exit(-1);
}
cinfo.err=jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo,infile);
jpeg_read_header(&cinfo,TRUE);
jpeg_start_decompress(&cinfo);
if((cinfo.output_width>vinfo.xres)||(cinfo.output_height>vinfo.yres)){
printf("too large JPEG file,can't display
");
return (-1);
}
buffer1=(unsigned char *)malloc(cinfo.output_width*cinfo.output_components);
y=0;
while(cinfo.output_scanline<cinfo.output_height){
jpeg_read_scanline(&cinfo,&buffer1,1);
if(vinfo.bits_per_pixel==16){
unsigned short color;
for(x=0;x<cinfo.output_width;x++){
color=RGB888toRGB565(buffer1[x*3],buffer1[x*3+1],buffer1[x*3+2]);
fb_pixel(fbp,vinfo.xres,vinfo.yres,x,y,color);
}
}else if(vinfo.bits_per_pixel==24){
memcpy((unsigned char *)fbp+y*vinfo.xres*3,buffer1,cinfo.output_width*cinfo.output_components);
}
y++;
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
free(buffer1);
fclose(infile);
}
v4l_close(vd);
return 0;
}
-
一周热门 更多>