00001 /*!@file Channels/InputHandler.H Hooks for tweaking individual pieces of channel functionality */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005 // 00005 // by the University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: Rob Peters <rjpeters at usc dot edu> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Channels/InputHandler.H $ 00035 // $Id: InputHandler.H 8195 2007-03-30 04:34:07Z rjpeters $ 00036 // 00037 00038 #ifndef CHANNELS_INPUTHANDLER_H_DEFINED 00039 #define CHANNELS_INPUTHANDLER_H_DEFINED 00040 00041 #include "Util/Types.H" 00042 00043 class SimTime; 00044 class SingleChannel; 00045 00046 template <class T> class Image; 00047 template <class T> class PyramidCache; 00048 namespace rutz { template <class T> class shared_ptr; } 00049 00050 //! Auxiliary class that can override parts of SingleChannel's functionality 00051 class InputHandler 00052 { 00053 public: 00054 virtual ~InputHandler(); 00055 00056 /// Like h->makeClone(), but works with null pointers, too. 00057 /** The point of this is to allow us to pass one InputHandler to a 00058 ComplexChannel, and then let that ComplexChannel make multiple 00059 clones of the handler to pass to each of its subchannels. This 00060 means that there may be many clones of a given InputHandler, but 00061 only some of them (i.e., the ones sitting in SingleChannel 00062 objects) will ever see any input; the other ones (sitting in 00063 ComplexChannel objects) won't be used except to instantiate 00064 additional clones when needed. In terms of implementation, this 00065 means that InputHandler classes shouldn't do anything "heavy" 00066 until they actually receive some input. Along those lines, the 00067 prototypical InputHandler subclass is the beowulf 00068 BeoInputHandler, which doesn't do a Beowulf::requestNode() in 00069 its constructor, but rather waits until it gets a handleInput() 00070 call. That way it is safe to have more BeoInputHandler objects 00071 than we have Beowulf nodes, as long as only a subset of the 00072 objects actually request Beowulf nodes. */ 00073 static rutz::shared_ptr<InputHandler> clone(rutz::shared_ptr<InputHandler> h); 00074 00075 virtual void handleInput(SingleChannel& chan, 00076 const Image<float>& bwimg, 00077 const SimTime& t, 00078 const Image<byte>& clipMask, 00079 const rutz::shared_ptr<PyramidCache<float> >& cache) = 0; 00080 00081 virtual void waitForOutput(SingleChannel& chan) = 0; 00082 00083 private: 00084 /// Make a clone of this InputHandler object. 00085 virtual rutz::shared_ptr<InputHandler> makeClone() const = 0; 00086 }; 00087 00088 // ###################################################################### 00089 /* So things look consistent in everyone's emacs... */ 00090 /* Local Variables: */ 00091 /* mode: c++ */ 00092 /* indent-tabs-mode: nil */ 00093 /* End: */ 00094 00095 #endif // CHANNELS_INPUTHANDLER_H_DEFINED