00001 /*!@file CUDA/CudaPyramidCache.H */ 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/CUDA/CudaPyramidCache.H $ 00035 // $Id: CudaPyramidCache.H 12962 2010-03-06 02:13:53Z irock $ 00036 // 00037 00038 #ifndef CUDA_CUDAPYRAMIDCACHE_H_DEFINED 00039 #define CUDA_CUDAPYRAMIDCACHE_H_DEFINED 00040 00041 #include "CUDA/CudaImage.H" 00042 #include "CUDA/CudaImageSet.H" 00043 #include "Image/Pixels.H" 00044 00045 #include <pthread.h> 00046 00047 namespace rutz { class mutex_lock_class; } 00048 00049 template <class T> 00050 class CudaPyramidCache 00051 { 00052 public: 00053 CudaPyramidCache(); 00054 00055 struct Item 00056 { 00057 Item(); 00058 ~Item(); 00059 00060 /// Acquire an exclusive lock on the mutex so that we can set a new pyramid for the given image 00061 /** If we already have a pyramid for the given image, then the 00062 return value here will be false, indicating that there is no 00063 need to set the pyramid again. 00064 00065 If we do need a new pyramid for the given image, then the 00066 return value will be true and the Lock will be filled in with 00067 lock information that must be passed back to endSet(). 00068 00069 Typical usage would look like this: 00070 00071 \code 00072 rutz::mutex_lock_class lock; 00073 if (cache->gaussian5.beginSet(img, &lock)) 00074 { 00075 ImageSet<float> pyr = doSomethingToComputePyramid(img); 00076 cache->gaussian5.endSet(img, pyr, &lock); 00077 } 00078 \endcode 00079 */ 00080 bool beginSet(const CudaImage<T>& img, rutz::mutex_lock_class* l); 00081 00082 /// Install a new image/pyramid pair using a lock previous acquired from beginSet() 00083 void endSet(const CudaImage<T>& img, const CudaImageSet<T>& pyr, 00084 rutz::mutex_lock_class* l); 00085 00086 /// Returns a pointer to the cached pyramid for img, or null if there is no such cached pyramid 00087 const CudaImageSet<T>* get(const CudaImage<T>& img) const; 00088 00089 private: 00090 Item(const Item&); 00091 Item& operator=(const Item&); 00092 00093 mutable pthread_mutex_t itsLock; 00094 CudaImage<T> itsImg; 00095 CudaImageSet<T> itsPyr; 00096 }; 00097 00098 Item gaussian5; 00099 Item laplacian9; 00100 00101 private: 00102 CudaPyramidCache(const CudaPyramidCache&); 00103 CudaPyramidCache& operator=(const CudaPyramidCache&); 00104 }; 00105 00106 // ###################################################################### 00107 /* So things look consistent in everyone's emacs... */ 00108 /* Local Variables: */ 00109 /* mode: c++ */ 00110 /* indent-tabs-mode: nil */ 00111 /* End: */ 00112 00113 #endif // CUDA_CUDAPYRAMIDCACHE_H_DEFINED