2 patches to uvcvideo source and motion source to get 2 cameras working
Description of Patch
Because I will probably forget to post this otherwise, here are 2 patches to both (recent SVN) uvcvideo source and motion source to get 2 uvcvideo cameras working with motion.
I had a problem (also reported on the motion mailing lists recently) in that 2 uvcvideo devices would not work together (1 would using YUYV). I don't know why YUYV didn't work - it's USB2 and bandwidth shouldn't be an issue IMHO. I tried forcing MJPEG in the config file as a workaround but "v4l2_palette 2" would never work because priority was given to higher values of v4l2_palette, regardless of config gile.
So I sorta fixed a bug in motion to make sure it is respected (there are probably better ways of fixing that).
Then I discovered that certain ioctls (VIDIOC_G_JPEGCOMP, VIDIOC_S_JPEGCOMP) were not implemented in the uvcvideo source. Luckily, Jim Studt had posted a patch a while ago on Linux-uvc-devel, which still didn't make it into the SVN version for some reason.
Both changes enabled me to get multiple uvcvideo devices working with MJPEG - I hope this helps others too.
Installation of Patch
Download the patch file. If it is packed as a gz or tar.gz unpack it first. Then copy it to the motion source directory and issue the command (assuming the patch file is called filename_of_patch_file.diff)
patch < filename_of_patch_file.diff
Then re-build Motion and test the patch.
Change History of Patch
You patch for uvcvideo is out of the scope of motion , but could help people ... but why not send it to video4linux mailing list ? So if it's worth will be merged
i 2.6.27.
About v4l2_palette , i don't get your point .. i have tried a uvc webcam :
*v4l2_palette 8*
[1] Supported palettes:
[1] 0: MJPG (MJPEG)
[1] 1: YUYV (YUV 4:2:2 (YUYV))
[0] motion-httpd/3.2.10.branch-r392 running, accepting connections
[0] motion-httpd: waiting for data on port TCP 8080
[1] index_format 6 Test palette YUYV (320x240)
[1] Using palette YUYV (320x240) bytesperlines 640 sizeimage 2621440 colorspace 0000000
v4l2_palette 2
[1] Supported palettes:
[1] 0: MJPG (MJPEG)
[1] Selected palette MJPG
[0] motion-httpd/3.2.10.branch-r392 running, accepting connections
[0] motion-httpd: waiting for data on port TCP 8080
[1] index_format 2 Test palette MJPG (320x240)
[1] Using palette MJPG (320x240) bytesperlines 0 sizeimage 2621440 colorspace 00000000
So you can see that is working as expected , could you post your output ... could be a bug in uvcvideo ?
About bandwidth look at last line of each , pay attention to bytesperlines value ... , also i read somewhere didn't check that no matter
what resolution you specify to capture uvcvideo always requests highest resolution supported by webcam to usb bus, so i might be a way
to know what is the bandwidth requested by uvcvideo for each paletter/resolutions & number of buffers.
--
AngelCarpintero - 25 Jul 2008
Hi, thanks for your comments. I realise the uvcvideo patch it is out of scope and I will send it (again) to the relevant list - it's not my patch though.
Re: motion; it really is a bug; I added some debugging statements and since the loop in video2.c is performed twice on my webcams (once for every format the webcam supports I think), "i" is already 6 (YUYV) and can never become 2 (MJPEG) again. My fix probably isn't the right one, but it worked for me.
Here's the (unpatched) motion config/output refusing to use MJPEG
:
phobos:/usr/local/bin # su motion -c ./motion-3.2.10.1
[0] Processing thread 0 - config file /usr/local/etc/motion.conf
[0] Processing config file /home/_webcam/philips3/thread3.conf
[0] Processing config file /home/_webcam/philips2/thread2.conf
[0] Processing config file /home/_webcam/philips1/thread1.conf
[0] Motion 3.2.10.1 Started
[0] Motion going to daemon mode
phobos:/usr/local/bin # su motion -c "./motion-3.2.10.1 -n"
[0] Processing thread 0 - config file /usr/local/etc/motion.conf
[0] Processing config file /home/_webcam/philips3/thread3.conf
[0] Processing config file /home/_webcam/philips2/thread2.conf
[0] Processing config file /home/_webcam/philips1/thread1.conf
[0] Motion 3.2.10.1 Started
[0] ffmpeg LIBAVCODEC_BUILD 3357184 LIBAVFORMAT_BUILD 3411968
[0] Thread 1 is from /home/_webcam/philips3/thread3.conf
[0] Thread 2 is from /home/_webcam/philips2/thread2.conf
[0] Thread 3 is from /home/_webcam/philips1/thread1.conf
[1] Thread 1 started
[1] cap.driver: "uvcvideo"
[1] cap.card: "Hercules Dualpix Exchange"
[1] cap.bus_info: "0000:00:07.2"
[1] cap.capabilities=0x04000001
[1] - VIDEO_CAPTURE
[1] - STREAMING
[1] v4l2_select_input: name = "Camera 1", type 0x00000002, status 00000000
[1] - CAMERA
[1] Device doesn't support VIDIOC_G_STD
[1] Supported palettes:
[1] 0: YUYV (YUV 4:2:2 (YUYV))
[1] 1: MJPG (MJPEG)
[2] Thread 2 started
[3] Thread 3 started
[1] index_format 6 Test palette YUYV (640x480)
[1] Using palette YUYV (640x480) bytesperlines 1280 sizeimage 614400 colorspace 00000000
[1] found control 0x00980900, "Brightness", range -64,64
[1] "Brightness", default 0, current 0
[1] found control 0x00980901, "Contrast", range 0,64
[1] "Contrast", default 32, current 32
[1] found control 0x00980902, "Saturation", range 0,128
[1] "Saturation", default 54, current 54
[1] found control 0x00980903, "Hue", range -40,40
[1] "Hue", default 0, current 0
[1] found control 0x0098090e, "White Balance Red Component", range 1,500
[1] "White Balance Red Component", default 100, current 100
[1] found control 0x0098090f, "White Balance Blue Component", range 1,500
[1] "White Balance Blue Component", default 100, current 100
[1] found control 0x00980910, "Gamma", range 72,500
[1] "Gamma", default 100, current 100
[1] found control 0x00980913, "Gain", range 0,100
[1] "Gain", default 0, current 0
[1] mmap information:
[1] frames=4
[1] 0 length=614400
[1] 1 length=614400
[1] 2 length=614400
[1] 3 length=614400
[1] Using V4L2
[1] Resizing pre_capture buffer to 1 items
[2] cap.driver: "uvcvideo"
[2] cap.card: "Hercules Dualpix Exchange"
[2] cap.bus_info: "0000:00:07.2"
[2] cap.capabilities=0x04000001
[2] - VIDEO_CAPTURE
[2] - STREAMING
[2] v4l2_select_input: name = "Camera 1", type 0x00000002, status 00000000
[2] - CAMERA
[2] Device doesn't support VIDIOC_G_STD
[2] Supported palettes:
[2] 0: YUYV (YUV 4:2:2 (YUYV))
[2] 1: MJPG (MJPEG)
[2] index_format 6 Test palette YUYV (640x480)
[2] Using palette YUYV (640x480) bytesperlines 1280 sizeimage 614400 colorspace 00000000
[2] found control 0x00980900, "Brightness", range -64,64
[2] "Brightness", default 0, current 0
[2] found control 0x00980901, "Contrast", range 0,64
[2] "Contrast", default 32, current 32
[2] found control 0x00980902, "Saturation", range 0,128
[2] "Saturation", default 54, current 54
[2] found control 0x00980903, "Hue", range -40,40
[2] "Hue", default 0, current 0
[2] found control 0x0098090e, "White Balance Red Component", range 1,500
[2] "White Balance Red Component", default 100, current 100
[2] found control 0x0098090f, "White Balance Blue Component", range 1,500
[2] "White Balance Blue Component", default 100, current 100
[2] found control 0x00980910, "Gamma", range 72,500
[2] "Gamma", default 100, current 100
[2] found control 0x00980913, "Gain", range 0,100
[2] "Gain", default 0, current 0
[2] mmap information:
[2] frames=4
[2] 0 length=614400
[2] 1 length=614400
[2] 2 length=614400
[2] 3 length=614400
[2] Error starting stream.
[2] VIDIOC_STREAMON: No space left on device
[2] ioctl(VIDIOCGMBUF) - Error device does not support memory map
[2] V4L capturing using read is deprecated!
[2] Motion only supports mmap.
[2] Could not fetch initial image from camera
[2] Motion continues using width and height from config file(s)
[2] Resizing pre_capture buffer to 1 items
[2] Started stream webcam server in port 8882
[2] Resizing pre_capture buffer to 3 items
[3] cap.driver: "uvcvideo"
[3] cap.card: "VF0410 Live! Cam Video IM Pro"
[3] cap.bus_info: "0000:00:07.2"
[3] cap.capabilities=0x04000001
[3] - VIDEO_CAPTURE
[3] - STREAMING
[3] v4l2_select_input: name = "Camera 1", type 0x00000002, status 00000000
[3] - CAMERA
[3] Device doesn't support VIDIOC_G_STD
[3] Supported palettes:
[3] 0: YUYV (YUV 4:2:2 (YUYV))
[3] 1: MJPG (MJPEG)
[3] index_format 6 Test palette YUYV (640x480)
[3] Using palette YUYV (640x480) bytesperlines 1280 sizeimage 614400 colorspace 00000000
[3] found control 0x00980900, "Brightness", range -64,64
[3] "Brightness", default 0, current 0
[3] found control 0x00980901, "Contrast", range 0,64
[3] "Contrast", default 32, current 32
[3] found control 0x00980902, "Saturation", range 0,128
[3] "Saturation", default 64, current 64
[3] found control 0x00980903, "Hue", range -40,40
[3] "Hue", default 0, current 0
[3] found control 0x00980910, "Gamma", range 72,500
[3] "Gamma", default 100, current 100
[3] found control 0x00980913, "Gain", range 0,100
[3] "Gain", default 0, current 0
[3] mmap information:
[3] frames=4
[3] 0 length=614400
[3] 1 length=614400
[3] 2 length=614400
[3] 3 length=614400
[3] Error starting stream.
[3] VIDIOC_STREAMON: No space left on device
[3] ioctl(VIDIOCGMBUF) - Error device does not support memory map
[3] V4L capturing using read is deprecated!
[3] Motion only supports mmap.
[3] Could not fetch initial image from camera
[3] Motion continues using width and height from config file(s)
[3] Resizing pre_capture buffer to 1 items
[3] Started stream webcam server in port 8881
[3] Resizing pre_capture buffer to 3 items
[1] Started stream webcam server in port 8883
[1] Resizing pre_capture buffer to 3 items
[2] Thread exiting
[3] Thread exiting
[1] Thread exiting
[1] Calling vid_close() from motion_cleanup
[1] Closing video device /dev/video2
[0] Motion terminating
--
GerritHannaert - 25 Jul 2008
Gerrit Thanks , nevermind about that issue ... going to take a fix it in trunk and backport to 3.2.10 branch
--
AngelCarpintero - 25 Jul 2008
Committed to svn trunk.
--
AngelCarpintero - 28 Jul 2008
Hi everybody,
thanks for the patches. After some painful days I finally got motion running with my Quickcam. Unfortunately the patch does not work (anymore) without a small tweak. Why is it not becoming merged into the uvc code?
I summarized my experiences here:
http://www.yeap.de/blog2.0/archives/165-Logitech-Quickcam-on-Ubuntu-Linux.html
--
JoernSchimmelpfeng - 06 Jan 2009
My cam zc301 which only support a v4l device!
how can i set the palette format is JPEG!
can you help me!
--
LikelinuxLikelinux - 05 Nov 2010