Hi,

I tried to write a simple program which reads a webcam out and saves the
picture in a file. The camera is a Philips SPC1030NC with the uvc driver.

But the program doesn't work. The pictures look like the image [1] and
I get this output from my program, which is attached:

       Width: 640 Height: 480 Pixelformat: 1196444237
libv4lconvert: Error decompressing JPEG: fill_nbits error: need 2 more bits
       Fertig!

What have I to change in my program?

Regards, Joern

[1] http://royalclan.de/files/forum/webcam_image.ppm
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdlib.h>
//#include <libv4l1.h>
#include <libv4l2.h>
//#include <linux/videodev.h>
#include <linux/videodev2.h>



int main()
{
        struct v4l2_format format;
        char *data;
        int fd;


        fd = v4l2_open("/dev/video0", O_RDWR);

        //Einstelllungen auslesen
        format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        if(v4l2_ioctl(fd,VIDIOC_G_FMT, &format)<0){
                printf("Error getting Camera info");
        }

        printf("Width: %d Height: %d Pixelformat: %d\r\n", 
format.fmt.pix.width, format.fmt.pix.height, format.fmt.pix.pixelformat);

        format.fmt.pix.width=640;
        format.fmt.pix.height=480;
        format.fmt.pix.pixelformat=V4L2_PIX_FMT_RGB24;

        //Werte setzen
        if(v4l2_ioctl(fd, VIDIOC_S_FMT, &format)<0){
                printf("Error setting Camera settings");
        }

        //Speicher für Bild reservieren
        data = malloc((format.fmt.pix.sizeimage*3));
        if(data==NULL){
                printf("Error getting space for image");
                return 1;
        }

        //Bild einlesen
        if(v4l2_read(fd, data, format.fmt.pix.sizeimage*3) < 0){
                printf("v4l2_read() returned error \r\n");
        }

        //Ausgabedatei öffnen + Header schreiben
        FILE * img = fopen("webcam_image.ppm","w");
        fprintf(img, "P6\n%d %d\n255\n",format.fmt.pix.width, 
format.fmt.pix.height);

        fwrite(data, (format.fmt.pix.sizeimage*3),1, img);

        fclose(img);
        v4l2_close(fd);

        printf("Fertig!\r\n");

   return 0;
}

Reply via email to