On Tue, 2007-04-12 at 08:53 +0100, Ilyes Gouta wrote: ... > Could you unload the driver (rmmod), quit the application and try again (i.e > insmod the driver again and execute > LiveCam)? I'm aware of this issue in the driver, and I got the same behavior > with my previous test application, > v4l2dumper.c .
I tried this, but no change. The only change I eventually got was that the status line reports 'BisonCam @ X FPS', with X between 25 and 28. Thanks, Torsten > > BR, > Ilyes Gouta. > > Torsten Spindler wrote: > > When I open LiveCam and select Capture, the application hangs. The > > bottom status line read 'BisonCam @ 0 FPS'. > > > > Bye, > > Torsten > > > > > > On Sun, 2007-02-12 at 15:13 +0100, Ilyes Gouta wrote: > >> Hi Fellow, > >> > >> I updated the m5602-ov9560-2 and livecam branches yesterday and I was > >> wondering if you guys could give it a shot just to see if you can get > >> something (using livecam, bayer stream only) from your sensors. > >> > >> Just to recall it a bit, you can check out your livecam from the > >> following URL: > >> > >> https://livecam.svn.sourceforge.net/svnroot/livecam/trunk > >> > >> LiveCam has the ability to alter the pitch of the pictures on the fly. > >> The option is available through Debug | Adjust Pitch, from the > >> application's menu. > >> > >> Waiting for your reports. > >> > >> BR, > >> Ilyes Gouta. > >> > >> ------------------------------------------------------------------------- > >> SF.Net email is sponsored by: The Future of Linux Business White Paper > >> from Novell. From the desktop to the data center, Linux is going > >> mainstream. Let it simplify your IT future. > >> http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4 > >> _______________________________________________ > >> M560x-driver-devel mailing list > >> [email protected] > >> https://lists.sourceforge.net/lists/listinfo/m560x-driver-devel > > > > > plain text document attachment (v4l2dumper.c) > /*************************************************************************** > * Copyright (C) 2006 by Ilyes Gouta * > * [EMAIL PROTECTED] * > * * > * This program is free software; you can redistribute it and/or modify * > * it under the terms of the GNU General Public License as published by * > * the Free Software Foundation; either version 2 of the License, or * > * (at your option) any later version. * > * * > * This program is distributed in the hope that it will be useful, * > * but WITHOUT ANY WARRANTY; without even the implied warranty of * > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * > * GNU General Public License for more details. * > * * > * You should have received a copy of the GNU General Public License * > * along with this program; if not, write to the * > * Free Software Foundation, Inc., * > * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * > ***************************************************************************/ > > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > #include <fcntl.h> > #include <time.h> > > #include <sys/time.h> > #include <sys/stat.h> > #include <sys/ioctl.h> > #include <sys/mman.h> > > #undef __STRICT_ANSI__ > #include <linux/types.h> > #include <linux/videodev2.h> > > #include <pthread.h> > > #define CAPTURE_BUFFERS 32 > > static int fd; > static volatile int bCapture; > static pthread_t hThread; > > static struct v4l2_buffer *pBuffers; > static struct v4l2_format fmt; > static unsigned char **pRawData; > > static char* pFNPrefix; > > void* WorkerThread(void* pData) > { > struct v4l2_buffer buffer; > struct timespec req, rem; > char filename[256]; > int count = 0; > FILE *hFile; > > while (bCapture) > { > buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; > if (ioctl(fd, VIDIOC_DQBUF, &buffer) >= 0) > { > sprintf(filename, "%s%d.raw", pFNPrefix, count); > printf("dumping frame %d (buffer index: %d) in %s\n", count, > buffer.index, filename); > > hFile = fopen(filename, "wb"); > fwrite(pRawData[buffer.index], 1, fmt.fmt.pix.sizeimage, hFile); > fclose(hFile); > > count++; > if (!bCapture) break; > > buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; > ioctl(fd, VIDIOC_QBUF, &buffer); > } else { > printf("VIDIOC_DQBUF failed.\n"); > } > > /* wait for 30 ms */ > req.tv_sec = 0; > req.tv_nsec = 33000000; > nanosleep(&req, &rem); > } > > return NULL; > } > > void initialize() > { > fd = -1; > pBuffers = (struct v4l2_buffer*)malloc(CAPTURE_BUFFERS * sizeof(struct > v4l2_buffer)); > pRawData = (unsigned char**)malloc(CAPTURE_BUFFERS * sizeof(unsigned > char*)); > } > > void finalize() > { > if (pBuffers) free(pBuffers); > if (pRawData) free(pRawData); > > pBuffers = NULL; > pRawData = NULL; > } > > int start(char* devname) > { > struct v4l2_capability caps; > struct v4l2_requestbuffers request; > int i, type, result; > > fd = open(devname, O_RDWR); > if (fd == -1) return 0; > > if (ioctl(fd, VIDIOC_QUERYCAP, &caps) == -1) { > close(fd); fd = -1; > return 0; > } > > printf("device name: %s\n", (char*)caps.card); > > if (!(caps.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { > close(fd); fd = -1; > printf("device doesn't support V4L2.\n"); > return 0; > } > > fcntl(fd, F_SETFD, FD_CLOEXEC); > > fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; > fmt.fmt.pix.width = 640; > fmt.fmt.pix.height = 480; > fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_SBGGR8; > > result = ioctl(fd, VIDIOC_TRY_FMT, &fmt); > if (result < 0) { > printf("VIDIOC_TRY_FMT failed.\n"); > } > > printf("picture size: %d\n", fmt.fmt.pix.sizeimage); > > /* set the capture format */ > if (ioctl(fd, VIDIOC_S_FMT, &fmt) == -1) { > close(fd); fd = -1; > printf("device doesn't support this capture format.\n"); > return 0; > } > > memset(&request, 0, sizeof(struct v4l2_requestbuffers)); > > request.count = CAPTURE_BUFFERS; > request.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; > request.memory = V4L2_MEMORY_MMAP; > > /* set the type of the capture */ > if (ioctl(fd, VIDIOC_REQBUFS, &request) == -1) { > close(fd); fd = -1; > printf("VIDIOC_REQBUFS failed.\n"); > return 0; > } > > for (i = 0; i < CAPTURE_BUFFERS; i++) > { > memset(&pBuffers[i], 0, sizeof(struct v4l2_buffer)); > > pBuffers[i].index = i; > pBuffers[i].type = V4L2_BUF_TYPE_VIDEO_CAPTURE; > pBuffers[i].memory = V4L2_MEMORY_MMAP; > > if (ioctl(fd, VIDIOC_QUERYBUF, &pBuffers[i], 0)) { > close(fd); fd = -1; > printf("VIDIOC_QUERYBUF failed.\n"); > return 0; > } > > /* obtain a userspace pointer on the capture buffer */ > void *pData = mmap(NULL, pBuffers[i].length, PROT_READ | PROT_WRITE, > MAP_SHARED, fd, pBuffers[i].m.offset); > if (pData == (void*)-1) { > close(fd); fd = -1; > printf("mmap failed. buffer length: %d, offset:0x%x\n", > pBuffers[i].length, pBuffers[i].m.offset); > return 0; > } > > pRawData[i] = (unsigned char*)pData; > } > > /* queue the buffers for capture*/ > for (i = 0; i < CAPTURE_BUFFERS; i++) { > ioctl(fd, VIDIOC_QBUF, &pBuffers[i]); > } > > /* start the capture */ > type = V4L2_BUF_TYPE_VIDEO_CAPTURE; > if (ioctl(fd, VIDIOC_STREAMON, &type) == -1) { > close(fd); fd = -1; > printf("failed starting capture.\n"); > return 0; > } > > bCapture = 1; > if (pthread_create(&hThread, NULL, WorkerThread, NULL)) { > close(fd); fd = -1; > return 0; > } > > return 1; > } > > void stop() > { > if (fd == -1) return; > > bCapture = 0; > > /* stop the capture */ > int type = V4L2_BUF_TYPE_VIDEO_CAPTURE; > ioctl(fd, VIDIOC_STREAMOFF, &type); > > pthread_join(hThread, NULL); > close(fd); fd = -1; > } > > int main(int argc, char** argv) > { > if (argc != 2) { > printf("usage:\n\t$ v4l2dumper <filename prefix>\n"); > return 0; > } > > pFNPrefix = argv[1]; > > initialize(); > > if (start("/dev/video0")) { > sleep(3); > stop(); > } > > finalize(); > return 0; > } ------------------------------------------------------------------------- SF.Net email is sponsored by: The Future of Linux Business White Paper from Novell. From the desktop to the data center, Linux is going mainstream. Let it simplify your IT future. http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4 _______________________________________________ M560x-driver-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/m560x-driver-devel
