Re: [libdc1394-devel] Version 2.0.0-pre2
Capture and control API for IIDC compliant cameras
Brought to you by:
ddouxchamps,
gordp
From: Damien D. <ddo...@is...> - 2005-05-11 02:41:35
|
Hi Don, Thanks for the report. More comments below... On Tue, 2005-05-10 at 14:10 -0700, Don Murray wrote: > Hi Damien... (sorry, apparently I can't make a bug report short), > > I haven't tried coriander for a while (since I never got time to look > into the X alloc problems I was encountering). But since things have > change a bit I thought I'd try out your latest and greatest. > > I'm using a vanilla, out-of-the-box FC3 system. I CVS'd out the tip of > coriander and I downloaded the libdc1394 tarball from the link below. > > Libdc1394 built fine. Good news :-) > Coriander gave me a problem on the final link: Bad news :-( > gcc -g -O2 -o coriander main.o support.o interface.o error.o > definitions.o camera.o thread_base.o thread_iso.o watch_thread.o > SDLEvent.o thread_display.o thread_ftp.o thread_save.o thread_v4l.o > tools.o conversions.o callbacks.o update_frames.o build_frames.o > update_windows.o build_windows.o build_menus.o update_ranges.o > build_ranges.o topology.o preferences.o video_encode.o subtitles.o > -Wl,--export-dynamic -pthread -L/usr/X11R6/lib -lgnomeui-2 -lSM -lICE > -lbonoboui-2 -lxml2 -lpthread -lz -lgnomecanvas-2 -lgnome-2 -lpopt > -lart_lgpl_2 -lpangoft2-1.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 > -lgdk_pixbuf-2.0 -lpangoxft-1.0 -lpangox-1.0 -lpango-1.0 -lgobject-2.0 > -lbonobo-2 -lgconf-2 -lgnomevfs-2 -lbonobo-activation -lORBit-2 -lm > -lgmodule-2.0 -ldl -lgthread-2.0 -lglib-2.0 -L/usr/lib -lSDL > -lpthread -ldc1394_control -lraw1394 -lXv -lgthread > /usr/lib/libgthread.so: undefined reference to `g_mutex_init' > /usr/lib/libgthread.so: undefined reference to `g_mem_init' > /usr/lib/libgthread.so: undefined reference to `g_messages_init' > > After dredging /usr/lib for a symbol called "g_mutex_init" I found it in > libglib.a. So I changed the backend of that gcc line to look like: > -lraw1394 -lXv -lglib -lgthread and it compiled. Not sure if that is > dangerous or not. I'm not sure what the right solution is in this > case... maybe a later version of glib-2.0 has the symbol. Nice catch. I got the solution from google: I should change -lgthread to -lgthread-2.0 . My system has both gnome 1.4 and 2.x installed so the problem did not appear; you had a problem because FC3 is gnome2 only. > I then went to run coriander and I get: > > Libdc1394 error (dc1394_control.c:dc1394_get_camera_info:378): Tagged > register not found : Could not get unit directory offset > Libdc1394 error (dc1394_control.c:dc1394_find_cameras:145): Can't check > if node is a camera : > > I'm running this on a computer which has 2 1394 cards. A testlibraw yields: > successfully got handle > current generation number: 2 > 2 card(s) found > nodes on bus: 1, card name: ohci1394 > nodes on bus: 2, card name: ohci1394 > .... > I tried it with 2 cameras (scorpion and flea) and I tried it with the > camera plugged into either card. I tried with a couple of different > firmware versions of our cameras as well. No change. I haven't tried with two interface cards in one machine. That could be a problem, although the function dc1394_find_cameras() is supposed to go through all the cards. > My previous build of coriander 1.0.1 with matching libdc does recognize > both cameras. > > So I dove into the code and modified the GetConfigROMTaggedRegister() > function to print out more information on what it is finding. > > This is what I get: > [root@princealbert src]$ ./coriander Getting first device info... > Getting register tag 0xd1 starting at offset 0x414 > found tag 0x3 (value 0x300b09d) - continue > found tag 0x81 (value 0x8100000e) - continue > found tag 0xc (value 0xc0083c0) - continue > found tag 0xd1!! > Getting register tag 0x12 starting at offset 0x428 > found tag 0x12!! > Getting register tag 0x13 starting at offset 0x428 > found tag 0x12 (value 0x1200a02d) - continue > found tag 0x13!! > Getting register tag 0x38 starting at offset 0x0 > Getting register tag 0xd4 starting at offset 0x428 > found tag 0x12 (value 0x1200a02d) - continue > found tag 0x13 (value 0x13000102) - continue a02d-102: we have a camera here. Now getting vendors strings,... > found tag 0xd4!! > Getting register tag 0x40 starting at offset 0x440 > found tag 0x40!! > Getting register tag 0x81 starting at offset 0x440 > found tag 0x40 (value 0x403c0000) - continue > found tag 0x81!! > Getting register tag 0x82 starting at offset 0x440 > found tag 0x40 (value 0x403c0000) - continue > found tag 0x81 (value 0x81000003) - continue > found tag 0x82!! getting the second device info: > Getting register tag 0xd1 starting at offset 0x414 > found tag 0x3 (value 0x3600050) - continue > found tag 0x81 (value 0x81000002) - continue That's a funny one: the tag 0x81 is the vendor string. This should have been in the unit_dep_dir but the firmware guys probably decided to put it there to avoid a few extra registers. This could actually conform to the IEEE1212/IEEE1293 standards. That's not the way I understood the specs but since I only have the IIDC docs I'm not surprised that something like this happens. > found tag 0xc (value 0xc0083c0) - continue > Libdc1394 error (dc1394_control.c:dc1394_get_camera_info:378): Tagged > register not found : Could not get unit directory offset > Libdc1394 error (dc1394_control.c:dc1394_find_cameras:145): Can't check > if node is a camera : > Note: this appears to be the second time through the loop (second time > looking for tag 0xd1) and so we think that whatever it is probing, it is > not the one camera on the bus. My guess is its probing one of the cards? Exactly. > The error check in dc1394_find_cameras() is: > > err=dc1394_get_camera_info(tmpcam); > if ((err != DC1394_SUCCESS) && (err != DC1394_NOT_A_CAMERA)) { > > So, err = DC1394_TAGGED_REGISTER_NOT_FOUND > > Ok, thats as far as I managed to debug. Note: I get the same error if I > have no cameras plugged into the bus... > > Anyway, I think this is a bug, that the above error check is too strict, > as non-cameras may fail less intelligently than with NOT_A_CAMERA... but > I am not up on this codebase so its just a guess. > > Please let me know if I'm right. It's correct. If we don't find a tagged register we don't really have a fatal system error, it's just that the ROM is not what we expected and we should just declare that the node is not a camera. You can try again with this new condition: err=dc1394_get_camera_info(tmpcam); if ((err != DC1394_SUCCESS) && (err != DC1394_NOT_A_CAMERA) && (err != DC1394_TAGGED_REGISTER_NOT_FOUND)) { That should solve the problem. Many thanks, Damien PS: This is what I have on my machine when I use your debug procedure. I have with one interface card, one camera and 2 HDDs: ----- getting first device info Getting register tag 0xd1 starting at offset 0x414 found tag 0x3 (value 0x3000a47) - continue found tag 0xc (value 0xc0083c0) - continue found tag 0x8d (value 0x8d000002) - continue found tag 0xd1!! Getting register tag 0x12 starting at offset 0x434 found tag 0x12!! Getting register tag 0x13 starting at offset 0x434 found tag 0x12 (value 0x1200a02d) - continue found tag 0x13!! Getting register tag 0x38 starting at offset 0x0 Getting register tag 0xd4 starting at offset 0x434 found tag 0x12 (value 0x1200a02d) - continue found tag 0x13 (value 0x13000102) - continue ----- a02d-102: we have a camera geetting other stuff... found tag 0xd4!! Getting register tag 0x40 starting at offset 0x444 found tag 0x40!! Getting register tag 0x81 starting at offset 0x444 found tag 0x40 (value 0x403c0000) - continue found tag 0x81!! Getting register tag 0x82 starting at offset 0x444 found tag 0x40 (value 0x403c0000) - continue found tag 0x81 (value 0x81000002) - continue found tag 0x82!! ----- checking second device: Getting register tag 0xd1 starting at offset 0x414 found tag 0xc (value 0xc0083c0) - continue found tag 0x3 (value 0x300a0b0) - continue found tag 0x81 (value 0x81000011) - continue found tag 0x4 (value 0x4000001) - continue found tag 0x81 (value 0x81000014) - continue found tag 0xd1!! Getting register tag 0x12 starting at offset 0x430 found tag 0x12!! Getting register tag 0x13 starting at offset 0x430 found tag 0x12 (value 0x1200609e) - continue found tag 0x13!! ----- 609e is not a camera, thus we go to the next device (#3) Getting register tag 0xd1 starting at offset 0x414 found tag 0xc (value 0xc0083c0) - continue found tag 0x3 (value 0x300a0b0) - continue found tag 0x81 (value 0x81000011) - continue found tag 0x4 (value 0x4000001) - continue found tag 0x81 (value 0x81000014) - continue found tag 0xd1!! Getting register tag 0x12 starting at offset 0x430 found tag 0x12!! Getting register tag 0x13 starting at offset 0x430 found tag 0x12 (value 0x1200609e) - continue found tag 0x13!! ----- 609e again, goto last one Getting register tag 0xd1 starting at offset 0x414 found tag 0xc (value 0xc0083c0) - continue found tag 0x3 (value 0x300a0b0) - continue found tag 0x81 (value 0x81000011) - continue found tag 0x4 (value 0x4000001) - continue found tag 0x81 (value 0x81000014) - continue found tag 0xd1!! Getting register tag 0x12 starting at offset 0x430 found tag 0x12!! Getting register tag 0x13 starting at offset 0x430 found tag 0x12 (value 0x1200609e) - continue found tag 0x13!! ----- 609e again, not a camera either. scan finished -- _ Damien 'Takahara' Douxchamps, PhD ('- Post-doctoral investigator //\ Image Processing Group, Nara Institute of Science and Technology V_/_ http://chihara.aist-nara.ac.jp/ |