00001 /* -*- mode: text; fill-column: 70; indent-tabs-mode: nil -*- 00002 $Id: programmer-notes.dxy 13886 2010-09-05 03:41:21Z itti $ 00003 00004 ------------------------------------ 00005 iLab Neuromorphic Vision C++ Toolkit 00006 ------------------------------------ 00007 00008 Programmer Notes 00009 ---------------- 00010 00011 */ 00012 00013 /*! \page programmer-notes Programmer notes 00014 00015 The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001-2005 by 00016 the University of Southern California (USC) and iLab at USC. 00017 00018 Major portions of the iLab Neuromorphic Vision C++ Toolkit are 00019 protected under the U.S. patent ``Computation of Intrinsic Perceptual 00020 Saliency in Visual Environments, and Applications'' by Christof Koch 00021 and Laurent Itti, California Institute of Technology, 2001 (patent 00022 pending; application number 09/912,225 filed July 23, 2001; see 00023 http://pair.uspto.gov/cgi-bin/final/home.pl for current status) 00024 00025 This file is part of the iLab Neuromorphic Vision C++ Toolkit. 00026 00027 The iLab Neuromorphic Vision C++ Toolkit is free software; you can 00028 redistribute it and/or modify it under the terms of the GNU General 00029 Public License as published by the Free Software Foundation; either 00030 version 2 of the License, or (at your option) any later version. 00031 00032 The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope 00033 that it will be useful, but WITHOUT ANY WARRANTY; without even the 00034 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00035 PURPOSE. See the GNU General Public License for more details. 00036 00037 You should have received a copy of the GNU General Public License 00038 along with the iLab Neuromorphic Vision C++ Toolkit; if not, write to 00039 the Free Software Foundation, Inc., 59 Temple Place, Suite 330, 00040 Boston, MA 02111-1307 USA. 00041 00042 Table of contents: 00043 00044 - \ref introduction 00045 - \ref getting-the-code 00046 - \ref file-organization 00047 - \ref compiling 00048 - \ref executables 00049 - \ref video-clips 00050 - \ref parallel-code 00051 - \ref documentation 00052 - \ref writing-code 00053 - \ref roadmap 00054 00055 <!--############################################################--> 00056 <!--############################################################--> 00057 <!--############################################################--> 00058 00059 \section introduction 1. INTRODUCTION 00060 00061 00062 <!--############################################################--> 00063 00064 \subsection purpose-and-objectives 1.1. Purpose and Objectives 00065 00066 00067 This toolkit provides a number of C++ classes to assist you in 00068 developing neuromorphic vision algorithms. Neuromorphic algorithms are 00069 motivated by and closely follow the architecture of biological brains. 00070 00071 Originally, this toolkit was developed to implement our model of 00072 bottom-up, saliency-based visual attention, as described in the 00073 following scientific articles (all available in PDF format from 00074 http://iLab.usc.edu): 00075 00076 L. Itti, C. Koch, E. Niebur, A Model of Saliency-Based Visual 00077 Attention for Rapid Scene Analysis, IEEE Transactions on Pattern 00078 Analysis and Machine Intelligence, Vol. 20, No. 11, pp. 1254-1259, Nov 00079 1998. 00080 00081 L. Itti, Models of Bottom-Up and Top-Down Visual Attention, California 00082 Institute of Technology, Jan 2000. [Ph.D. Thesis] 00083 00084 L. Itti, C. Koch, A saliency-based search mechanism for overt and 00085 covert shifts of visual attention, Vision Research, Vol. 40, 00086 No. 10-12, pp. 1489-1506, May 2000. 00087 00088 L. Itti, C. Koch, Computational Modeling of Visual Attention, Nature 00089 Reviews Neuroscience, Vol. 2, No. 3, pp. 194-203, Mar 2001. 00090 00091 and many others (see web site, under 'publications'). 00092 00093 The model takes an input color image or video sequence and predicts 00094 which locations in this image will attract our visual attention (that 00095 is, are conspicuous, or 'salient'). It replicates processing in 00096 posterior parietal cortex and other brain areas along the dorsal 00097 visual stream in the primate brain. The model includes a bottom-up 00098 (image-based) computation of low-level color, intensity, orientation 00099 and motion features, as well as a non-linear spatial competition which 00100 enhances salient locations in each of these feature channels. All 00101 feature channels feed into a unique scalar ``saliency map'' which 00102 controls where to next focus attention onto. Because it includes a 00103 detailed low-level vision front-end, the model has been applied not 00104 only to laboratory stimuli, but also to a wide variety of natural 00105 scenes. In addition to predicting a wealth of psychophysical 00106 experiments, the model demonstrates remarkable performance at 00107 detecting salient objects in outdoors imagery --- sometimes exceeding 00108 human performance --- despite wide variations in imaging conditions, 00109 targets to be detected, and environments. 00110 00111 00112 <!--############################################################--> 00113 00114 \subsection classes-included 1.2. Classes included in the package 00115 00116 00117 - low-level graphic elements such as a 2D point (Point2D), an RGB 00118 pixel (PixRGB), a rectangle, etc 00119 00120 - a template Image class that defines a 2D array (of data type chosen 00121 through the C++ template mechanism) and provides numerous low-level 00122 image processing functions, such as convolution, rescaling, basic 00123 arithmetic operations, decimation & interpolation, various 00124 normalizations, type conversions, omnidirectional lens distortion 00125 correction, various methods to draw lines, circles, rectangles, 00126 points, etc and miscellaneous functions such as speckle noise 00127 addition, 3D warping, flooding, edge detection, 3/4 chamfer distance 00128 transform, etc 00129 00130 - a template ImageSet class which implements collections of Image 00131 objects, possibly forming dyadic pyramids of various data types 00132 (defined as template argument) and for various pyramid schemes. A 00133 dyadic pyramid is a series of images (one image per pyramid 'level,' 00134 where the base of the pyramid, or level 0, is the original image 00135 from which the pyramid is built), such that the next level in the 00136 pyramid is derived from the current level by applying some filter 00137 and then reducing the size of the level by a factor two horizontally 00138 and vertically (hence the term 'dyadic,' which means in powers of 00139 two). Pyramid schemes include Gaussian pyramids with several 00140 Gaussian filter sizes (thus, a Gaussian (= blurring) filter is 00141 applied to each level before size reduction), Laplacian (= edge 00142 detector), Gabor (= detect oriented edges in a given direction), etc 00143 00144 - a Raster namespace and set of functions which allow storage and 00145 retrieval of Image objects as PNM (Portable aNyMap; also known as 00146 PPM Portable PixMap and PPM Portable GreyMap) image files on disk, a 00147 very easy to use, uncompressed and standardized image file 00148 format. PNM is a very convenient format because of the availability 00149 of the 'netpbm' suite (installed by default in many Linux 00150 distributions), which includes many programs to convert from any 00151 other image format to PPM/PGM, and then from PPM/PGM to any other 00152 format. We also support other common image formats such as JPEG and 00153 PNG (not to be confused with PNM), as well as raw YUV image formats 00154 (see RasterFileFormat and VideoFormat). 00155 00156 - several classes which are specific to our model of bottom-up, 00157 saliency-based visual attention, such as a number of Channel classes 00158 (which wrap underlying image pyramids of various types), a 00159 VisualCortex class (contains several pyramids for color, intensity, 00160 orientation and flicker information), a SaliencyMap class (which is 00161 a 2D array of simple leaky integrate & fire neurons), a 00162 WinnerTakeAll class (which is a distributed neuronal algorithm by 00163 which the location of maximum activity can be detected in the 00164 saliency map), a Brain class (contains a retina, visual cortex, 00165 saliency map, winner-take-all and a few other objects), a number of 00166 SaccadeController classes which allow for the control of eye 00167 movements from shifts of attention, a ShapeEstimator class which 00168 computes an estimate bounding region around an attended object, etc 00169 00170 - several classes that are specific to our model of contour 00171 integration in the primate brain. These classes simulate intricate 00172 patterns of connections between neurons visually responsive to 00173 various locations in our visual environment, and allow the model to 00174 extract salient contours from surrounding noise and clutter 00175 (contourNeuron and contourRun classes). 00176 00177 - several classes specific to symbolic knowledge representation, which 00178 we use to model the influence of a verbally-specified task/goal onto 00179 the spatiotemporal deployment of attention and eye movements. 00180 00181 - several classes that deal with object recognition, including a 00182 re-implementation of the HMAX model, a 2-layer backpropagation 00183 network for object recognition, etc. 00184 00185 - a Jet class, which is a vector of responses from various neurons all 00186 responding to a same location in the visual field, but with 00187 different sensitivities (e.g., one neuron is tuned to red color, 00188 another to vertical orientation, etc). Several operations are 00189 provided that allow the computation of mean jets, distance between 00190 two jets, etc. This class has been applied to some fairly 00191 unsuccessful (so far) attempt at segmenting objects from scenes 00192 using some jet-based metric. 00193 00194 - a V4Lgrabber class, which allows very easy capture of video frames 00195 from any Video4Linux-compliant framegrabber device installed in your 00196 computer (see http://roadrunner.swansea.uk.linux.org/v4l.shtml). 00197 00198 - an IEEE1394grabber class, which allows very easy capture of video 00199 frames from any IEEE-1394 (FireWire) digital camera (i.e., web-cam, 00200 as opposed to DV camcorders, which use a different data stream 00201 format). 00202 00203 - various other hardware drivers, such as a Serial port class, a 00204 Serial-Servo-Controller (SSC) class, an alphanumeric LCD display 00205 driver, various pan/tilt camera head drivers with associated 00206 calibration code, a Keyboard driver, AudioGrabber and AudioMixer 00207 abstractions, etc. 00208 00209 - an XWindow class which just opens a window on the screen and can 00210 display Images in it, and is extremely easy to use; and an 00211 XWinManaged class which in addition responds to various mouse and 00212 widget events. 00213 00214 - A ParamMap class for storage/retrieval of various parameters in 00215 config files; and a somewhat overlapping readConfig class which 00216 allows easy reading/parsing/storage of configuration files for your 00217 applications. 00218 00219 - a set of very fast and multithreaded interprocess communication 00220 classes which allow quick transfer of images and other data from one 00221 computer to another over the network; most of these classes 00222 (TCPxxxx.C/.H) will not be of interest to the user, who will mostly 00223 deal with the Beowulf class (sets up interconnections between 00224 different computers on a network) and the TCPmessage class (builds 00225 messages to be passed between machines and can contain various 00226 elements such as images, text strings, etc). 00227 00228 - a very convenient logging facility which provides a set of functions 00229 to be used instead of printf to report debugging messages, 00230 information messages, errors or fatal errors. In addition to 00231 accepting the same syntax as printf, these functions will print the 00232 program name, class name, method name, possible system messages (see 00233 'man perror'), etc. either to standard output or through the 00234 systemwide system logs (see 'man syslog'). 00235 00236 - several other classes, such as a Timer class which can be used to 00237 measure time, a Range class, etc. 00238 00239 00240 <!--############################################################--> 00241 00242 \subsection basic-features 1.3. Basic features of the programming environment 00243 00244 00245 The toolkit makes use of a number of advanced C++ programming 00246 techniques, which are intended to make use of its various components 00247 easier and more flexible to the knowledgeable programmer. While this 00248 brings many advantages described below, one drawback is that some of 00249 the constructs and techniques employed may be unfamiliar to the 00250 inexperienced programmer. If you are only moderately familiar with 00251 C++, we urge you to very carefully read the book "The C++ Programming 00252 Language" (Third Edition or Special Edition), by Bjarne Stroustrup 00253 Addison-Wesley, ISBN 0-201-88954-4 or 0-201-70073-5. See 00254 http://www.research.att.com/~bs/3rd.html for details. 00255 00256 - Full configure process so that the source tree should compile on a 00257 variety of computing environments (see configure.in, configure and 00258 Makefile.in); 00259 00260 - Full test suite to ensure that various pieces of the code continue 00261 to work the same as you implement new functionality (see TestSuite.H 00262 and "make test"); 00263 00264 - Heavy use of C++ template mechanisms, so that many classes are 00265 implemented in a type-generic manner, and may be instantiated for 00266 various data types (e.g., the Image class is parameterized by a 00267 template argument defining the datatype to use for individual 00268 pixels; functions operating on the Image class are written in a 00269 generic manner, with as few assumptions as possible made on what the 00270 pixel datatype may end up being; Image objects may then be created 00271 in your programs that may use pixels of type byte, int, float, 00272 PixRGB<byte>, IntFireNeuron, Jet<byte>, or an open-ended variety of 00273 other datatypes); 00274 00275 - Heavy use of inheritance and class hierarchies. When a model 00276 component is being implemented in several forms, either for 00277 experimentations with several possible approaches, or for re-use of 00278 a generic framework in various specializations, usually we define a 00279 base class to specify the interface (sometimes that base class is 00280 purely virtual), and then a number of derived classes which 00281 implement various behaviors behind that interface. Examples are the 00282 Channel hierarchy, where ChannelBase defines the common interface, 00283 then derived into SingleChannel (contains one ImageSet) and 00284 ComplexChannel (contains a collection of SingleChannel and/or 00285 ComplexChannel objects), and further derived into IntensityChannel, 00286 RedGreenChannel, DirectionChannel, MotionChannel, etc; 00287 00288 - Reference-counted, copy-on-write memory allocation for large objects 00289 such as images (so that various copies of an image share the same 00290 physical memory until one of the copies attempts to modify that 00291 memory, at which point a copy of the memory is first made; see 00292 ArrayData.H and its use in Image.H and TCPmessage.H); 00293 00294 - Automatic type promotion, so that operations among template classes 00295 automatically avoid all overflows (e.g., multiplying an image of 00296 bytes by a float coefficient results in an image of floats; see 00297 Promotions.H); 00298 00299 - Automatic range checking and clamping during demotion of types 00300 (e.g., assigning an image of floats to an image of bytes 00301 transparently converts and clamps all pixel values to the 0..255 00302 range; see Promotions.H); 00303 00304 - Smart reference-counted pointers, so that when the last pointer to 00305 an object is destroyed, memory allocated for the pointee is 00306 automatically freed (see SharedPtr.H); 00307 00308 - Persistent model parameters that may be stored/retrieved to/from 00309 configuration files, or configured via command-line options. A 00310 framework is provided where a run-time selection of various model 00311 components may export at run-time command-line options that will 00312 allow tuning of some of their internal parameters. The mechanism is 00313 pushed to the extreme, so that new model components selected via the 00314 command line may export their set of command-line options while the 00315 command line is being parsed (see ModelParam.H, ModelComponent.H and 00316 ModelManager.H for the general framework, and 00317 VisualCortexConfigurator.H for exporting options while the 00318 command-line is being parsed); 00319 00320 - Atomic operations (see atomic.H); 00321 00322 - Range-checked iterators that may be used in place of normal 00323 iterators, for debugging purposes (see CheckedIterator.H); 00324 00325 - MMX/SSE alternative faster implementations for some of our core 00326 image processing functions (e.g., lowPass3, byte-to-int conversions, 00327 etc; see mmx-sse.H); 00328 00329 - Wrappers to use some of our classes from within Matlab (see, e.g., 00330 mexSaliency.C); 00331 00332 - Use of multi-threading (see, e.g., RadioDecoder.H, TCPcommunicator.H 00333 and others); 00334 00335 - A large collection of test programs that demonstrate the minimal use 00336 of a given class (see test-*.C); 00337 00338 To get started, please see the online documentation at 00339 http://iLab.usc.edu/sdoc/html/ (use the same username/pass as you used 00340 to obtain this code). Make sure you read all of the introductory pages 00341 (links to them are both on the front page and on the side bar, under 00342 "Related pages"). Once you have read those, a good way to get 00343 accustomed to the code base is to browse through the class hierarchy 00344 and click on the name of any highlighted entity you may not be 00345 familiar with. Also, be sure to check the online repository browser, 00346 which will allow you to check the full edit history of every source 00347 file, at 00348 00349 http://ilab.usc.edu/cgi-bin/secure/viewcvs.cgi/trunk/saliency/ 00350 00351 (same username/pass as for the documentation). 00352 00353 Also, a wrapper to "man" is provided and named saliency/bin/mn; once 00354 you have saliency/bin in you path, you can use it just like "man" to 00355 view documentation about a class or file as a man page; for example: 00356 00357 \verbatim 00358 mn lcd 00359 mn FrameGrabber.H 00360 \endverbatim 00361 00362 and so on. The actual man pages reside in saliency/doc/man and are 00363 created when you type "make doc" from within saliency/src/. 00364 00365 00366 <!--############################################################--> 00367 <!--############################################################--> 00368 <!--############################################################--> 00369 00370 \section getting-the-code 2. GETTING THE CODE 00371 00372 00373 <!--############################################################--> 00374 00375 \subsection subversion 2.1. Subversion (SVN) 00376 00377 00378 The easiest way to obtain the latest revision of the source code is 00379 from our Subversion repository. Subversion (abbreviated SVN, homepage 00380 http://subversion.tigris.org) is a version control system designed as 00381 a new-and-improved replacement for CVS. 00382 00383 \note 00384 There is an excellent O'Reilly book about Subversion, 00385 which is available, for free, in its entirety, here: 00386 00387 \par 00388 http://svnbook.red-bean.com/ 00389 00390 \par 00391 (Make sure that you click on links for the latest version of 00392 the book -- currently there are 1.0 and 1.1 versions, and 00393 (obviously) 1.1 is the more recent version). 00394 00395 \par 00396 If you have a question about subversion that isn't answered in 00397 this README, your next source should be the svn book online. 00398 00399 Subversion allows several programmers to simultaneously work on the 00400 same code and that will keep track of all changes made; to achieve 00401 that, the master copy of the source code is maintained in a central 00402 database, and the various programmers download a working copy of the 00403 code to their various machines and home directories. After they have 00404 modified the code and the modifications work, they post their changes 00405 back to the master repository for everyone to enjoy. 00406 00407 You can see the contents of our neuromorphic vision toolkit subversion 00408 repository through a web interface at: 00409 00410 http://ilab.usc.edu/cgi-bin/secure/viewcvs.cgi/trunk/saliency/ 00411 00412 (Be assured that although the URL contains 'viewcvs', you are indeed 00413 looking at a subversion (svn) repository, not a cvs one. The 'viewcvs' 00414 web interface works with both CVS and svn repositories). 00415 00416 This will allow you to see the various revisions, who made them and 00417 when, and to highlight differences between various versions of the 00418 code. You should not use this to download the code; rather follow 00419 these instructions: 00420 00421 00422 <!--############################################################--> 00423 00424 \subsection using-svn 2.2. Using svn 00425 00426 00427 Go to the directory where you want to install the source code. Then 00428 type: 00429 00430 \verbatim 00431 svn checkout svn://ilab.usc.edu/trunk/saliency 00432 \endverbatim 00433 00434 this will download the entire source tree. 00435 00436 You can now start editing the code (see below for the various 00437 subdirectories). Once you have made changes and have tested that 00438 everything compiles fine and works ok, you can check which files you 00439 have modified locally by typing: 00440 00441 \verbatim 00442 svn status 00443 \endverbatim 00444 00445 \note 00446 CVS USERS SEE NOTE BELOW REGARDING 'svn status' and 'svn update' 00447 00448 Once you are satisfied that your changes are ready for the world to 00449 see, you can post them by issuing (from the directory where you have 00450 made changes): 00451 00452 \verbatim 00453 svn commit -m"short message describing what you did" 00454 \endverbatim 00455 00456 If someone else has modified the same source code as you have, svn 00457 will refuse to commit your changes and ask you to first update your 00458 source to the latest subversion repository revision; you do that by 00459 typing: 00460 00461 \verbatim 00462 svn update 00463 \endverbatim 00464 00465 \note 00466 NOTE TO CVS USERS: Unlike in CVS, you should NOT use 'svn 00467 update' to quickly check which files you have modified 00468 locally. Instead you should use 'svn status', and here's why. 00469 00470 \par 00471 In fact CVS has a 'cvs status' command that would give you 00472 information about local changes, but its output is so verbose 00473 that nobody ever uses it; everyone uses 'cvs update' 00474 instead. Of course there are two problems with that: (1) it 00475 might bring in new modifications from the repository, which 00476 you don't necessarily want, and (2) it requires significant 00477 network bandwidth to communicate with the CVS repository and 00478 determine what changes you have made. In svn, the situation is 00479 much nicer. For one thing, the output of 'svn status' is now 00480 compact, just like the output of 'cvs update' was. For another 00481 thing, 'svn status' requires no network traffic -- subversion 00482 keeps pristine copies of the unmodified files tucked away 00483 inside the various .svn directories in your working 00484 copy. Therefore you can do 'svn status' or 'svn diff' to 00485 examine local changes without having to wait for the network, 00486 and without placing undue load on the svn server. </tt> 00487 00488 When you do 'svn update', subversion will try to merge other 00489 people's into your own working copy. Usually this is fully automatic, 00490 unless you have been editing exactly the same lines in a file as 00491 someone else has (you should then talk to that person to figure out 00492 why both of you are editing the same code, since usually different 00493 people will work on different parts of the code!). In this case, 00494 subversion will notify you that there has been a conflict by printing 00495 a 'C' next to the offending file's name during your 'svn 00496 update'. Subversion's approach to conflicts is more user-friendly than 00497 CVS's approach -- in particular, it won't let you commit a file 00498 containing those pesky >>>>>>>> conflict markers by accident. With 00499 subversion, you must explicitly notify svn after you've resolved the 00500 conflict, by using the 'svn resolved' command. 00501 00502 If there has been a conflict, subversion puts three extra files in 00503 your working copy: 00504 00505 \verbatim 00506 filename.mine [contains just your local modifications] 00507 filename.r5000 [the base file against which you made local mods] 00508 filename.r5001 [the latest version on the server] 00509 \endverbatim 00510 00511 where '5000' is the revision against which you had made local 00512 modifications, and '5001' is the latest revision on the server. 00513 00514 You can do one of three things to fix the conflict: 00515 00516 - merge the changes by hand, by editing <filename> and removing the 00517 various conflict markers 00518 00519 - OR, copy one of the three temporary files listed above back on top 00520 of <filename> 00521 00522 - OR, throw away your local changes by doint 'svn revert <filename>' 00523 00524 Once you are done fixing the conflict, you must inform svn of 00525 this by doing 'svn resolved <filename>'. 00526 00527 Then, you can commit any remaining changes in <filename> to the 00528 server with another 'svn commit', BUT... be sure to first run 'svn 00529 diff' on the file in question, to make sure you really know which 00530 changes you have added. 00531 00532 Subversion will safely ignore all files that have not been 00533 explicitly added to the repository; these include your .o files, 00534 editor backups, and so on. So it is not necessary to clean up those 00535 files before doing a 'svn commit'. 00536 00537 In summary, the recommended strategy for smooth interaction with the 00538 source tree is: 00539 00540 - NEVER copy files around (e.g., put them onto another computer), 00541 then edit them, meanwhile do something else in your working svn 00542 tree and do an update once in a while, then some day copy those old 00543 files back into your svn working copy, overwriting the up-to-date 00544 ones. This will break the entire mechanism if someone else has also 00545 edited that file and committed changes (indeed, subversion will 00546 think that you just decided to delete all of this other person's 00547 edits!); 00548 00549 - Instead, if you need to have various copies of the code at various 00550 places, just checkout a copy at each place and work in those 00551 checked-out trees. Once you are done with some edits at one place 00552 (e.g., home) just commit them to the server and when you get to 00553 another place (e.g., work), just update your tree there. Thus, you 00554 are using the central svn server to keep your various copies of the 00555 code in sync and transfer your edits from one place to another; 00556 00557 - Once you have made a bunch of changes that work ("make all" and 00558 "make test" pass, though it is okay if your new code is bogus in 00559 its execution as long as you are the only one using it), do the 00560 following: 00561 - 'svn update' to make sure that you are in sync; 00562 - 'svn status' to show you with an "M" prefix all the files you 00563 have modified. If some files show up there that you did not 00564 think you had modified or did not wish to modify, try 'svn diff 00565 <file>' to see how your copy differs from the server's master 00566 copy. If you realize that these are edits you made while 00567 debugging, but you don't want to commit them, simply do an 'svn 00568 revert <file>' to restore that file to its pristine unmodified 00569 state. 00570 - If you have made a large number of changes, and a single commit 00571 message would not work well, you may wish to commit your 00572 modified files individually or in smaller groups; for example: 00573 \verbatim 00574 svn commit -m"fixed bug with lowPass3()" Image_FilterOps.C 00575 svn commit -m"new compute() function" myStuff.H myStuff.C 00576 \endverbatim 00577 00578 \par 00579 However, note that in subversion, unlike CVS, commits are 00580 atomic -- everything that happens in a single 'svn commit' 00581 command is stored as a single revision in the server, and bumps 00582 the global revision number only once. Therefore, it is 00583 sub-optimal (though not catastrophic) to use more than one 'svn 00584 commit' for a set of changes that really belong together in a 00585 single unit. 00586 00587 \par 00588 And so on. You can do an 'svn status' after each step to 00589 see which files remain to commit. Using this simple behavior, 00590 you will avoid committing changes you did not wish to commit. 00591 00592 00593 <!--############################################################--> 00594 00595 \subsection svn-advanced 2.3. Advanced svn techniques 00596 00597 PLEASE DO NOT USE THE FOLLOWING UNLESS YOU REALLY KNOW WHAT YOU ARE 00598 DOING! 00599 00600 To add a new file to the repository, you need to tell svn by doing: 00601 00602 \verbatim 00603 svn add newfile 00604 \endverbatim 00605 00606 this will schedule the file for addition; it will actually be added 00607 when you next commit. 00608 00609 To remove a file from the repository, do 00610 00611 \verbatim 00612 svn delete file 00613 \endverbatim 00614 00615 and it will be deleted when you next commit. Deleted files aren't 00616 really gone forever; they can still be retrieved by doing an 'svn 00617 checkout' with an older date or revision number. 00618 00619 To add a new subdirectory 00620 00621 \verbatim 00622 svn mkdir newdir 00623 svn commit -m"created newdir" 00624 \endverbatim 00625 00626 To remove a directory: unlike in CVS, this is actually possible in 00627 subversion. It's the same as deleting a file: 00628 00629 \verbatim 00630 svn delete somedir 00631 \endverbatim 00632 00633 To rename a file or directory: this is another thing that was not 00634 possible in CVS, but is trivial in subversion: 00635 00636 \verbatim 00637 svn move name1 name2 00638 \endverbatim 00639 00640 00641 <!--############################################################--> 00642 00643 \subsection about-svn-properties 2.4. About svn properties 00644 00645 00646 \note 00647 The most important thing about this section -- if you 00648 are going to commit code to the subversion repository, you 00649 should modify your ~/.subversion/config file so that the 00650 svn:keywords property gets set automatically on any files that 00651 you add to the repo. See the "svn:keywords" section below. 00652 00653 Subversion allows you to use arbitrarily-named properties to associate 00654 any user-specified content with versioned files (can be text, or other 00655 MIME types... so e.g. it's possible to put images into an svn 00656 property). Changes to properties are versioned just like changes to 00657 file contents. 00658 00659 The main subcommands associated with properties are the following: 00660 00661 \verbatim 00662 svn proplist -v <filename> 00663 svn propset <property-name> <property-value> <filename> 00664 svn propget <property-name> <filename> 00665 svn propedit <property-name> <filename> 00666 svn propdel <property-name> <filename> 00667 \endverbatim 00668 00669 \note 00670 In order to use 'svn propedit', you need to set at least 00671 one of the SVN_EDITOR, VISUAL, or EDITOR environment 00672 variables. If you haven't done that, you'll get an error like 00673 the following: 00674 \verbatim 00675 svn: None of the environment variables SVN_EDITOR, VISUAL or 00676 EDITOR is set, and no 'editor-cmd' run-time configuration 00677 option was found 00678 \endverbatim 00679 \par 00680 To set one of the env vars, just do 00681 \verbatim 00682 export SVN_EDITOR="emacs -nw" (in sh or bash) 00683 00684 or 00685 00686 setenv SVN_EDITOR "emacs -nw" (in csh or tcsh) 00687 \endverbatim 00688 \par 00689 and if you want to make that change permanent, add the line 00690 somewhere in your ~/.bashrc or ~/.cshrc. 00691 00692 For example: 00693 00694 \verbatim 00695 cd /path/to/saliency 00696 svn propedit svn:ignore . (brings up an emacs window for editing the property) 00697 svn proplist -v . 00698 --> Properties on '.': 00699 svn:ignore : Makefile 00700 Makefile.local 00701 TAGS 00702 autom4te-2.5x.cache 00703 autom4te.cache 00704 build 00705 config.log 00706 config.status 00707 depoptions 00708 inst 00709 mexopts.sh 00710 \endverbatim 00711 (The svn:ignore property is equivalent to the old .cvsignore files.) 00712 00713 \verbatim 00714 svn proplist -v src/Image/Image.H 00715 --> Properties on 'src/Image/Image.H': 00716 svn:keywords : Author Date Id Revision 00717 svn:eol-style : native 00718 \endverbatim 00719 00720 \verbatim 00721 svn proplist -v devscripts/extract_templates.tcl 00722 --> Properties on 'devscripts/extract_templates.tcl': 00723 svn:executable : * 00724 svn:keywords : Author Date Id Revision 00725 svn:eol-style : native 00726 \endverbatim 00727 00728 Properties can have any name; for example you could associate 00729 copyright information with a file like this: 00730 00731 \verbatim 00732 svn propset copyright 'Copyright (2005)...' foofile 00733 \endverbatim 00734 00735 But there are also some 'magic' properties that start with the svn: 00736 prefix, and these have a special meaning to svn... 00737 00738 <ul> 00739 00740 00741 <li> svn:ignore -- just like the .cvsignore files. The most common use 00742 for svn:ignore is likely to be when you add a new executable that 00743 will get built in the bin/ directory -- since of course we don't 00744 want to check binary executables in to the svn repository, svn 00745 will show that it doesn't recognize the new executable by 00746 indicating it with a '?' when you run "svn status". Suppose the 00747 new executable is named bin/myprog. Then, initially we have the 00748 following: 00749 \verbatim 00750 $ svn status 00751 ? bin/myprog 00752 \endverbatim 00753 You can avoid that noise by adding myprog to the svn:ignore 00754 property of the bin directory... e.g., 00755 \verbatim 00756 $ svn propedit svn:ignore bin 00757 00758 (brings up an editor window with the list of items in 00759 svn:ignore, just add 'myprog' to that list; if you get an error 00760 message, then see the NOTE above about setting one of the 00761 SVN_IGNORE, VISUAL, or EDITOR environment variables) 00762 00763 $ svn proplist -v bin 00764 Properties on 'bin': 00765 svn:ignore : BeobotLauncher 00766 CINNICanova 00767 CINNICinteract 00768 CINNICstats 00769 CINNICtest 00770 ... 00771 00772 (lists all properties and their current values for bin) 00773 \endverbatim 00774 \verbatim 00775 $ svn status 00776 M bin 00777 00778 (now no longer shows a '?' for myprog, but shows a " M" for bin, 00779 indicating that bin has locally-changed properties) 00780 \endverbatim 00781 \verbatim 00782 $ svn commit -m"Added myprog to svn:ignore for bin." bin 00783 00784 (commits the changed property) 00785 \endverbatim 00786 </li> 00787 00788 <li> svn:keywords -- specifies which RCS keywords get substituted; unlike 00789 CVS, this property defaults to being empty, which means that 00790 people either have to remember to set svn:keywords explicitly e.g. 00791 00792 \verbatim 00793 svn propset svn:keywords "Author Date Id Revision HeadURL" foo.C 00794 \endverbatim 00795 00796 or can add some lines to $HOME/.subversion/config to make 00797 svn:keywords get set automatically anytime you 'svn add' a new 00798 file that has a particular filename extension. 00799 00800 We recommend that developers who plan to contribute code to our 00801 subversion repository add lines similar to the following to the 00802 end of their ~/.subversion/config file: 00803 00804 \verbatim 00805 [miscellany] 00806 enable-auto-props = yes 00807 00808 [auto-props] 00809 *.[cC] = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00810 *.[hH] = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00811 *.cc = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00812 *.cpp = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00813 *.hh = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00814 *.hpp = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00815 *.html = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00816 *.m = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00817 *.pl = svn:eol-style=native;svn:executable;svn:keywords=Author Date Id Revision HeadURL 00818 *.py = svn:eol-style=native;svn:executable;svn:keywords=Author Date Id Revision HeadURL 00819 *.sh = svn:eol-style=native;svn:executable;svn:keywords=Author Date Id Revision HeadURL 00820 *.tcl = svn:eol-style=native;svn:executable;svn:keywords=Author Date Id Revision HeadURL 00821 *.txt = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00822 *.xml = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00823 *.xsl = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00824 Makefile* = svn:eol-style=native;svn:keywords=Author Date Id Revision HeadURL 00825 00826 *.gif = svn:mime-type=image/gif 00827 *.jpg = svn:mime-type=image/jpeg 00828 *.png = svn:mime-type=image/png 00829 \endverbatim 00830 </li> 00831 00832 <li> svn:executable -- doesn't matter what the content of this property 00833 is, but if it is present, then svn knows to chmod +x the file when 00834 checking it out 00835 </li> 00836 00837 <li> svn:special -- for now, the only thing this is used for is for 00838 storing symlinks in the svn repo... e.g., 00839 00840 \verbatim 00841 ln -s devscripts scripts 00842 svn add scripts 00843 svn proplist -v scripts 00844 --> Properties on 'scripts': 00845 svn:special : * 00846 svn revert scripts 00847 rm scripts 00848 \endverbatim 00849 </li> 00850 00851 </ul> 00852 00853 00854 <!--############################################################--> 00855 <!--############################################################--> 00856 <!--############################################################--> 00857 00858 \section file-organization 3. FILE ORGANIZATION 00859 00860 00861 The full tree contains the following (you may not get all of this): 00862 00863 \verbatim 00864 00865 README this file 00866 00867 src/ source code (historical note [2005-06-12]: the current src/ 00868 directory was renamed from src3/, which itself was a 00869 descendent of earlier src2/ and src/ directories, all of 00870 which are available from earlier revisions of the 00871 subversion repository) 00872 00873 src/Util/ 00874 src/Image/ 00875 src/Raster/ 00876 src/Component/ 00877 src/agentMinder/ 00878 src/qt/ 00879 as of 2005-06, we are currently undergoing a transition 00880 to split the source code into subdirectories consisting 00881 of logically related modules 00882 00883 notes/ various (mostly obsolete) documentation and research notes; 00884 don't worry too much about it, everything you need is in 00885 the present README; 00886 00887 devscripts/ shell scripts and other resources used in the course of 00888 maintaining the source code repository, see 00889 devscripts/README for more details 00890 00891 doc/ if you do 'make doc', then the resulting output will go 00892 in doc/html, doc/latex, doc/man, doc/rtf 00893 00894 bin/ executables; this is where the results of your compilation will 00895 be; everything that remains there after a 'make clean' 00896 is a shell or perl script that was written to do various 00897 batch processing; 00898 00899 params/ learning parameters for specialization of the system to one 00900 given visual search task (e.g., detecting traffic 00901 signs); 00902 00903 tests/ a test suite consisting of blackbox and whitebox tests 00904 to verify the behavior of different components of our 00905 toolkit; to run, do 'cd tests; ./run_test_suite.tcl' 00906 (takes ~30 seconds on a 2.8GHz Xeon), or do 'cd tests; 00907 ./run_testlong_suite.tcl' (takes ~300 seconds) 00908 00909 matlab/ some Matlab code for the new version of the oriented filters 00910 (under development; to be used in conjunction with 00911 Roberto Manduchi's steerable-scalable filter 00912 optimization code). 00913 00914 \endverbatim 00915 00916 00917 <!--############################################################--> 00918 <!--############################################################--> 00919 <!--############################################################--> 00920 00921 \section compiling 4. COMPILING 00922 00923 00924 <!--############################################################--> 00925 00926 \subsection basic-compilation 4.1. Basic compilation 00927 00928 00929 Use the following steps to build the executables from source: 00930 00931 \verbatim 00932 cd saliency ### switch to the source code's directory 00933 00934 ./configure --help ### to see a list of possible configuration options 00935 00936 ./configure ### run the configure script with optional options 00937 ### e.g. ./configure --prefix=/usr/local 00938 ### or ./configure --enable-mmx --enable-sse 00939 ### or ./configure --enable-mem-debug 00940 00941 make 00942 00943 make test ### optional test if you want to run the test suite 00944 00945 make testlong ### optional more stringent tests, takes long time 00946 \endverbatim 00947 00948 will compile the core executables (see below) and place them in the 00949 bin/ subdirectory of the installation location you chose with the 00950 configure script (default will be saliency/bin/ in your working 00951 saliency directory). You should have zero errors and zero warnings. 00952 00953 \verbatim 00954 make core ### just a few core programs if you get some errors 00955 ### about missing libs when you just type "make". 00956 ### The core programs should not require 00957 ### unusual or exotics libs (like FireWire, etc) 00958 00959 make all ### build everything 00960 \endverbatim 00961 00962 If you run 'make test', be aware that some of the tests unfortunately 00963 rely on the specific way that Intel processors do floating-point 00964 computations; so if you're running on a different processor, you may 00965 see some test failures due to this fact. 00966 00967 There are additional targets for make, which will require some 00968 nonstandard software packages to compile. These include: 00969 00970 \verbatim 00971 make -> only builds the base executables (into saliency/bin/) 00972 make base -> same as above 00973 make core -> builds only core programs that don't need funny libs 00974 make bot -> builds beobot-related executables 00975 make mex -> builds Matlab MEX files 00976 make gtk -> builds GTK-dependent executables 00977 make sdl -> builds SDL-dependent executables 00978 make qt -> builds Qt-dependent executables 00979 make mpeg -> builds MPEG-related executables 00980 make tprogs -> builds test programs 00981 make all -> builds everything except for mex 00982 make xml -> builds all Xerces-C XML library dependent stuff 00983 make doc -> builds the doxygen documentation into ../doc 00984 make doc-latex -> builds the doxygen LaTeX doc into ../doc 00985 \endverbatim 00986 00987 See Makefile.in for the current list of possible targets. 00988 00989 On SMP machines, you may use the provided "mk" script (in 00990 saliency/bin/) to enable parallel compilation. For example (assuming 00991 that saliency/bin/ is in your path), typing: 00992 00993 \verbatim 00994 mk all 00995 \endverbatim 00996 00997 on a dual-CPU machine will make everything, running two jobs in 00998 parallel throughout the build process. On an n-CPU machine it will run 00999 n compilation jobs in parallel. mk passes all its arguments to make, 01000 so it has the same syntax. 01001 01002 01003 <!--############################################################--> 01004 01005 \subsection architecture-issues 4.2. Architecture & Operating System Issues 01006 01007 We use an autoconf-controlled build system (see the \ref autoconf 01008 section below) to detect and handle OS differences, but currently most 01009 things are heavily aimed at Linux, and may not work at all under 01010 different systems (although with the configure script you should at 01011 least expect some message hinting at the reason for the failure). Most 01012 of the code should compile on other Unix architectures, including \ref 01013 macosx-fink "Mac OS X (10.2 or greater)" and the \ref windows-cygwin 01014 "Cygwin environment under Windows". 01015 01016 If you run into problems building the software on a non-Linux system, 01017 you might try the following types of modifications: 01018 01019 - different compiler and linker options 01020 - system functions defined in different include files than those used 01021 (you will then get warnings about standard functions like printf() 01022 or time() being used but not declared; the man page for the 01023 corresponding function should tell you which include file to use if 01024 it is well written as it is under Linux, otherwise, you can try to 01025 locate the include file yourself using the 'find' unix command; for 01026 example "find /usr/include -name time.h -print") 01027 01028 If you are able to tweak things to get the software to build under a 01029 new system, please consider moving those tweaks into the configure.ac 01030 template script and contributing your changes back to our subversion 01031 repository, so that others with similar systems can benefit from your 01032 changes. 01033 01034 <!--############################################################--> 01035 01036 \subsubsection linux-build 4.2.1 Building under Linux 01037 01038 The operating system principally used for development of the iLab 01039 Neuromorphic Vision C++ Toolkit is Mandriva Linux. 01040 01041 Under Mandriva, make sure that you setup the following media sources: 01042 01043 - main 01044 - main_updates 01045 - contrib 01046 - contrib_updates 01047 - non-free 01048 - non-free-updates 01049 - plf-free 01050 - plf-nonfree 01051 01052 Then you can use the uprmi system to download and install additional 01053 packages and their dependencies automatically. 01054 01055 As of Mandriva 2009.1, the following packages should be installed (for 01056 a 64-bit distribution, you can easily guess the corresponding names 01057 for 32-bit): 01058 01059 \verbatim 01060 urpmi emacs 01061 urpmi tcl-devel 01062 urpmi tk-devel 01063 urpmi popt-devel 01064 urpmi bzip2-devel 01065 urpmi ffmpeg-devel 01066 urpmi fftw-devel 01067 urpmi gsl-devel 01068 urpmi blas-devel 01069 urpmi lapack-devel 01070 urpmi avc1394-devel 01071 01072 # pick one, as they conflict... 01073 urpmi dc1394-devel 01074 urpmi lib64dc1394_22-devel 01075 01076 urpmi raw1394-utils 01077 urpmi SDL-devel 01078 urpmi SDL_gfx-devel 01079 urpmi SDL_mixer-devel 01080 urpmi SDL_image-devel 01081 urpmi openmpi 01082 urpmi gd-devel 01083 urpmi readline-devel 01084 urpmi termcap-devel 01085 urpmi qwt-devel 01086 urpmi ode-devel 01087 urpmi cwiimote-devel 01088 urpmi bluez-devel 01089 urpmi qt3-devel 01090 01091 urpmi opencv-devel 01092 01093 # and don't forget the essentials: 01094 urpmi xv 01095 urpmi mencoder 01096 urpmi mplayer 01097 urpmi zsh 01098 01099 # needed for ice 3.3.0 (in http://ilab.usc.edu/packages/forall/current/) 01100 urpmi db4.6 01101 urpmi lib64dbcxx4.6 01102 urpmi openssl (should be installed already) 01103 urpmi expat (should be installed already) 01104 rpm -Uvh ice-3.3.0-1.rhel5.noarch.rpm 01105 # In the command below, first run it without the --nodeps and make 01106 # sure you only get complaints about libcrypto, libssl and libdb, 01107 # all of which should be installed already, then 01108 rpm -Uvh --nodeps ice-c++-devel-3.3.0-1.rhel5.x86_64.rpm 01109 ice-libs-3.3.0-1.rhel5.x86_64.rpm 01110 ice-servers-3.3.0-1.rhel5.x86_64.rpm 01111 ice-utils-3.3.0-1.rhel5.x86_64.rpm 01112 \endverbatim 01113 01114 Some packages do not have readily available RPMs for Mandriva. Look in 01115 saliency/packages for .spec files to make these RPMs for your system 01116 yourself. 01117 01118 <!--############################################################--> 01119 01120 \subsubsection macosx-fink 4.2.2 Building under Mac OS X 01121 01122 In order to get the most use out of the toolkit under Mac OS X, you 01123 will need to do two things: 01124 01125 - make sure you have installed the Mac OS X Developer Tools (also 01126 known as the Xcode from 10.3 onward), which you can install either 01127 from a separate Developer Tools CD that may have accompanied your 01128 shrinkwrapped copy of Mac OS X, or which you can download and 01129 install from Apple's web site (follow links from 01130 http://developer.apple.com/) 01131 01132 - install Fink (http://fink.sourceforge.net/), which is essentially a 01133 packaging system for ports of common unix/linux utilities to Mac OS 01134 X. With Fink you will be able to download and install many of the 01135 3rd-party libraries that provide additional functionality for the 01136 programs in the iLab Neuromorphic Vision Toolkit. See 01137 http://fink.sourceforge.net/download/ for a "Quick Start" tutorial 01138 on Fink -- in particular, see the section on X11; you'll need to 01139 have either Apple's or Fink's X11 installed. 01140 01141 Here is an example of packages which I installed on a Leopard macbook, 01142 at svn revision 11488 of our code, using manual "fink install" 01143 commands (I said yes to install all dependencies when asked): 01144 01145 \verbatim 01146 gcc42 01147 sdl sdl-image sdl-mixer 01148 libpng3 01149 libjpeg 01150 popt 01151 qt3 qt3-designer 01152 gsl 01153 ffmpeg 01154 \endverbatim 01155 01156 then, if you allow yourself to install unstable fink packages from 01157 source, you can also get things like fftw3, a recent gcc compiler, etc 01158 01159 To list all installed Fink packages, do "fink list" from a terminal 01160 command line -- installed packages will be shown with a "i" at the 01161 beginning of the line. To give you some guidance in selecting packages 01162 for installation, one of our Mac OS X (10.3) systems has the following 01163 packages installed, and is able to build most of the programs in the 01164 toolkit: 01165 01166 \verbatim 01167 anacron 2.3-4 Periodic command scheduler 01168 apr-ssl-shlibs 0.9.5-15 Apache Portable Runtime 01169 apt 0.5.4-37 Advanced front-end for dpkg 01170 apt-shlibs 0.5.4-37 Advanced front-end for dpkg 01171 arts 1.1.4-22 KDE - analog realtime synthesizer 01172 arts-shlibs 1.1.4-22 KDE - arts shared libraries 01173 audiofile 0.2.6-10 Audio File Library *Developement Files* 01174 audiofile-bin 0.2.6-10 Audio File Library *Binaries* 01175 audiofile-shlibs 0.2.6-10 Audio File Library *Shared Libraries* 01176 base-files 1.9.2-1 Directory infrastructure 01177 bzip2 1.0.2-12 Block-sorting file compressor 01178 bzip2-dev 1.0.2-12 Developer files for bzip2 package 01179 bzip2-shlibs 1.0.2-12 Shared libraries for bzip2 package 01180 cctools 525-1 [virtual package representing the developer tools] 01181 cctools-extra 1:495-3 Extra software from cctools 01182 cctools-single-module 1.0-1 [virtual package, your dev tools support -single_module] 01183 ctan-other-misc 1.0-1 LaTeX macros from CTAN contrib/other/misc directory 01184 cvs 1.11.17-1 Version control system 01185 cyrus-sasl2-shlibs 2.1.15-23 Cyrus Simple Authentication and Security Layer Library 01186 daemonic 20010902-2 Interface to daemon init scripts 01187 darwin 7.9.0-1 [virtual package representing the kernel] 01188 db42-ssl-shlibs 4.2.52-12 Shared Libraries for db42-ssl 01189 debianutils 1.23-11 Misc. utilities specific to Debian (and Fink) 01190 detex 2.7-2 Filter to strip TeX commands from a .tex file 01191 diffutils 2.8.1-1 Tools to compare files 01192 dosunix 1.0.13-1 Converts DOS text files to unix text format 01193 dpkg 1.10.21-202 The Debian package manager 01194 emacs21 21.2-26 Flexible real-time text editor, v21.2 with X11 support 01195 emacsen-common 1.4.13-2 Common facilities for all emacsen 01196 esound 0.2.32-4 Enlightened Sound Daemon 01197 esound-bin 0.2.32-4 Enlightened Sound Daemon 01198 esound-common 0.2.32-4 Enlightened Sound Daemon 01199 esound-shlibs 0.2.32-4 Enlightened Sound Daemon 01200 expat-shlibs 1.95.7-1 C library for parsing XML 01201 file 3.41-1 Determine file type (magic) 01202 fileutils 4.1-4 Common shell commands like ls, touch, chmod 01203 fink 0.21.3-1 The Fink package manager 01204 fink-mirrors 0.21.1.1-1 Mirror infrastructure 01205 fink-prebinding 0.7.1-2 Tools for enabling prebinding in Fink 01206 gawk 3.1.2-12 The Awk processing language, GNU edition 01207 gcc2 2.95.2-1 [virtual package representing the gcc 2.95.2 compiler] 01208 gcc2.95 2.95.2-1 [virtual package representing the gcc 2.95.2 compiler] 01209 gcc3.1 3.1-1 [virtual package representing the gcc 3.1 compiler] 01210 gcc3.3 3.3-1 [virtual package representing the gcc 3.3 compiler] 01211 gdbm3-shlibs 1.8.3-1 Shared libraries for gdbm3 package 01212 gettext 0.10.40-18 Message localization support 01213 gettext-bin 0.10.40-18 Executables for gettext package 01214 gettext-dev 0.10.40-18 Developer files for gettext package 01215 ghostscript 8.00-3 Interpreter for PostScript and PDF 01216 ghostscript-fonts 6.0-3 Standard fonts for Ghostscript 01217 gimp-print-shlibs 4.2.5-1 [virtual package representing Apple's install of Gimp Print] 01218 glib 1.2.10-18 Common C routines used by Gtk+ and other libs 01219 glib-shlibs 1.2.10-18 Common C routines used by Gtk+ and other libs 01220 glib2-shlibs 2.2.3-2 GTK+ - low-level core libraries 01221 gmp-shlibs 4.1.2-11 Shared libraries for gmp package 01222 gnupg 1.2.4-1 Gnu privacy guard - A Free PGP replacement 01223 grep 2.4.2-3 Search text files for patterns 01224 gtk+ 1.2.10-27 The Gimp Toolkit 01225 gtk+-data 1.2.10-27 The Gimp Toolkit 01226 gtk+-shlibs 1.2.10-27 The Gimp Toolkit 01227 gzip 1.2.4a-6 The gzip file compressor 01228 ifmslide 0.45-4 Powerful presentations with PDFLaTeX and LaTeX 01229 imagemagick 5.5.1-23 Image manipulation tools 01230 kdebase3-ssl 3.1.4-21 KDE - base system 01231 kdebase3-ssl-shlibs 3.1.4-21 KDE - base shared libraries 01232 kdegames3-base 3.1.4-21 KDE - kdegames base package 01233 kdegames3-common 3.1.4-21 KDE - game shared libraries 01234 kdelibs3-ssl 3.1.4-22 KDE - essential libraries 01235 kdelibs3-ssl-shlibs 3.1.4-22 KDE - essential shared libraries 01236 kshisen 3.1.4-21 KDE - Shisen-So - a Mah Jong-like game 01237 latex2html 2002-2-1-1 Converts LaTeX documents to HTML 01238 lcms-shlibs 1.12-1 Free color management engine in 100K 01239 less 381-10 Featureful text pager 01240 lesstif-shlibs 1:0.93.18-1 Free implementation of OSF/Motif 01241 libart2-shlibs 2.3.16-2 Library for high-performance 2D graphics 01242 libiconv 1.9.1-11 Character set conversion library 01243 libiconv-bin 1.9.1-11 Executables for libiconv package 01244 libiconv-dev 1.9.1-11 Developer files for libiconv package 01245 libjpeg 6b-16 JPEG image format handling library 01246 libjpeg-bin 6b-16 Executables for libjpeg package 01247 libjpeg-shlibs 6b-16 Shared libraries for libjpeg package 01248 libmad-shlibs 0.15.0b-2 MPEG audio decoder library 01249 libogg-shlibs 1.1-1 Ogg bitstream shared libraries 01250 libpng3 1:1.2.5-2 PNG image format handling library 01251 libpng3-shlibs 1:1.2.5-2 Shared libraries for libpng3 package 01252 libtiff 3.6.1-1 TIFF image format library and tools 01253 libtiff-bin 3.6.1-1 Executables for libtiff package 01254 libtiff-shlibs 3.6.1-1 Shared libraries for libtiff package 01255 libvorbis0-shlibs 1.0.1-1 Vorbis audio codec shared libraries 01256 libwww-bin 5.3.2-4 General-purpose Web API written in C for Unix and Windows 01257 libwww-shlibs 5.3.2-4 General-purpose Web API written in C for Unix and Windows 01258 libxml2-bin 2.6.7-2 XML parsing library, version 2 01259 libxml2-shlibs 2.6.7-2 XML parsing library, version 2 01260 libxslt-shlibs 1.1.4-3 XML stylsheet transformation shared libraries 01261 m4 1.4-6 Advanced macro processing language 01262 macosx 10.3.9-1 [virtual package representing the system] 01263 make 3.79.1-3 Software build tool 01264 ncurses 5.3-20031018-2 Full-screen ascii drawing library 01265 ncurses-dev 5.3-20031018-2 Development files for ncurses package 01266 ncurses-shlibs 5.3-20031018-2 Shared libraries for ncurses package 01267 neon24-ssl-shlibs 0.24.7-11 HTTP/WebDAV client library with a C API 01268 netpbm-bin 10.12-3 Graphics manipulation programs and libraries 01269 netpbm10 10.12-3 Graphics manipulation programs and libraries 01270 netpbm10-shlibs 10.12-3 Graphics manipulation programs and libraries 01271 nget 0.23-2 Downloader for binary news postings 01272 openldap-ssl-shlibs 2.1.22-25 Shared libraries for LDAP 01273 openslp-ssl-shlibs 1.0.9a-4 Shared Libraries for OpenSLP + SSL Support 01274 openssh 3.7.1p1-1 Secure shell (remote login) client and server 01275 openssl 0.9.6m-11 Secure Sockets Layer and general crypto library 01276 openssl-shlibs 0.9.6m-11 Secure Sockets Layer and general crypto library 01277 openssl097-shlibs 0.9.7d-1 Secure Sockets Layer and general crypto library 01278 patch 2.5.4-2 Utility to apply patches to source trees 01279 pcre-shlibs 4.2-2 Perl Compatible Regular Expressions Library 01280 pdfscreen 1.5-6 Resize LaTeX-produced pdf to fit on computer screen 01281 popt 1.7-3 Library for parsing command line options 01282 popt-shlibs 1.7-3 Library for parsing command line options 01283 ppower4 0.9.4-1 Post-processor for PDF presentations created by pdf(La)TeX 01284 python23 1:2.3.3-23 Interpreted, object-oriented language 01285 python23-shlibs 1:2.3.3-23 Interpreted, object-oriented language 01286 python23-socket 1:2.3.3-23 Socket plugin for python 01287 python23-socket-ssl 1:2.3.3-23 Socket plugin for python (SSL version) 01288 qt3 3.2.2-12 Cross-Platform GUI application framework 01289 qt3-designer 3.2.2-12 Cross-Platform GUI application framework 01290 qt3-doc 3.2.2-12 Cross-Platform GUI application framework 01291 qt3-linguist 3.2.2-12 Cross-Platform GUI application framework 01292 qt3-shlibs 3.2.2-12 Cross-Platform GUI application framework 01293 readline 4.3-25 Comfortable terminal input library 01294 readline-shlibs 4.3-25 Comfortable terminal input library 01295 rsync 2.5.5-1 Synchronize filesystems between hosts 01296 sdl 1.2.7-1 Cross-platform multimedia library 01297 sdl-image 1.2.3-1 SDL image file loading library 01298 sdl-image-shlibs 1.2.3-1 SDL image file loading library 01299 sdl-mixer 1.2.5-12 SDL multi-channel audio mixer library 01300 sdl-mixer-shlibs 1.2.5-12 SDL multi-channel audio mixer library 01301 sdl-shlibs 1.2.7-1 Cross-platform multimedia library 01302 sed 4.0.5-1 The stream editor, GNU version 01303 smpeg-shlibs 0.4.4-25 SDL MPEG Player Library 01304 storable-pm 1.0.14-7 Placeholder for versioned Storable packages 01305 swig-shlibs 1.3.20-11 Tool that connects C, C++ programs with high-level languages 01306 system-java 1.4.2-1 [virtual package representing Java 1.4.2] 01307 system-java13 1.3.1-1 [virtual package representing Java 1.3.1] 01308 system-java13-dev 1.3.1-1 [virtual package representing Java 1.3.1 development headers] 01309 system-java14 1.4.2-1 [virtual package representing Java 1.4.2] 01310 system-java14-dev 1.4.2-1 [virtual package representing Java 1.4.2 development headers] 01311 system-perl 5.8.1-1 [virtual package representing perl] 01312 system-xfree86 2:4.3-2 [placeholder for user installed x11] 01313 system-xfree86-dev 2:4.3-2 [placeholder for user installed x11 development tools] 01314 system-xfree86-shlibs 2:4.3-2 [placeholder for user installed x11 shared libraries] 01315 t1lib1-shlibs 1.3.1-2 Shared libs for generating Type 1 Font bitmaps 01316 tar 1.13.25-12 GNU tar - tape archiver 01317 tcltk 8.4.1-12 Tool Command Language and the Tk toolkit 01318 tcltk-dev 8.4.1-12 Tool Command Language and the Tk toolkit 01319 tcltk-shlibs 8.4.1-12 Tool Command Language and the Tk toolkit 01320 tetex 2.0.2-36 Complete distribution of the TeX typesetting system 01321 tetex-base 2.0.2-36 Base programs for a teTeX installation 01322 tetex-shlibs 2.0.2-36 Shared libraries for a teTeX installation 01323 tetex-texmf 2.0.2-2 Main texmf tree for a teTeX installation 01324 tex4ht 20030412-10 TeX to Hypertext translator 01325 texinfo 4.7-11 Texinfo documentation system 01326 texpower 0.0.8h-1 Creating dynamic online presentations with LaTeX 01327 type1inst 0.6.1-3 Type 1 PostScript font installation utility 01328 unrar 3.3.5-21 RAR archive decoder 01329 unzip 5.50-14 Decompression compatible with pkunzip 01330 wget 1.8.2-2 Automatic web site retreiver 01331 xfontpath 0.4-12 X font path manager for fink 01332 \endverbatim 01333 01334 Once you have the Xcode/Developer Tools and Fink installed, you can 01335 build the toolkit from a terminal window 01336 (/Applications/Utilities/Terminal.app) using the standard ./configure 01337 and make sequence shown in \ref basic-compilation. 01338 01339 <!--############################################################--> 01340 01341 \subsubsection windows-cygwin 4.2.3 Building under Windows in the Cygwin environment 01342 01343 In order to build the toolkit under Windows, you will need to install 01344 a Cygwin environment (http://www.cygwin.com/), which provides a 01345 unix-style development environment. 01346 01347 To install cygwin, essentially you need to download the program 01348 setup.exe from http://www.cygwin.com/, then run the setup.exe program 01349 which will guide you through selecting a set of packages to 01350 install. You can always go back and re-run setup.exe if you find you 01351 need to install additional packages later on, or if you want to 01352 upgrade your packages to the latest version. 01353 01354 To list all installed packages, do "cygcheck -c -d" from a cygwin bash 01355 shell. To give you some guidance in selecting packages for 01356 installation, one of our Windows systems has the following packages 01357 installed, and is able to build most of the programs in the toolkit: 01358 01359 \verbatim 01360 _update-info-dir 00349-1 01361 agetty 2.1-1 01362 alternatives 1.3.20a-2 01363 apache 1.3.33-2 01364 apr 0.9.7-1 01365 apr-util 0.9.7-1 01366 ash 20040127-3 01367 astyle 1.15.3-3 01368 atk 1.9.1-1 01369 atk-devel 1.9.1-1 01370 atk-doc 1.9.1-1 01371 atk-runtime 1.9.1-1 01372 autoconf 2.59-2 01373 autoconf-devel 2.59-2 01374 autoconf-stable 2.13-6 01375 autoconf2.1 2.13-1 01376 autoconf2.5 2.59-2 01377 automake 1.7.9-2 01378 automake-devel 1.9.2-2 01379 automake-stable 1.4p6-3 01380 automake1.4 1.4p6-2 01381 automake1.9 1.9.6-1 01382 autossh 1.3-2 01383 base-files 3.7-1 01384 base-passwd 2.2-1 01385 bash 3.0-14 01386 bc 1.06-2 01387 binutils 20050610-1 01388 bison 20030307-1 01389 byacc 1.9-1 01390 bzip2 1.0.3-1 01391 c-client 2002e-3 01392 c3270 3.2.20-1 01393 cabextract 1.1-1 01394 ccache 2.2-1 01395 ccdoc 0.8.41-2 01396 ccrypt 1.7-1 01397 check 0.9.1-1 01398 chere 0.6-3 01399 chkconfig 1.2.24h-1 01400 clamav 0.87.1-1 01401 clear 1.0-2 01402 clisp 2.38-1 01403 cmake 2.2.3-2 01404 cocom 0.995-1 01405 compface 1.5.2-1 01406 coreutils 5.93-3 01407 cpio 2.6-5 01408 cppunit 1.9.14-1 01409 cron 3.0.1-19 01410 crypt 1.1-1 01411 ctags 5.5-4 01412 curl 7.15.1-1 01413 curl-devel 7.15.1-1 01414 cvs 1.11.17-1 01415 cygipc 2.03-2 01416 cygrunsrv 1.12-1 01417 cygutils 1.2.9-1 01418 cygwin 1.5.19-4 01419 cygwin-doc 1.4-3 01420 cyrus-sasl 2.1.19-3 01421 d 1.2.0-1 01422 ddd 3.3.9-1 01423 dejagnu 20021217-2 01424 desktop-file-utils 0.10-1 01425 diffstat 1.40-1 01426 diffutils 2.8.7-1 01427 distcc 2.18.3-1 01428 doxygen 1.4.6-1 01429 dpkg 1.10.4-2 01430 e2fsimage 0.2.0-2 01431 e2fsprogs 1.35-3 01432 ed 0.2-1 01433 editrights 1.01-1 01434 ELFIO 1.0.2-1 01435 emacs 21.2-13 01436 emacs-el 21.2-13 01437 emacs-X11 21.2-13 01438 esound 0.2.36-1 01439 expat 1.95.8-1 01440 expect 20030128-1 01441 fftw3 3.0.1-2 01442 fftw3-dev 3.0.1-2 01443 fftw3-doc 3.0.1-2 01444 file 4.16-1 01445 fileutils 4.1-3 01446 findutils 4.2.27-1 01447 flex 2.5.4a-3 01448 fltk 1.1.4-2 01449 fontconfig 2.2.2-1 01450 freeglut 2.2.0-1 01451 freetype2 2.1.9-1 01452 gawk 3.1.5-2 01453 gcc 3.4.4-1 01454 gcc-ada 3.4.4-1 01455 gcc-core 3.4.4-1 01456 gcc-g++ 3.4.4-1 01457 gcc-g77 3.4.4-1 01458 gcc-gdc 3.4.4-1 01459 gcc-gpc 3.3.3-3 01460 gcc-java 3.4.4-1 01461 gcc-mingw 20040810-1 01462 gcc-mingw-ada 20050522-1 01463 gcc-mingw-core 20050522-1 01464 gcc-mingw-g++ 20050522-1 01465 gcc-mingw-g77 20050522-1 01466 gcc-mingw-gdc 20050522-1 01467 gcc-mingw-gpc 20040810-1 01468 gcc-mingw-java 20050522-1 01469 gcc-mingw-objc 20050522-1 01470 gcc-objc 3.4.4-1 01471 gdb 20041228-3 01472 gdbm 1.8.3-7 01473 gettext 0.14.5-1 01474 gettext-devel 0.14.5-1 01475 ghostscript 8.15-2 01476 ghostscript-base 8.15-2 01477 ghostscript-x11 8.15-2 01478 glib 1.2.10-3 01479 glib-devel 1.2.10-3 01480 glib2 2.6.6-2 01481 glib2-devel 2.6.6-2 01482 glib2-runtime 2.6.6-2 01483 gmp 4.1.4-2 01484 gnome-common 2.12.0-1 01485 gnome-keyring 0.4.6-1 01486 gnome-mime-data 2.4.2-1 01487 gnupg 1.4.1-1 01488 gperf 2.7.2-1 01489 grep 2.5.1a-2 01490 groff 1.18.1-2 01491 gtk+-devel 1.2.10-2 01492 gtk-doc 1.3-1 01493 gtk2-x11 2.6.10-1 01494 gtk2-x11-devel 2.6.10-1 01495 gtk2-x11-doc 2.6.10-1 01496 gtk2-x11-runtime 2.6.10-1 01497 guile 1.6.7-4 01498 guile-devel 1.6.7-4 01499 guile-doc 1.6.7-4 01500 gzip 1.3.5-1 01501 help2man 1.35.1-1 01502 indent 2.2.9-1 01503 inetutils 1.3.2-35 01504 initscripts 0.9-1 01505 intltool 0.33-1 01506 ioperm 0.4-1 01507 irc 20010101-3 01508 jasper 1.701.0-1 01509 jbigkit 1.5-3 01510 jpeg 6b-11 01511 keychain 2.5.3.1-1 01512 lablgtk2 2.4.0-2 01513 lcms 1.14-1 01514 less 381-1 01515 lesstif 0.93.94-2 01516 lftp 2.6.10-2 01517 libapr0 0.9.7-1 01518 libaprutil0 0.9.7-1 01519 libart_lgpl 1.4.2-3 01520 libart_lgpl2 2.3.17-1 01521 libaudiofile-devel 0.2.6-2 01522 libaudiofile0 0.2.6-2 01523 libbonobo2 2.10.1-1 01524 libbonobo2-devel 2.10.1-1 01525 libbonobo20 2.10.1-1 01526 libbz2_1 1.0.3-1 01527 libcharset1 1.9.2-2 01528 libcroco06 0.6.0-1 01529 libcurl3 7.15.1-1 01530 libdb4.1 4.1.25-1 01531 libdb4.2 4.2.52-1 01532 libdb4.3 4.3.28-1 01533 libesound-devel 0.2.36-1 01534 libesound0 0.2.36-1 01535 libfontconfig-devel 2.2.2-1 01536 libfontconfig1 2.2.2-1 01537 libfpx 1.2.0.12-1 01538 libfreetype2-devel 2.1.9-1 01539 libfreetype26 2.1.9-1 01540 libgcrypt 1.2.1-1 01541 libgdbm 1.8.0-5 01542 libgdbm-devel 1.8.3-7 01543 libgdbm3 1.8.3-3 01544 libgdbm4 1.8.3-7 01545 libgettextpo0 0.14.5-1 01546 libglade2 2.5.1-1 01547 libgnomecanvas2 2.10.2-1 01548 libgpg-error 1.1-1 01549 libGraphicsMagick-devel 1.0.6-1 01550 libGraphicsMagick0 1.0.6-1 01551 libguile12 1.6.7-4 01552 libguile16 1.7.1.20041006-1 01553 libiconv 1.9.2-2 01554 libiconv2 1.9.2-2 01555 libIDL 0.5.17-2 01556 libIDL2 0.8.6-1 01557 libintl 0.10.38-3 01558 libintl1 0.10.40-1 01559 libintl2 0.12.1-3 01560 libintl3 0.14.5-1 01561 libjpeg62 6b-11 01562 libjpeg6b 6b-8 01563 libkpathsea3 2.0.2-15 01564 libkpathsea4 3.0.0-3 01565 libltdl3 1.5.20-2 01566 libltdl6 1.9f_20041024-1 01567 libMagick-devel 6.0.4-1 01568 libMagick6 6.0.4-1 01569 libncurses-devel 5.4-4 01570 libncurses5 5.2-1 01571 libncurses6 5.2-8 01572 libncurses7 5.3-4 01573 libncurses8 5.4-4 01574 libneon24 0.24.7-2 01575 libneon25 0.25.5-1 01576 libnetpbm10 10.30-1 01577 libopenldap2 2.1.25-1 01578 libopenldap2_2_7 2.2.26-2 01579 libpcre 4.1-2 01580 libpcre0 6.3-1 01581 libpng 1.2.8-2 01582 libpng12 1.2.8-2 01583 libpng12-devel 1.2.8-2 01584 libpopt0 1.6.4-4 01585 libreadline4 4.1-2 01586 libreadline5 4.3-5 01587 libreadline6 5.1-1 01588 libsasl2 2.1.19-3 01589 libsasl2-devel 2.1.19-3 01590 libsmi 0.4.2-1 01591 libtiff-devel 3.7.3-1 01592 libtiff4 3.6.0-5 01593 libtiff5 3.7.3-1 01594 libtool 1.5b-2 01595 libtool-devel 1.5.10-2 01596 libtool-stable 1.4.3-3 01597 libtool1.5 1.5.20-2 01598 libungif 4.1.4-1 01599 libungif4 4.1.4-1 01600 libwnck 2.8.1-1 01601 libXft 2.1.6-1 01602 libXft-devel 2.1.6-1 01603 libXft1 1.0.0-1 01604 libXft2 2.1.6-1 01605 libxml2 2.6.22-1 01606 libxml2-devel 2.6.22-1 01607 libxml2-python 2.6.22-1 01608 libxslt 1.1.15-2 01609 lighttpd 1.4.9-1 01610 login 1.9-7 01611 m4 1.4.4-1 01612 make 3.80-1 01613 man 1.5p-1 01614 mc 4.6.1-2 01615 mingw-runtime 3.9-2 01616 minires 1.00-1 01617 minires-devel 1.00-1 01618 mktemp 1.5-3 01619 more 2.11o-2 01620 mt 2.3.1-1 01621 naim 0.11.8.1-1 01622 nano 1.2.2-1 01623 nasm 0.98.39-1 01624 ncftp 3.1.7-1 01625 ncurses 5.4-4 01626 nedit 5.5-1 01627 neon 0.25.5-1 01628 netcat 1.10-2 01629 netpbm 10.30-1 01630 ocaml 3.08.1-1 01631 openjade 1.3.3-1 01632 openldap 2.2.26-2 01633 openldap-devel 2.2.26-2 01634 OpenSP 1.5.1-1 01635 openssh 4.2p1-1 01636 openssl 0.9.8a-1 01637 openssl-devel 0.9.8a-1 01638 openssl097 0.9.7i-1 01639 ORBit2 2.12.3-1 01640 ORBit2-devel 2.12.3-1 01641 pango 1.8.1-1 01642 pango-devel 1.8.1-1 01643 pango-doc 1.8.1-1 01644 pango-runtime 1.8.1-1 01645 patch 2.5.8-8 01646 patchutils 0.2.31-1 01647 pcre 6.3-1 01648 pcre-devel 6.3-1 01649 pcre-doc 6.3-1 01650 pdksh 5.2.14-3 01651 perl 5.8.7-5 01652 perl-libwin32 0.26-1 01653 ping 1.0-1 01654 pkgconfig 0.17.2-2 01655 popt 1.6.4-4 01656 postgresql 8.0.4-1 01657 pr3270 3.2.20-1 01658 procps 3.2.5-1 01659 proftpd 1.2.10-1 01660 python 2.4.1-1 01661 qt3 3.3.4-2 01662 qt3-bin 3.3.4-2 01663 qt3-devel 3.3.4-2 01664 qt3-doc 3.3.4-2 01665 rcs 5.7-3 01666 readline 5.1-1 01667 rebase 2.4.2-1 01668 rpm 4.1-2 01669 rpm-build 4.1-1 01670 rpm-doc 4.1-1 01671 rsync 2.6.6-1 01672 ruby 1.8.4-1 01673 run 1.1.6-1 01674 rxvt 2.7.10-6 01675 s3270 3.2.20-1 01676 sed 4.1.4-1 01677 setsid 0.0-3 01678 sh-utils 2.0.15-5 01679 shared-mime-info 0.16-1 01680 sharutils 4.5.3-1 01681 shutdown 1.7-1 01682 splint 3.1.1-1 01683 startup-notification 0.8-1 01684 stunnel 4.14-2 01685 subversion 1.2.3-1 01686 subversion-devel 1.2.3-1 01687 suite3270 3.2.20-1 01688 SWI-Prolog 5.2.6-1 01689 swig 1.3.25-1 01690 sysvinit 2.84-4 01691 t1lib 5.1.0-1 01692 tar 1.15.1-3 01693 tcl3270 3.2.20-1 01694 tcltk 20030901-1 01695 tcm 2.20-1 01696 tcp_wrappers 7.6-1 01697 tcsh 6.14.00-5 01698 termcap 20050421-1 01699 terminfo 5.4_20041009-1 01700 tetex-base 3.0.0-3 01701 tetex-bin 3.0.0-3 01702 tetex-devel 3.0.0-3 01703 tetex-extra 3.0.0-3 01704 texinfo 4.8-1 01705 TeXmacs 1.0.6-1 01706 textutils 2.0.21-2 01707 time 1.7-1 01708 tin 1.8.0-1 01709 transfig 3.2.4-2 01710 ttcp 19980512-1 01711 tzcode 2005r-2 01712 unison 2.10.2-4 01713 units 1.77-1 01714 unzip 5.50-5 01715 upx 1.24-1 01716 uw-imap 2002e-3 01717 vim 6.4-4 01718 w32api 3.6-1 01719 which 1.7-1 01720 whois 4.7.11-1 01721 WordNet 2.0-1 01722 X-startup-scripts 1.0.11-1 01723 x3270 3.2.20-1 01724 Xaw3d 1.5D-5 01725 xemacs 21.4.18-2 01726 xemacs-emacs-common 21.4.18-2 01727 xemacs-mule-sumo 2005-12-08-1 01728 xemacs-sumo 2005-12-08-1 01729 xemacs-tags 21.4.18-2 01730 xerces-c-devel 2.5.0-1 01731 XFree86-lib-compat 4.3.0-2 01732 xinetd 2.3.9-1 01733 xorg-x11-base 6.8.2.0-1 01734 xorg-x11-bin 6.8.2.0-1 01735 xorg-x11-bin-dlls 6.8.2.0-1 01736 xorg-x11-bin-lndir 6.8.2.0-1 01737 xorg-x11-devel 6.8.2.0-2 01738 xorg-x11-etc 6.8.2.0-1 01739 xorg-x11-f100 6.8.1.0-3 01740 xorg-x11-fenc 6.8.1.0-2 01741 xorg-x11-fnts 6.8.1.0-3 01742 xorg-x11-fscl 6.8.1.0-2 01743 xorg-x11-fsrv 6.8.2.0-1 01744 xorg-x11-libs-data 6.8.2.0-1 01745 xorg-x11-man-pages 6.8.2.0-1 01746 xorg-x11-xwin 6.8.2.0-4 01747 xpdf 3.01-1 01748 xterm 202-1 01749 zip 2.3-6 01750 zlib 1.2.3-1 01751 zsh 4.2.6-1 01752 \endverbatim 01753 01754 Once you have a cygwin environment installed, you can build the 01755 toolkit from cygwin shell window using the standard ./configure and 01756 make sequence shown in \ref basic-compilation. 01757 01758 If you want to use any of the tcl-based apps (e.g., bin/invt), you may 01759 get an error like the following: 01760 \verbatim 01761 fatal initialization error (package 'Tcl'): 01762 Can't find a usable init.tcl in the following directories: 01763 \endverbatim 01764 In that case, you need to set the TCL_LIBRARY environment variable, 01765 either on the command-line or in your ~/.bashrc, like so: 01766 \verbatim 01767 export TCL_LIBRARY="C:/cygwin/usr/share/tcl8.4" 01768 \endverbatim 01769 01770 <!--############################################################--> 01771 01772 \subsection parallel-code-notes 4.3. Parallel code notes 01773 01774 01775 NOTE: PVM SUPPORT HAS BEEN OBSOLETED AND REMOVED AT SVN REVISION 8264. 01776 01777 You need to install PVM (Parallel Virtual Machine), a supercomputing 01778 message passing toolkit from Oak Ridge National Laboratory 01779 (www.epm.ornl.gov/pvm/pvm_home.html) for 'pvision' and 01780 'pvision-master' to compile. These two programs implement our model of 01781 bottom-up, saliency-based visual attention to run on a cluster of 01782 Linux machines connected through a high-speed network. These two 01783 programs are rather obsolete as better versions are now available that 01784 do not require PVM (pvisionTCP, pvisionTCP2, etc). If you do not wish 01785 to install PVM and to compile those two programs, don't try "make 01786 pvm". 01787 01788 Note that "make pvm" is implicitly called by "make all" so you will 01789 need to have PVM installed for "make all" to work. 01790 01791 01792 <!--############################################################--> 01793 01794 \subsection other-libs 4.4. IEEE-1394, SDL, ffmpeg, and other libs code notes 01795 01796 01797 You will need the FireWire development libs for the IEEE1394 code to 01798 compile properly. On Mandrake 9.0, that means that you will need to 01799 install: 01800 01801 \verbatim 01802 libdc1394_0-0.9.0-1mdk.i586.rpm 01803 libdc1394_0-devel-0.9.0-1mdk.i586.rpm 01804 libraw1394_5-0.9.0-2mdk.i586.rpm 01805 libraw1394_5-devel-0.9.0-2mdk.i586.rpm 01806 \endverbatim 01807 01808 or later versions. That will allow the code to compile. To run it, you 01809 will in addition need to (as root): 01810 01811 \verbatim 01812 mknod -m 777 /dev/raw1394 c 171 0 01813 mkdir /dev/video1394 01814 mknod -m 777 /dev/video1394/0 c 171 16 01815 01816 modprobe ohci1394 01817 modprobe raw1394 01818 modprobe video1394 01819 \endverbatim 01820 01821 You will need SDL development libs for the SDL-related code to 01822 compile, ffmpeg libs to the MPEG-related code, etc. It can be a long 01823 and frustrating process to find and install all the packages needed 01824 for "make all" to succeed. To help you, please see: 01825 01826 http://iLab.usc.edu/packages/ 01827 01828 which contains the list of "exotic" packages we have installed on our 01829 machines so that "make all" will work. 01830 01831 01832 01833 <!--############################################################--> 01834 01835 \subsection autoconf 4.5. Using autoconf to control the build process 01836 01837 01838 <!--############################################################--> 01839 01840 \subsubsection just-building 4.5.1. If you are just going to build the software 01841 01842 01843 The first thing you'll notice is that there is no Makefile in the 01844 subversion repository! This is because we have a configure script 01845 that checks various features of the build environment (i.e. your 01846 computer), and uses that information to generate a Makefile from a 01847 Makefile.in template. In addition, the configure script allows you 01848 to toggle additional switches controlling how the build will be 01849 done. 01850 01851 To see the list of available configuration options: 01852 01853 \verbatim 01854 ./configure --help 01855 \endverbatim 01856 01857 To run the configure script, just type ./configure. In general, if 01858 you don't specify any additional options to ./configure, you'll just 01859 get the right default behavior (for old-timers: similar to what we 01860 got previously from the old Makefile). 01861 01862 01863 <!--############################################################--> 01864 01865 \subsubsection editing-makefile 4.5.2. If you need to edit or add to the Makefile 01866 01867 01868 Then the most important thing is DON'T EDIT THE FILE CALLED 01869 "Makefile"!!! 01870 01871 (Sorry to yell ;) but I find that that is the hardest part to 01872 remember of the entire autoconf process...) 01873 01874 Instead, you should edit "Makefile.in". This is the template file 01875 that ./configure uses to generate the Makefile. You'll find that 01876 Makefile.in looks very familiar. The main differences are: 01877 01878 - at the top of Makefile.in there are a bunch of lines like this: 01879 01880 \verbatim 01881 CXX := @CXX@ 01882 \endverbatim 01883 \par 01884 those are the lines where the configure script substitutes in 01885 the information it has garnered from its various checks. You 01886 won't need to worry about these unless you're also editing the 01887 configure script (then see step 3 below). 01888 01889 - instead of hardcoding the installation location for executables 01890 as "../bin", we now use "$(exec_prefix)/bin", which allows the 01891 user to specify a different installation location via the 01892 --prefix or --exec-prefix options to the configure script (but 01893 the default exec_prefix is still "..", so the default 01894 installation location is "../bin". 01895 01896 01897 <!--############################################################--> 01898 01899 \subsubsection editing-configure 4.5.3. If you need to change the configure script 01900 01901 01902 Then, just like the Makefile, DON'T EDIT THE FILE CALLED 01903 "configure"!!! 01904 01905 Instead, you should edit "configure.ac". This file is processed by 01906 the autoconf program to generate the configure script. 01907 01908 Next most important, if you change "configure.ac" and commit changes 01909 back to the subversion repository, then AFTERWARDS you MUST also run 01910 autoconf again, and then 'svn commit' the generated "configure" 01911 script. Here's why: 01912 01913 - Most people don't need to modify the configure.ac 01914 script. Therefore we don't want to require them to have autoconf 01915 installed on their system. Therefore they need to have access to 01916 the generated "configure" script, which is itself very highly 01917 portable bourne shell code. Therefore, we always need to have 01918 the most recent version of the "configure" script available on 01919 the svn server. 01920 01921 - It's important that you 'svn commit' the generated "configure" 01922 script AFTER the corresponding commit of "configure.ac", so that 01923 the timestamps are correct on the files. That's because the 01924 makefile has a rule to regenerate configure from 01925 configure.ac. But, we don't want that rule to get triggered 01926 unnecessarily. Therefore we need to make sure that, in the 01927 subversion repository, "configure" always has a later timestamp 01928 than "configure.ac". 01929 01930 - By convention, you don't need to put anything substantial in the 01931 svn log message for "configure"; in fact the best thing is to 01932 put something like "From configure.ac revision 4567", so we can 01933 always see which revisions correspond between the two files. 01934 01935 The configure.ac file itself is an m4-macroized version of bourne 01936 shell code. So you can put any bourne shell code into configure.ac, as 01937 long as its portable (i.e. shouldn't rely on bash-specific 01938 extensions). m4 is a macro language, just like the C preprocessor, 01939 except on steroids. The autoconf distribution basically consists of a 01940 large set of m4 macros that help you do useful tests. 01941 01942 You can read more about autoconf here: 01943 01944 - http://www.gnu.org/software/autoconf/autoconf.html 01945 - http://www.gnu.org/manual/autoconf/index.html 01946 01947 Running autoconf is very simple. You just type "autoconf". It looks 01948 for a file named "configure.ac" (or "configure.in", the older 01949 deprecated name for the script template), then does its 01950 m4-processing business, and writes the results to "configure". If 01951 all goes well, you'll see no messages. 01952 01953 Our configure.ac template requires autoconf 2.53 or later. In 01954 particular, it won't work with autoconf 2.13, which is still the 01955 default in some distros, although recent distros should at least 01956 have autoconf 2.53 available. 01957 01958 BE WARNED: Just because autoconf runs successfully does not mean 01959 that your configure script will be syntactically correct bourne 01960 shell code. All the autoconf does is run the m4 processor over your 01961 template. Therefore you should always try running the generated 01962 configure script to make sure there are no shell script syntax 01963 errors, before you 'svn commit' changes to "configure.ac". 01964 01965 Here's a quick overview of what happens in the configure.ac file: 01966 01967 - You'll notice two kinds of comments: those starting with "#", 01968 and those starting with "dnl". The "#" comments will be carried 01969 over intact into the generated "configure" file, while the "dnl" 01970 comments will be discarded by m4. 01971 01972 - The autoconf macros are easy to spot as they're all in all caps 01973 and the all start with AC_. 01974 01975 - Quoting in m4 is done with square brackets []. This is a bit of 01976 black magic. Nobody is really sure how many levels of quotes you 01977 should have. Conventional wisdom is: "if it doesn't work, add 01978 another level of quotes". In general, all arguments to macros 01979 should be quoted, even if they're a single word, or the result 01980 of another macro call. This is to avoid m4 getting overeager 01981 about what it tries to macro-process. 01982 01983 - configure.ac must start with AC_INIT() to specify the name of 01984 the project, its version number, an email address for bug 01985 reports, and a short name to be used in generated tar.gz 01986 distros. 01987 01988 - Near the end of the file will be one or more AC_CONFIG_FILES() 01989 calls. These tell the script that it should generated the named 01990 files by substituting all of the "output variables" (see below) 01991 into the corresponding template file. For example 01992 AC_CONFIG_FILES([Makefile:Makefile.in]) causes Makefile to be 01993 generated by doing output-variable-substitution in Makefile.in. 01994 01995 - The script builds a number of "output variables", which are 01996 variables that will be substituted during AC_CONFIG_FILES() 01997 calls. Some of the output variables are managed more or less 01998 automatically; these include: 01999 - the names of the C and C++ compilers (CC and CXX) 02000 These are computed by AC_PROG_CC() and AC_PROG_CXX(). 02001 - the C preprocessor flags (CPPFLAGS) -- e.g. -I options to gcc 02002 - C preprocessor definitions (DEFS) -- a list of -D options 02003 - the C compiler flags (CFLAGS) 02004 - the C++ compiler flags (CXXFLAGS) 02005 - the linker flags (LDFLAGS) 02006 - the libraries to be linked in to executables (LIBS) 02007 This is manipulated by AC_CHECK_LIB(), for example. 02008 02009 - In general, the idea is that you don't add something to one of 02010 the variables until you know that it works. That is, don't add a 02011 library to LIBS until you've checked that the library is present 02012 and working. Autoconf macros are designed to make these checks 02013 very simple. 02014 02015 - In general you need to do the checks in the order of least 02016 dependent to most dependent, since autoconf uses the various 02017 CPPFLAGS/CXXFLAGS/LIBS variables as it runs its tests. That is, 02018 if libfoo depends on libbar, then you need to check for libbar 02019 first. If libbar is present, then autoconf will add -lbar to 02020 LIBS. Then when you check for libfoo, it's dependence on libbar 02021 will already be satisfied. 02022 02023 - To add a -D option to the DEFS output variable, use AC_DEFINE() 02024 02025 - To your own variable into an output variable, call AC_SUBST() 02026 with the variable's name. 02027 02028 - To add a switch that the user can give as a command-line option 02029 to configure, use AC_ARG_ENABLE(). Probably best for you to read 02030 the docs if you need to use this, rather than for me to try to 02031 explain it... (or take a look at some of the existing usages in 02032 our own configure.ac). 02033 02034 - To add a macro that has already been written, you can place it 02035 in the acsite.m4 file, which will get included with configure.ac 02036 when running autoconf. You can examine the file to see how the 02037 autoqt macro (http://autoqt.sourceforge.net) was added. 02038 02039 02040 <!--############################################################--> 02041 02042 \subsection qt-notes 4.6. Qt3 code notes 02043 02044 02045 We are developing GUI applications for the Toolkit and some of these 02046 programs will depend on Qt, a very easy-to-use library that has 02047 cross-platform support, includes a powerful visual Designer software, 02048 and significantly reduces the amount of code necessary to create user 02049 interfaces (less than Xlib or Gtk). Qt has extensive documentation and 02050 widespread popularity throughout the open source community. Qt is 02051 released under GPL and is available for download from http://www.trolltech.com/ 02052 02053 Also, if you are running KDE, you should have Qt already installed 02054 because KDE is a very well-known Qt-based desktop environment. 02055 02056 To code with Qt3, please follow these instructions: 02057 02058 - Qt3 applications usually need the user to work with three types of 02059 files: 02060 -# ui files written in XML that describe the user interface -- 02061 can be automatically generated by Qt Designer 02062 -# ui.h files with additional code for setting up signals/slots 02063 and extending widgets -- Qt Designer will help set up the 02064 framework of these files 02065 -# cpp files, one of which is a generic main() function that you 02066 can freely modify -- Qt Designer can provide you with a 02067 barebones version, but you are better off writing it yourself 02068 or basing it on one of the existing ones 02069 02070 - Source code for Qt3 applications need to be placed in the 02071 saliency/src/Qt directory. This includes all three kinds of files 02072 mentioned above. 02073 02074 - Some of the files in the saliency/src/Qt directory are helpers 02075 that convert between formats recognized by Qt and those used in 02076 the rest of this toolkit. You can use these by including the 02077 appropriate header (e.g., #include "ImageConvertQt.H") 02078 02079 - Qt3 Designer will be very helpful for creating user interfaces and 02080 setting up the signals/slots interaction system. Qt3 Designer also 02081 includes Qt Assistant, which will direct you to the extensive Qt 02082 documentation available. 02083 02084 Compile notes for Qt3 applications: 02085 02086 - configure will check for Qt3 libraries on your machine and export 02087 the appropriate directory where Qt3 sources and binaries reside. 02088 02089 - Makefile.in has an option for "make qt" which will build 02090 Qt-dependent executables. 02091 02092 - Qt3 executables should go in depoptions.in just like any other 02093 programs. Make sure to use the "--exeformat qt" option. 02094 02095 - The make process will generate dependency information based on 02096 the source files present. However, some of this dependency 02097 information is only available after the intermediary source files 02098 created by the Qt3 User Interface Compiler (uic) have been 02099 generated. Thus, for the first time you build the program, you 02100 need to do the following (assume you have user interface files 02101 MyForm.ui and MyForm.ui.h): 02102 \verbatim 02103 make src/Qt/ui/MyForm.h 02104 make src/Qt/ui/MyForm.cpp 02105 \endverbatim 02106 After these files are created for the first time, they should not 02107 be removed so that the cdeps dependency generator can refer to 02108 them. However, you should not have to ever edit them since they 02109 will always be created automatically by uic. 02110 02111 - By default, make will keep intermediary source files in the 02112 src/Qt/ui directory. The corresponding object code will be built 02113 into build/obj/Qt/ui. 02114 02115 - IMPORTANT -- when adding a new Qt user interface to the svn 02116 repository, it will be necessary to also include the files that 02117 were created just for the sake for generating dependencies. If 02118 you created an interface called MyForm, all of the following 02119 files will need to be added to svn: 02120 \verbatim 02121 svn add src/Qt/MyForm.ui 02122 svn add src/Qt/MyForm.ui.h 02123 svn add src/Qt/ui/MyForm.h 02124 svn add src/Qt/ui/Myform.cpp 02125 \endverbatim 02126 Do not worry about the object files, those are ignored by svn and 02127 will have no effect. 02128 02129 - Note #1: Although Trolltech recommends using qmake to build Qt 02130 projects, we do not use it because it is difficult to pass on 02131 dependency information to it. 02132 02133 - Note #2: The basic outline of the make process for Qt 02134 applications is available at: 02135 \par 02136 http://doc.trolltech.com/3.2/designer-manual-9.html#3-1 02137 \par 02138 It can also be found in the corresponding section of the Qt 02139 Assistant. See "Creating Makefiles without qmake" under Qt 02140 Designer manual, "Customizing and Integrating Qt Designer." 02141 02142 - Note #3: We run moc (Qt's Meta-Object Compiler) on the fly when 02143 compiling files with .cpp or .Q extensions. Previously, we used 02144 to store the moc_*.cpp files in the repository, but this is no 02145 longer necessary. However, by running moc on the fly, we minimize 02146 dependency bookkeeping and avoid churn in the svn repository, at 02147 the expense of very little compile time (e.g., moc usually takes 02148 <0.5s to run, while compiling the .cpp file itself typically 02149 takes ~10-20s for Qt source code). 02150 02151 As an example you should look at the simple application test-Qt, which 02152 was created almost entirely in Qt Designer and required only about 25 02153 additional lines of code to be written by the programmer. This should 02154 demonstrate both the power and the simplicity of Qt. 02155 02156 02157 <!--############################################################--> 02158 02159 \subsection qt4-notes 4.7. Qt4 code notes 02160 02161 The workflow for Qt4 is significantly different than that of Qt3, 02162 especially as regards the use of the Qt Designer. Have a look here for 02163 porting info: 02164 02165 \par 02166 http://qt.nokia.com/doc/4.6/porting4-designer.html 02167 \par 02168 02169 Here is what you should do to create new Qt4 projects: 02170 02171 - using the Qt4 designer, you create a foo.ui file; add it to the svn 02172 repo. A good place to store this file is in src/Qt4/ but it does not 02173 have to, it could be in some other directory for your project. 02174 02175 - then run 02176 02177 \verbatim 02178 make src/WhereTheUIfileIs/foo.ui.H 02179 \endverbatim 02180 02181 which will pass your .ui file through uic and obtain foo.ui.H; you 02182 should add it to the svn repo. 02183 02184 - you manually edit foo.qt.H and foo.qt.C with the slot and other 02185 implementations for your foo widget; it is understood that in any 02186 .qt.H file there will be a class definition that contains Q_OBJECT, 02187 etc as this file will be pre-processed by moc. There should be no 02188 such thing in .qt.C files, though, as those are not pre-processed 02189 through moc. 02190 02191 - then the Makefile has rules by which we pass foo.qt.H through moc on 02192 the fly, and compile the result along with your foo.qt.C to obtain 02193 foo.qt.o (in objdir). We do the moc processing on the fly because 02194 moc is pretty brittle and pushing moc'ed files into the svn repo 02195 fails if you try to then compile them with even the most slightly 02196 different version of moc. 02197 02198 - finally, you manually edit test-foo.C or app-foo.C and in there you 02199 #include "Qt4/foo.qt.H"; yes you are including the file that has not 02200 been yet processed by moc but that's ok. Add test-foo.C to the svn 02201 repo and to depoptions.in. 02202 02203 - the rest is magic thanks to the rules in Makefile.in. 02204 02205 Have a look at src/Qt4/test-BeoChipQt.C for an example, with the 02206 associated files BeoChipMainForm.qt.C, BeoChipMainForm.qt.H, 02207 BeoChipMainForm.ui, and BeoChipMainForm.ui.H, for an example. 02208 02209 <!--############################################################--> 02210 <!--############################################################--> 02211 <!--############################################################--> 02212 02213 \section executables 5. EXECUTABLES 02214 02215 02216 <ul> 02217 02218 <li> ezvision: This is the main executable. Try to run it with a "--help" 02219 command-line option to see the various supported options. 02220 02221 Typically, you will run: 02222 02223 \verbatim 02224 ezvision -T --io=raster:image.ppm 02225 \endverbatim 02226 02227 to process an image 'image.ppm'. This will take image.ppm as the 02228 input image, and will generate output images using the filename stem 02229 'image.ppm'. To also see the output images in onscreen windows 02230 (assuming you have a connection to an X server), you can add 02231 --out=display 02232 02233 \verbatim 02234 ezvision -T --io=raster:image.ppm --out=display 02235 \endverbatim 02236 02237 To send the output to the display only, without writing any files, 02238 using a --in instead of --io (note that --io=foo is an alias for 02239 --in=foo --out=foo): 02240 02241 \verbatim 02242 ezvision -T --in=raster:image.ppm --out=display 02243 \endverbatim 02244 02245 A target map is a binary map which is black everywhere except that 02246 objects that you wish to detect in the image.ppm appear in the 02247 target map as white blobs. So, typically you will use a target map 02248 if you want the program to report when it has found a given target, 02249 and to automatically stop when it has found all the targets. In this 02250 case, save your target map as a target.pgm portable greymap file, 02251 and run: 02252 02253 \verbatim 02254 ezvision -T --io=raster:image.ppm targets.pgm 02255 \endverbatim 02256 02257 If you want to look at some internals of the model, you can use the 02258 various "show ..." options; for example: 02259 02260 \verbatim 02261 ezvision -T --save-conspic-maps --io=raster:image.ppm 02262 \endverbatim 02263 02264 will show the attentional trajectory (T option), and various 02265 conspicuity maps. 02266 02267 \verbatim 02268 ezvision -Kx \ 02269 --input-frames=0-100@30Hz \ 02270 --output-frames=0-100@30Hz \ 02271 --rescale-output=640x480 \ 02272 --ehc-type=Simple \ 02273 --esc-type=Monkey2 \ 02274 --vc-chans=IC:5.2OFM \ 02275 --nodisplay-additive \ 02276 --foveate-input \ 02277 --io=raster:frame#.ppm 02278 \endverbatim 02279 02280 will process a series of input images named frame000000.ppm through 02281 frame000100.ppm, loading a new frame every 33.333ms (30Hz) of 02282 simulated time (--input-frames option), displaying in an X-window 02283 (-x option) a combination of original, attention trajectory, and 02284 various internal maps (-K option) in a non-additive manner (drawings 02285 are erased at every new frame; --nodisplay-additive), rescaling the 02286 output image to 640x480 (--rescale-output option), using a 02287 SaccadeController of type "Monkey2" to generate eye/head movements 02288 in addition to the covert attention shifts (--esc-type option), using 02289 a foveation filter to foveate each input frame according to current 02290 eye position (--foveate-input option), using a VisualCortex that has 02291 intensity (I), color with weight 5.2 (C:5.2), orientation (O), 02292 flicker (F), motion (M) channels (--vc-chans option; note that your 02293 channels could also be all off-loaded from your machine and running 02294 instead on distant CPUs part of a Beowulf cluster if you added a "B" 02295 letter to the --vc-chans option; use this only if you know what you 02296 are doing, and see SingleChannelBeo.H and friends). 02297 02298 Note that if you want your output to go to movie files instead of 02299 raster file series, you can use "--in=raster:frame#.ppm --out=mpeg" 02300 instead of "--io=raster:frame#.ppm". You can also take the input 02301 from an movie file like this "--in=somefile.mpg --out=mpeg". 02302 02303 Note a few special options that exist in all "proper" executables: 02304 02305 \verbatim 02306 -h, --[no]help [on] 02307 Show help message and option syntax [ShowHelpMessage] 02308 02309 -d, --[no]debug 02310 Use debug mode, which, in particular, will increase the 02311 verbosity of the log messages and printout all model parameter 02312 values just before the model starts. [DebugMode] 02313 02314 --[no]use-fpe [on] 02315 Use floating-point exceptions, which will abort execution if 02316 overflow, underflow, invalid or division by zero are 02317 encountered. [UsingFPE] 02318 02319 -Z, --[no]test-mode 02320 Use test mode, which, in particular, will turn off randomness 02321 (like --nouse-random), reset random numbers to a reproducible 02322 pseudo sequence, and turn off most displays. This is mostly 02323 useful for execution of the test suite, or any situation where 02324 you need deterministic, reproducible behavior. [TestMode] 02325 02326 --load-config-from=<file.pmap> [] 02327 Load configuration from file [LoadConfigFile] 02328 02329 --save-config-to=<file.pmap> [] 02330 Save configuration to file [SaveConfigFile] 02331 \endverbatim 02332 02333 In particular, the last one will allow you so save a snapshot of all 02334 current settings, for later re-loading. So if you have a very long 02335 list of command-line options, you may as well use 02336 "--save-config-to=settings.pmap", so that next time instead of 02337 re-typing that long list you will only have to type 02338 "--load-config-from=settings.pmap". 02339 02340 Note that some new options may pop-up on the fly as you instantiate 02341 run-time plugin components; for example, compare: 02342 02343 \verbatim 02344 ezvision --help 02345 \endverbatim 02346 02347 to 02348 02349 \verbatim 02350 ezvision --ehc-type=Simple --esc-type=Monkey2 --help 02351 \endverbatim 02352 02353 and you will see a bunch of new options that will allow you to tune 02354 the Monkey2 SaccadeController. 02355 02356 For the other options, the best is to ask us or look at the source 02357 code. 02358 02359 <li> test-grab: tests your framegrabber by just grabbing a frame and 02360 displaying it in a window; 02361 02362 <li> pvisionTCP, pvisionTCP-master: parallel saliency computation, 02363 using our direct TCP transfer library, and spreading processing of 02364 each frame across several CPUs (such that one CPU processes color, 02365 another intensity, etc). No flicker/motion processing (each new 02366 frame is processed independently from the previous ones). Because 02367 this is a truly parallel program, both throughput is increased and 02368 latency is decreased; runs at 30fps on our 16-CPU cluster. Typically 02369 you would run pvisionTCP on each of your slave Beowulf nodes, and 02370 pvisionTCP-master on your head node. There are scripts in bin/ to 02371 get this started; 02372 02373 To start it, run "pvisionTCPgo" which will start the slave processes 02374 on the Beowulf compute nodes, then run "pvisionTCPmaster" on your 02375 framegrabber-equipped head node; 02376 02377 <li> pvisionTCP2, pvisionTCP2-master: same as above except that flicker 02378 is detected as well and the program runs at 15fps; 02379 02380 <li> CINNICtest: test executable for the contour integration model; 02381 02382 <li> beograb, beograb-master: parallel frame grabbing; will grab at 30fps 02383 and store grabbed frames in round robin onto the local disk of each 02384 slave node. This way it is actually possible to grab & save at 02385 30fps, while typically this is too much data for a single CPU to be 02386 able to save on its disk in real time (but here each CPU saves only 02387 one in 16 frames onto its disk); 02388 02389 <li> test-hmax, test-psycho: early versions of new test programs for 02390 object recognition and the generation of psychophysics displays. 02391 02392 </ul> 02393 02394 02395 <!--############################################################--> 02396 <!--############################################################--> 02397 <!--############################################################--> 02398 02399 \section video-clips 6. PROCESSING VIDEO CLIPS 02400 02401 02402 Video clips can be processed using ezvision just like series of image 02403 frames. Just pass --in=path/to/mymovie.mpg to use a movie for input; 02404 likewise you can save your output to movies by using 02405 --out=mpeg:path/to/outdir/. 02406 02407 02408 <!--############################################################--> 02409 02410 \subsection grabbing-video 6.1. Grabbing video 02411 02412 02413 The easiest way to grab video is to use some Windoze machine equipped 02414 with a framegrabber. Typically, we try to grab at 30 frames/s in 02415 640x480 resolution, RGB555 uncompressed mode. You may use other modes 02416 as well, like YV12, as supported by your framegrabber. As you grab, 02417 make sure that you don't have any dropped frames and that you grab 02418 uncompressed data. Indeed, compression (e.g., MPEG, DivX, etc.) will 02419 introduce artifacts, and that will have to be taken into account later 02420 when you attempt to process your data and interpret the results; that 02421 is, are the results you see due to the genuine contents of the video 02422 clip, or to the artifacts created by the compression process? That can 02423 be very important if your goal is, for example, to use our model to 02424 determine priority regions in a video clip and use those regions in a 02425 region-based video compression algorithm. If the data you use had 02426 already been compressed before, that will taint your results on how 02427 well your new compression algorithm is doing. 02428 02429 So, RGB555 640x480 30fps uncompressed AVI is usually the most 02430 desirable setting. If you have options to do deinterlacing, you may or 02431 may not want to use them (just make a note of what you did and be 02432 consistent over your collection of clips). 02433 02434 02435 <!--############################################################--> 02436 02437 \subsection converting-tbz 6.2. Converting video to .tbz files 02438 02439 02440 The easiest way of doing batch processing on video data is to first 02441 convert (in a lossless manner) your movie file into a series of 02442 individual PPM frames, and then to create a tar archive with all the 02443 frames in it, and to compress this archive using the bzip2 02444 program. Once you have a .tbz file in this format, we have a number of 02445 scripts that will be able to run the attention model on those 02446 files. You must create your .tbz exactly as described below for these 02447 scripts to work. 02448 02449 To convert from a movie to .tbz, use the movie2tbz.pl script in 02450 saliency/bin/. The script accepts any input video format that 02451 'mplayer' can deal with: 02452 02453 \verbatim 02454 movie2tbz.pl movie1.avi movie2.mpg movie3.mov 02455 \endverbatim 02456 02457 will convert all three movies to .tbz format, yielding movie1.tbz, 02458 movie2.tbz and movie3.tbz. There are additional options that 02459 movie2tbz.pl accepts; have a look at the script itself to see a 02460 description of the usage, in the comment block at the top of the 02461 script. 02462 02463 If you want to create your .tbz files manually, you can certainly do 02464 that too. The .tbz files should contain a series of frames with the 02465 file names: 02466 02467 \verbatim 02468 frame000000.ppm 02469 frame000001.ppm 02470 ... 02471 \endverbatim 02472 02473 be sure to have a six-digit number, to start at frame zero, and to 02474 have no gap in the number sequence. Follow this naming convention, as 02475 it is required by the scripts that process .tbz files. Then tar and 02476 compress all the frames, such that your tar file contains no 02477 directory/subdirectory information (i.e., when it is untarred, the 02478 extracted frames should go into the current directory). For example: 02479 02480 \verbatim 02481 tar cvf - frame*.ppm | bzip2 -9 > mymovie.tbz 02482 \endverbatim 02483 02484 or, if you have so many frames that your shell complains that 02485 "frame*.ppm" has too many files, you can also use: 02486 02487 \verbatim 02488 tar cvf - . | bzip2 -9 > mymovie.tbz 02489 \endverbatim 02490 02491 in which case your archive will contain files ./frame000000.ppm, 02492 ./frame000001.ppm, etc and the leading ./ is okay (note that .tbz 02493 files created with this manner will have an additional entry for just 02494 "./", so be sure that you know that if you are trying to count the 02495 number of frames in a movie by listing the files the .tbz archive 02496 contains). 02497 02498 02499 <!--############################################################--> 02500 02501 \subsection processing-tbz 6.3. Processing a .tbz file 02502 02503 02504 To process a .tbz file through ezvision, use the script 02505 process_movie.pl in saliency/bin/; typically: 02506 02507 \verbatim 02508 process_movie.pl /path/to/movie.tbz 02509 \endverbatim 02510 02511 will unpack the .tbz, process the frames through ezvision, and 02512 compress the results into a .mpg file. There are many options that 02513 process_movie.pl accepts; have a look at the script itself to see a 02514 description of the usage, in the comment block at the top of the 02515 script. In particular, you can decide on the output format (mpeg, 02516 quicktime, divx, tbz, etc) and pass additional options to ezvision 02517 too. There are also specialized versions of process_movie.pl that are 02518 just shorthands which call process_movie.pl with a bunch of preset 02519 options; for example, process_movie_foveated.sh, 02520 process_movie_headanim.sh, etc 02521 02522 For process_movie.pl to work, you need to have ezvision and several 02523 other programs installed and in your path (mpeg_encode, mencoder, 02524 etc). Have a look at the script for details. 02525 02526 02527 <!--############################################################--> 02528 <!--############################################################--> 02529 <!--############################################################--> 02530 02531 \section parallel-code 7. RUNNING PARALLEL CODE 02532 02533 02534 Before you run parallel code (such as pvisionTCP), make sure that you 02535 master the Beowulf administration tools, such as 'brsh,' so that you 02536 cleanup after yourself when you are done with the beowulf. For 02537 example, if you have started a bunch of pvisionTCP processes, be sure 02538 to execute: 02539 02540 \verbatim 02541 brsh killall -9 pvisionTCP 02542 \endverbatim 02543 02544 when you are done. For brsh to work, you need to have a .rhosts file 02545 with: 02546 02547 \verbatim 02548 iLab1.usc.edu itti 02549 iLab2.usc.edu itti 02550 iLab3.usc.edu itti 02551 iLab4.usc.edu itti 02552 iLab5.usc.edu itti 02553 iLab6.usc.edu itti 02554 iLab7.usc.edu itti 02555 bsl10.usc.edu itti 02556 bsl11.usc.edu itti 02557 n01.beo.usc.edu itti 02558 n02.beo.usc.edu itti 02559 n03.beo.usc.edu itti 02560 n04.beo.usc.edu itti 02561 n05.beo.usc.edu itti 02562 n06.beo.usc.edu itti 02563 n07.beo.usc.edu itti 02564 n08.beo.usc.edu itti 02565 n09.beo.usc.edu itti 02566 n10.beo.usc.edu itti 02567 n11.beo.usc.edu itti 02568 n12.beo.usc.edu itti 02569 n13.beo.usc.edu itti 02570 n14.beo.usc.edu itti 02571 n15.beo.usc.edu itti 02572 n16.beo.usc.edu itti 02573 \endverbatim 02574 02575 in your home directory, except that you replace "itti" by your login 02576 name and make sure that your own computer's name also is in the list. 02577 Then, brsh will execute the command passed as argument on every node 02578 in the beowulf; for example: 02579 02580 \verbatim 02581 brsh ps aux # shows you all processes 02582 brsh df -h # shows you all disk space 02583 ... 02584 \endverbatim 02585 02586 Also check out the real time CPU and network load graphs at 02587 http://iLab.usc.edu/beo/ 02588 02589 02590 <!--############################################################--> 02591 <!--############################################################--> 02592 <!--############################################################--> 02593 02594 \section documentation 8. DOCUMENTATION 02595 02596 02597 Documentation is automatically extracted from the source code and 02598 published on the web at: 02599 02600 http://iLab.usc.edu/sdoc/html/ 02601 02602 It is also available in PDF or RTF format. 02603 02604 Please document your code using the doxygen syntax (see 02605 http://www.doxygen.org/). Doxygen will extract special comments from 02606 your code and organize them along with the class names and methods 02607 into some nice web pages. Regular comments will not be used by 02608 doxygen, so feel free to use them a lot inside your code. So the idea 02609 is that all regular comments are only for people editing the code, and 02610 a few special comments are provided for people just wanting to use 02611 your classes but not look at the code in detail. So the special 02612 comments explain what the class does and what each method does. 02613 Typically this means: 02614 02615 - towards the top of your class definition in your .H, have a block 02616 like: 02617 \verbatim 02618 //! Short summary in one line 02619 /*! Longer description of what the class does, that 02620 can take several lines 02621 */ 02622 \endverbatim 02623 If you have only a short summary, only write the first one-line 02624 comment (using <code>//!</code>); if you have a long description 02625 (using <code>/*! ... * /</code>), then make sure you still include 02626 the short summary too in that case. Any deviation from this scheme 02627 will produce bogus documentation; 02628 02629 - before each method in your .H, either a single-line comment or if 02630 you have more to say, both a single-line comment and a multiline 02631 comment as above; 02632 02633 - do not repeat these comments in your .C; what the method does and 02634 what parameters it takes is documented in the .H; however, put 02635 extensive regular comments inside your functions (without using the 02636 doxygen markers) to explain people editing the code what you are 02637 doing; 02638 02639 - the first line of both your .H and you .C should be a single-line, 02640 regular (non-doxygen) comment that states the file name and a very 02641 short description of what the class does (useful for printing, so 02642 that we know which file corresponds to a given printout; also useful 02643 for the roadmap below); 02644 02645 - see V4Lgrabber.H and V4Lgrabber.C for a good example to use when 02646 writing a new class. 02647 02648 02649 <!--############################################################--> 02650 <!--############################################################--> 02651 <!--############################################################--> 02652 02653 \section writing-code 9. WRITING CODE 02654 02655 02656 Please follow these guidelines when writing new code: 02657 02658 - no 'printf,' 'cout,' or 'cerr' allowed. Instead, use the functions 02659 provided by log.H to display various messages; 02660 02661 - please keep line length to less than 80 characters, so that the code 02662 will print properly and we won't get very annoyed because we have to 02663 resize our editor windows; 02664 02665 - try to avoid 'malloc' and 'free,' unless you have to use it (e.g., 02666 will do a 'realloc' later). Instead use the C++ functions 'new' and 02667 'delete'; 02668 02669 - make sure that each time you allocate memory with 'new' you also 02670 free it with 'delete.' So, if possible do not allocate memory for 02671 return values of your functions, leaving it to the user of the 02672 function to free the memory when they are done with the return value; 02673 rather ask the user to pass a memory buffer that has been already 02674 allocated as a parameter to your function. Try to use SharedPtr's to 02675 handle your dynamically allocated objects (see SharedPtr.H, and try a 02676 "grep SharedPtr *.C" for examples of how to use it); 02677 02678 - try to avoid passing pointers as function parameters; rather use the 02679 C++ passing of arguments by reference (using an &; for example use 02680 'function(float& retval)' rather than 'function(float *retval)'; this 02681 way you will not have to deal with pointers inside your function and 02682 your code will be easier to read and cleaner); 02683 02684 - when writing a new class, follow the general architecture that has 02685 been used in other classes: make a .H file, a .C file, enclose your 02686 definitions in the .H file by \#ifndef MY_CLASS_DEFINED, try to 02687 #include as few files as possible in your .H (just what is needed for 02688 class definition) and include the rest in your .C (what is needed for 02689 actual implementation of the class), do not repeat comments from your 02690 .H in your .C, separate your methods in your .C by // ###.. (70 times 02691 #), and so on. See V4Lgrabber.H and V4Lgrabber.C for a good example to 02692 use when writing a new class (and see previous section regarding 02693 comments). When creating a new class, start from a copy of the 02694 templates provided in NewClass.H and NewClass.C; 02695 02696 - make sure that your class has a constructor with no argument; this 02697 is useful if people want to have your class as a member inside their 02698 class, or to create arrays of objects from your class. Typically, I 02699 find it useful to have a boolean variable 'initialized' inside my 02700 classes that let me know whether proper initialization was done; see 02701 for example Image.H/.C. If you have several possible constructors 02702 (e.g., with various numbers of parameters, I find it useful to only 02703 write the initialization code once as an 'init' method, and then have 02704 the various constructors call this method); similarly a 'freeMem' 02705 method is useful if you want to reinitialize your object (and then 02706 your destructor just calls freeMem()); 02707 02708 - do not declare all your variables at the top of your function like 02709 you must do in C; rather declare each variable the first time it is 02710 used, as is usual in C++. Similarly, unless you want to use a loop 02711 variable after the loop is finished, declare your loop variable inside 02712 your loop statement; declaring variables so that they have as short a 02713 lifetime (because they run out of scope) as possible will help you 02714 avoid lots of bugs! 02715 \code 02716 // instead of: 02717 02718 void MyClass::myFunction() // WRONG! 02719 { 02720 int x, y, z, i; 02721 ... 02722 for (i = 0; i < 10; i ++) { 02723 x = i * 2; 02724 do_stuff(x); 02725 } 02726 ... // never use 'i' again... 02727 } 02728 02729 // write: 02730 02731 void MyClass::myFunction() 02732 { 02733 ... 02734 for (int i = 0; i < 10; ++i) { 02735 const int x = i * 2; 02736 do_stuff(x); 02737 } 02738 02739 // 'i' and 'x' run out of scope here so the compiler will 02740 // complain if you inadvertently use them past this point. 02741 ... 02742 } 02743 \endcode 02744 02745 - use capitalized names for classes and uncapitalized names for 02746 methods; for example: 02747 \code 02748 class MyCoolClass; // note uppercase M at start 02749 void MyCoolClass::myCoolMethod(); // note lowercase m at start 02750 \endcode 02751 <b>Use your class name as your file name (MyCoolClass.H and 02752 MyCoolClass.C); using different names for class and file DOES NOT 02753 MAKE SENSE (e.g., ssc.H and class SSC are getting on my nerves! it 02754 should be Ssc.H and class Ssc)</b> 02755 02756 - in your classes, please put public methods first (under a public: 02757 heading), then your private methods and data (under a private: 02758 heading). Indeed, users of your class do not care about the private 02759 members, so why would you want to bore them from the start by putting 02760 your private section first? see V4Lgrabber.H/.C; 02761 02762 - if possible, use emacs as editor; it will properly highlight and 02763 indent (using <TAB>) your code automatically for you! 02764 02765 - use only the five following base datatypes if you need a guaranteed 02766 data size: 02767 02768 \code 02769 byte // for a 8-bit unsigned integer number 02770 int16 // for a 16-bit signed integer number 02771 int32 // for a 32-bit signed integer number 02772 float // for a 32-bit floating point number 02773 double // for a 64-bit floating point number 02774 \endcode 02775 02776 If you could tolerate that your variable be either a 32 or 64-bit int, 02777 then use int. 02778 02779 - use 'const' whenever possible in your function declarations, as this 02780 makes the function declaration much easier to understand and it also 02781 avoids lots of bugs; so every read-only parameter should be declared 02782 const; every read-write parameter should be passed by reference (&) 02783 and not declared const; every method which does not modify the data 02784 members of the class should be declared const; for example: 02785 02786 \code 02787 void MyClass::getInfo(const int32 zz, float& result1, 02788 byte& result2) const; 02789 \endcode 02790 02791 is a method with 1 read-only parameter, 2 read-write parameters, and 02792 which does not modify the internal data members of MyClass; 02793 02794 - try to have as few hardcoded numbers as possible; each time you need 02795 a hardcoded number that someone may want to modify later, use a 02796 #define statement in your .H to give a macro name to that number, then 02797 use the macro name in your code; for example, instead of: 02798 02799 \code 02800 // in myClass.C: 02801 Image<float> im(100, 100); 02802 \endcode 02803 02804 write: 02805 02806 \code 02807 // in myClass.H: 02808 // image size: 02809 const int IMWIDTH = 100; 02810 const int IMHEIGHT = 100; 02811 02812 // in myClass.C: 02813 Image<float> im(IMWIDTH, IMHEIGHT); 02814 \endcode 02815 02816 and try to avoid hardcoded numbers in any case! Use ModelParam<T> 02817 parameters instead (see ModelParam.H). Of course do not abuse of that 02818 rule: if you implement some math functions you will have lots of 02819 numbers; so use your judgment to decide when to #define a constant; 02820 typically you will do it if you use it several times in several 02821 different methods, but not if you just use it once in one method 02822 (unless you consider that it is a tunable parameter of your code). 02823 02824 - if you want to check the validity of parameters in a function, use 02825 the ASSERT() macro, which we can either #define as calling assert() 02826 (see 'man assert') while in development mode, or as doing nothing so 02827 that we save some computation time when the code is stable; for 02828 example: 02829 \code 02830 void Image::getValue(const int32 x, const int32 y) 02831 { 02832 ASSERT(x >= 0 && x < w); // will quit if x coordinate outside image 02833 ASSERT(y >= 0 && y < h); // will quit if y coordinate outside image 02834 ... 02835 } 02836 \endcode 02837 02838 - please write readable code! Most cryptic C++ constructs will not 02839 buy you anything in execution time (on the contrary), which is our 02840 main priority. So use lots of parentheses, even if you know that some 02841 of them are not needed, to make your code easier to read. The compiler 02842 will remove all extra parentheses before compiling. Also use lots of 02843 spaces, as they make fast reading of the code much easier. For 02844 example: 02845 \verbatim 02846 NO! YES 02847 ------------------------------------------------------------------------------ 02848 for(int i=0;i<10;i++) ... for (int i = 0; i < 10; ++i) ... 02849 02850 myfunction(a,b,10,z); myFunction(a, b, 10, z); 02851 02852 if(x=func()==1) ... x = func(); // comment 02853 if (x == 1) ... 02854 02855 for(z=0,x=0;x<imgx;x++,buf++) z = 0; // comment 02856 for (int x = 0; x < imgx; ++x) { 02857 ... 02858 ++buf; // comment 02859 } 02860 02861 x=x>y?x:y; if (x < y) x = y; // faster 02862 02863 printf("bug %d\n", x); LERROR("bug %d", x); 02864 \endverbatim 02865 see Image.H and Image.C as a good example of our writing style and 02866 class organization rules. 02867 02868 02869 <!--############################################################--> 02870 <!--############################################################--> 02871 <!--############################################################--> 02872 02873 \section roadmap 10. ROADMAP 02874 02875 02876 Have a look at the papers and at section 1 for general information and 02877 a brief description of what the various classes do. Then check out the 02878 online documentation. Then look at the code itself. 02879 02880 Use the online documentation (see above). It is clickable, so that 02881 each time you encounter an object type that you don't know, you can 02882 just click on it to instantly discover what it is. 02883 02884 A good order in which to get acquainted with the various classes is as 02885 follows (look at both the .H and .C) -- NOTE: the list below may be 02886 obsolete; the online documentation is the only up-to-date reference 02887 (updated nightly): 02888 02889 02890 <!--############################################################--> 02891 02892 \subsection visual-attention-model 10.1. Visual attention model 02893 02894 02895 - log.H -- Error message facility and interface to syslog 02896 - saliency.H -- type definitions and macros 02897 - Pixels.H -- basic pixel types 02898 - Point2D.H -- a basic 2D point class 02899 - Rectangle.H -- a basic rectangle class 02900 - Image.H -- an image template class with many image processing functions 02901 - Raster.H -- writes a raster to disk / displays it 02902 - ImageSet.H -- a template image pyramid class 02903 02904 - SaliencyMap.H -- class declarations for saliency map 02905 - WinnerTakeAll.H -- header file for winner-take-all network 02906 - VisualCortex.H -- the early visual processing stages 02907 - Brain.H -- the whole brain 02908 - SaccadeController.H -- optional eye/head movement generation 02909 - ShapeEstimator.H -- estimate the size/shape of attended objects 02910 - SimulationViewer.H -- do various drawings to display results 02911 - StdBrain.H -- a Brain with a bunch of standard modules pre-implemented in it 02912 02913 - ezvision.C -- main executable 02914 - openvision.C -- similar to ezvision but uses filters defined in a text file 02915 - streamvision.C -- similar to ezvision but reads/writes movie streams 02916 - vision.C -- this is now obsolete; use ezvision instead 02917 02918 02919 <!--############################################################--> 02920 02921 \subsection contour-integration-model 10.2. Contour integration model 02922 02923 02924 - readConfig.H -- deal with configuration files 02925 - contourNeuron.H -- CINNIC classes 02926 - CINNICtest.H -- test binary for CINNIC neuron 02927 02928 02929 <!--############################################################--> 02930 02931 \subsection frame-grabbing 10.3. Grabbing & displaying images 02932 02933 02934 - FrameGrabber.H -- abstraction of a frame grabber 02935 - V4Lgrabber.H -- definition and access functions for video4linux grabber 02936 - IEEE1394grabber.H -- definition and access functions for FireWire grabber 02937 - XWindow.H -- class definition for a simple window 02938 - XWinManaged.H -- an X window with event management 02939 - Timer.H -- a simple class for precise time measurements 02940 02941 02942 <!--############################################################--> 02943 02944 \subsection parallel-computing 10.4. Parallel computing 02945 02946 02947 - TCPmessage.H -- direct message passing over TCP connections 02948 - Beowulf.H -- simple interfacing to a Beowulf cluster 02949 - pvisionTCP.H -- Definitions for pvisionTCP & pvisionTCP-master 02950 02951 02952 <!--############################################################--> 02953 02954 \subsection low-level-parallel 10.5. Low-level details of parallel computing (should not be needed) 02955 02956 02957 - TCPdefs.H -- common definitions for the various TCPxxx classes 02958 - SockServ.H -- a simple multi-client socket server 02959 - TCPcliServ.H -- a client/server to receive/send TCPmessage 02960 - TCPcommunicator.H -- a class to handle multiple TCPmessage communications 02961 02962 02963 <!--############################################################--> 02964 02965 \subsection audio 10.6. Audio 02966 02967 02968 - AudioGrabber.H -- grab audio samples from /dev/dsp 02969 - AudioMixer.H -- control audio mixer and select audio grab source 02970 02971 02972 <!--############################################################--> 02973 02974 \subsection hardware-drives 10.7. Misc hardware drivers 02975 02976 02977 - ssc.H -- driver for a serial R/C servo controller 02978 - carcontrol.H -- control an R/C car like the one of the Beobots 02979 - serial.H -- serial port driver 02980 - GPS.H -- driver for Gramin/NMEA global positioning system unit 02981 - Gyro.H -- interface to a GyroMouse 02982 - lcd.H -- interface to a small alphanumeric serial LCD display 02983 - SpeedSensor -- driver for a mouse-based speed sensor 02984 - VCC4.H -- driver for a VCC4 pan/tilt/zoom camera 02985 02986 02987 <!--############################################################--> 02988 02989 \subsection psychophysics-displays 10.8. Psychophysics displays 02990 02991 02992 - PsychoDisplay.H -- easily create psychophysics displays using SDL 02993 02994 - psycho-movie.C -- show movies and record eye movements 02995 - psycho-still.C -- show still images and record eye movements 02996 - psycho-search.C -- search for one target 02997 - psycho-dsearch.C -- search for two targets 02998 - psycho-headmove.C -- record head movements 02999 - psycho-only.C -- pure psychophysics display of still images (no eye mvts) 03000 03001 */