Chinaunix首页 | 论坛 | 博客
  • 博客访问: 708210
  • 博文数量: 759
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 4775
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-22 15:16
文章分类

全部博文(759)

文章存档

2008年(759)

我的朋友

分类:

2008-09-25 15:55:54

我写的一个设想头采集数据经过网络收发的程序。

/* main 函数  */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#include "video.h"
#include "main.h"
#include "getpic.h"

#define MAXBUF (1024*20)

int main(int argc, char **argv)
{
        int sockfd, new_fd;
        socklen_t len;
        struct sockaddr_in my_addr, their_addr;
       
        unsigned int myport, lisnum;
       
        FILE *fp;  /* target file */
        char* filename = "grab.jpeg";       

        char *buf = NULL;
        int file_size = 0;

        fd_set rfds;
       
        struct timeval tv;
        int retval, maxfd = -1;

        if (argv[1])
                myport = atoi(argv[1]);
        else
                myport = SERVER_PORT;
       
        if (argv[2])
                lisnum = atoi(argv[2]);
        else
                lisnum = LENGTH_OF_LISTEN_QUEUE;
        if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
        {
                perror("socket");
                exit(1);
        }
        bzero(&my_addr, sizeof(my_addr));
        my_addr.sin_family = PF_INET;
        my_addr.sin_port = htons(myport);
       
        if (argv[3])
                my_addr.sin_addr.s_addr = inet_addr(argv[3]);
        else
                my_addr.sin_addr.s_addr = INADDR_ANY;

        if (bind(sockfd, (struct sockaddr *) &my_addr, \
                sizeof(struct sockaddr)) == -1)
        {       
                perror("bind");
                exit(1);
        }
        if (listen(sockfd, lisnum) == -1)
        {
                perror("listen");
                exit(1);
        }



        while (1)
        {
                printf("\n--Wating for connecte!--颅\n");
                len = sizeof(struct sockaddr);
                if ((new_fd = accept(sockfd, \
                        (struct sockaddr *)&their_addr, &len)) == -1)
                {
                        perror("accept");
                        exit(errno);
                }else{
                        printf("server: got connection from %s, \
                        port %d, socket %d\n",\
                        inet_ntoa(their_addr.sin_addr),\
                        ntohs(their_addr.sin_port), new_fd);
                }
                while(1)
                {

                get_pic(); //问题就出在这里

                if ((fp = fopen(filename, "r+b")) == NULL)
                {
                        perror("open");
                        exit(1);
                }
                fseek(fp, 0, SEEK_END);
                file_size = ftell(fp);
                buf = (char*)malloc((int)(file_size+2));
                memset(buf, 0, file_size+2);
                fseek(fp, -(file_size), SEEK_END);
                fread(buf, file_size, 1, fp);
                len = send(new_fd, buf, \
                        file_size, 0);
                if (len > 0)
                {
                        printf("Sending %s, length %d\n", buf, len);
                }else{
                        printf("%s,%s'\n", buf, \
                        errno, strerror(errno));
                        break;
                }
               
                fclose(fp);
                }
      
                close(new_fd);
        }
       
        close(sockfd);
       
        return 0;
}


/*getpic*/
int get_pic(void)
{
        v4l_device *vd;
        char *image_ptr;
//        printf("open v4l\n");
       
        v4l_open(vd);
        v4l_mmap(vd);
//        img = (char *)v4l_open(vd);
        image_ptr = (char *)v4l_get_data(vd);
        rgb_to_jpeg(JPEG_NAME, (unsigned char *)image_ptr, 20, 0);
       
        v4l_ummap(vd);
        v4l_close(vd);
        return 0;

}

如果按照上面那种方式就是对的。
但是如果写成下面这样的:用gdb调试发现在v4l_open()这个函数这里提示:段错误。为什么呢?

int main(int argc, char **argv)
{
        int sockfd, new_fd;
        socklen_t len;
        struct sockaddr_in my_addr, their_addr;
       
        unsigned int myport, lisnum;
       
        FILE *fp;  /* target file */
        char* filename = "grab.jpeg";       

        char *buf = NULL;
        int file_size = 0;

        fd_set rfds;
       
        struct timeval tv;
        int retval, maxfd = -1;
        if (argv[1])
                myport = atoi(argv[1]);
        else
                myport = SERVER_PORT;
       
        if (argv[2])
                lisnum = atoi(argv[2]);
        else
                lisnum = LENGTH_OF_LISTEN_QUEUE;
        if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
        {
                perror("socket");
                exit(1);
        }
        bzero(&my_addr, sizeof(my_addr));
        my_addr.sin_family = PF_INET;
        my_addr.sin_port = htons(myport);
       
        if (argv[3])
                my_addr.sin_addr.s_addr = inet_addr(argv[3]);
        else
                my_addr.sin_addr.s_addr = INADDR_ANY;
        if (bind(sockfd, (struct sockaddr *) &my_addr, \
                sizeof(struct sockaddr)) == -1)
        {       
                perror("bind");
                exit(1);
        }
        if (listen(sockfd, lisnum) == -1)
        {
                perror("listen");
                exit(1);
        }

        v4l_open(vd);   //

        while (1)
        {
                printf("\n--Wating for connecte!--颅\n");
                len = sizeof(struct sockaddr);
                if ((new_fd = accept(sockfd, \
                        (struct sockaddr *)&their_addr, &len)) == -1)
                {
                        perror("accept");
                        exit(errno);
                }else{
                        printf("server: got connection from %s, \
                        port %d, socket %d\n",\
                        inet_ntoa(their_addr.sin_addr),\
                        ntohs(their_addr.sin_port), new_fd);
                }
                while(1)
                {
        v4l_mmap(vd);  //  不同之处
        image_ptr = (char *)v4l_get_data(vd);  //修改
        rgb_to_jpeg(JPEG_NAME, (unsigned char *)image_ptr, 20, 0); //修改

                if ((fp = fopen(filename, "r+b")) == NULL)
                {
                        perror("open");
                        exit(1);
                }
                fseek(fp, 0, SEEK_END);
                file_size = ftell(fp);
                buf = (char*)malloc((int)(file_size+2));
                memset(buf, 0, file_size+2);
                fseek(fp, -(file_size), SEEK_END);
                fread(buf, file_size, 1, fp);
                len = send(new_fd, buf, \
                        file_size, 0);
                if (len > 0)
                {
                        printf("Sending %s, length %d\n", buf, len);
                }else{
                        printf("%s,%s'\n", buf, \
                        errno, strerror(errno));
                        break;
                }
               
                fclose(fp);
        v4l_ummap(vd); //修改
                }
      
                close(new_fd);


        }
                v4l_close(vd); //修改
        close(sockfd);
       
        return 0;
}

/*v4l的几个函数的定义在此*/

char *v4l_get_address(v4l_device *vd)
{
        return (vd->map + vd->mbuf.offsets[vd->frame_current]);
}

int v4l_open(v4l_device *vd)
{
//open device
        if ((vd->fd = open(VD_NAME, O_RDWR)) < 0)
        {
                perror("v4l_open");
                return ERR_VIDEO_OPEN;
        }

//get capability
        if (ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) == -1)
        {
                perror("v4l open : VIDOCGCAP");
//                return ERR_VIDEO_GCAP;
        }
        if ((vd->capability.type & VID_TYPE_CAPTURE) == 0)
        {
                perror("v4l open :VID_TYPE_CAPTURE");
//                return ERR_VID_TYPE_CAP;
        }
       
        printf("capability.name: %s\n", vd->capability.name);
        printf("Type:%d\n", vd->capability.type);

        if(debug){
        printf("Maxwidth:%d, Maxheight:%d\n",  \
                vd->capability.maxwidth, vd->capability.maxheight);
        printf("Minwidth:%d, Minheight:%d\n", \
                vd->capability.minwidth, vd->capability.minheight);}


//get picture
        if (ioctl(vd->fd, VIDIOCGPICT, &(vd->picture)) < 0)
        {
                perror("v4l get picture: VIDIOCGPICT");
                return ERR_VIDEO_GPIC;
        }
        if(debug)
        {
                printf("picture.palette : %d ", vd->picture.palette);
                printf("picture.depth: %d\n", vd->picture.depth);
        }

//set picture
        vd->picture.depth = DEFULT_DEPTH;
        vd->picture.palette = DEFULT_PAL;
        if (ioctl(vd->fd, VIDIOCSPICT, &(vd->picture)) < 0)
        {
                perror("v4l set picture: VIDIOCSPICT");
//                return ERR_VIDEO_SPIC;
        }
        if (ioctl(vd->fd, VIDIOCGPICT, &(vd->picture)) < 0)
        {
                perror("v4l get picture: VIDIOCGPICT");
                return ERR_VIDEO_GPIC;
        }
        if(debug){
        printf("picture.palette : %d ", vd->picture.palette);
        printf("picture.depth: %d\n", vd->picture.depth);}



//get channels
        int m = 0;
        for(m = 0; m < vd->capability.channels; m++)
        {
                vd->channel[m].channel = m;

                if(ioctl(vd->fd, VIDIOCGCHAN, \
                        &(vd->channel[m])) < 0)
                {
                        perror("v4l get channels: VIDIOCGCHAN");
                        return ERR_VIDEO_GCHAN;
                }
                vd->channel[m].norm = VIDEO_MODE_NTSC;
               
                if(ioctl(vd->fd, VIDIOCSCHAN, &(vd->channel[m])) < 0)
                {
                        perror("vel get channels: VIDIOCSCHAN");
                        return ERR_VIDEO_SCHAN;
                }
                       
        }
        if(debug)
                printf("Channels:%d, ", vd->capability.channels+1);


//mmap_init
        vd->mmap.width = IMGWIDTH;
        vd->mmap.height = IMGHEIGHT;
        vd->mmap.format = vd->picture.palette;
        vd->frame_current = 0;
        vd->frame_using[0] = vd->frame_using[1] = 0;

//get buffer
        if(ioctl(vd->fd, VIDIOCGFBUF, &(vd->buffer)) < 0)
        {
                perror("v4l get mbuf: VIDIOCGFBUF");
                return ERR_GET_BUF;
        }
//        printf("buffer.height: %d ", vd->buffer.height);
//        printf("buffer.width: %d\n", vd->buffer.width);

        return 0;
}

int v4l_mmap(v4l_device *vd)
{

///mmap_init
        if (ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf)) < 0)
        {
                perror("v4l get mbuf: VIDIOCGMBUF");
                return ERR_GET_BUF;
        }
        if(debug)
                    printf(" Pic Size:%d\n", vd->mbuf.size);
       
        if ((vd->map = (char*)mmap(0, vd->mbuf.size, \
                PROT_READ|PROT_WRITE, MAP_SHARED, vd->fd, 0)) < 0)
        {
                perror("v4l mmap : map");
                return ERR_MAP_SHARED;
        }
       
        return 0;
}

int v4l_get_data(v4l_device *vd)
{
        char *img_tmp;

//grab frame
        struct timeval tpstart,tpend;
        float timeuse;
        gettimeofday(&tpstart,NULL);

        vd->mmap.frame = 0;
        if (ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) == -1 )
        {
       
                perror("v4l grab start : VIDIOCMCAPTURE");
                return ERR_MCAPT;
        }
        vd->frame_using[0] = 1, vd->frame_current = 0;


        gettimeofday(&tpend,NULL);
        timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec) + \
                tpend.tv_usec-tpstart.tv_usec;
        timeuse/=1000000;
        if(debug)
                printf("timeuse: %f\n", timeuse);

//grab sync
        gettimeofday(&tpstart,NULL);
        if (ioctl(vd->fd, VIDIOCSYNC, &(vd->frame_current)) < 0)
        {
                perror("v4l suyc: VIDIOCSYNC");
                return ERR_SYNC;
        }
        vd->frame_using[vd->frame_current] = 0;


//
        gettimeofday(&tpend,NULL);
        timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec) + \
                tpend.tv_usec-tpstart.tv_usec;
        timeuse/=1000000;
        if(debug)
                printf("timeuse: %f\n", timeuse);
        if(debug)
                printf("offsets :%d \n", \
                        vd->mbuf.offsets[vd->frame_current]);


// return 1
        img_tmp = vd->map + vd->mbuf.offsets[vd->frame_current];
        return (int)img_tmp;

}

int v4l_ummap(v4l_device *vd)
{
        munmap(vd->map, vd->mbuf.size);
        return 0;
}

int v4l_close(v4l_device *vd)
{
        close(vd->fd);
        return 0;
}

void rgb_to_jpeg (char *filename, unsigned char *img, int quality, int gray);


帮忙看看为什么呢

[ 本帖最后由 zonewone 于 2008-4-25 15:46 编辑 ]

--------------------next---------------------

阅读(294) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~