Homepage Demos Overview Downloads Tutorials Reference
Credits

FilterBankGenerator.cc

Go to the documentation of this file.
00001 #include "FilterBankGenerator.h"
00002 #include "Events/FilterBankEvent.h"
00003 #include "Events/EventRouter.h"
00004 
00005 unsigned char *
00006 FilterBankGenerator::getImage(unsigned int layer, unsigned int channel) const {
00007   //for(int i=0;i<1000;i++)
00008   //std::cout << i << " FBG::getImage(" << layer<<'/'<<numLayers  << ',' << channel<<'/'<<numChannels << ");" << std::endl;
00009   if(!imageValids[layer][channel]) {
00010     if(images[layer][channel]==NULL)
00011       images[layer][channel]=createImageCache(layer,channel);
00012     calcImage(layer,channel);
00013   }
00014   return images[layer][channel];
00015 }
00016 
00017 void 
00018 FilterBankGenerator::freeCaches() {
00019   invalidateCaches();
00020   for(unsigned int i=0; i<numLayers; i++)
00021     for(unsigned int j=0; j<numChannels; j++) {
00022       delete [] images[i][j];
00023       images[i][j]=NULL;
00024     }
00025 }
00026 
00027 void
00028 FilterBankGenerator::invalidateCaches() {
00029   for(unsigned int i=0; i<numLayers; i++)
00030     for(unsigned int j=0; j<numChannels; j++)
00031       imageValids[i][j]=false;
00032 }
00033 
00034 void
00035 FilterBankGenerator::processEvent(const EventBase & event) {
00036   const FilterBankEvent& fbkevent=dynamic_cast<const FilterBankEvent& >(event);
00037   src=fbkevent.getSource();
00038   frameNumber=src->getFrameNumber();
00039   setNumImages(src->getNumLayers(),src->getNumChannels());
00040   if(numLayers>0 && (src->getWidth(numLayers-1)!=getWidth(numLayers-1) || src->getHeight(numLayers-1)!=getHeight(numLayers-1))) {
00041     ASSERT(widths[numLayers-1]==0,"Strange, the image dim changed after initial setting" << widths[numLayers-1] << ' ' << heights[numLayers-1]);
00042     setDimensions();
00043   }
00044   invalidateCaches();
00045   framesProcessed++;
00046 }
00047 
00048 unsigned int FilterBankGenerator::getBinSize() const {
00049   unsigned int used=0;
00050   used+=creatorSize("FbkImage");
00051   used+=sizeof(widths[selectedSaveLayer]);
00052   used+=sizeof(heights[selectedSaveLayer]);
00053   used+=sizeof(selectedSaveLayer);
00054   used+=sizeof(selectedSaveChannel);
00055   return used;
00056 }
00057 
00058 /*! The LoadBuffer() functions of the included subclasses aren't tested, so don't assume they'll work without a little debugging... */
00059 unsigned int FilterBankGenerator::LoadBuffer(const char buf[], unsigned int len) {
00060   unsigned int origlen=len;
00061   unsigned int used=0;
00062   if(0==(used=checkCreator("FbkImage",buf,len,true))) return 0;
00063   len-=used; buf+=used;
00064   if(0==(used=decode(widths[selectedSaveLayer],buf,len))) return 0;
00065   len-=used; buf+=used;
00066   if(0==(used=decode(heights[selectedSaveLayer],buf,len))) return 0;
00067   len-=used; buf+=used;
00068   if(0==(used=decode(selectedSaveLayer,buf,len))) return 0;
00069   len-=used; buf+=used;
00070   if(0==(used=decode(selectedSaveChannel,buf,len))) return 0;
00071   len-=used; buf+=used;
00072   return origlen-len; 
00073 }
00074 
00075 unsigned int FilterBankGenerator::SaveBuffer(char buf[], unsigned int len) const {
00076   unsigned int origlen=len;
00077   unsigned int used=0;
00078   if(0==(used=saveCreator("FbkImage",buf,len))) return 0;
00079   len-=used; buf+=used;
00080   if(0==(used=encode(widths[selectedSaveLayer],buf,len))) return 0;
00081   len-=used; buf+=used;
00082   if(0==(used=encode(heights[selectedSaveLayer],buf,len))) return 0;
00083   len-=used; buf+=used;
00084   if(0==(used=encode(selectedSaveLayer,buf,len))) return 0;
00085   len-=used; buf+=used;
00086   if(0==(used=encode(selectedSaveChannel,buf,len))) return 0;
00087   len-=used; buf+=used;
00088   return origlen-len;
00089 }
00090 
00091 void
00092 FilterBankGenerator::setNumImages(unsigned int nLayers, unsigned int nChannels) {
00093   if(nLayers==numLayers && nChannels==numChannels)
00094     return;
00095   freeCaches();
00096   destruct();
00097   numLayers=nLayers;
00098   numChannels=nChannels;
00099   widths=new unsigned int[numLayers];
00100   heights=new unsigned int[numLayers];
00101   skips=new unsigned int[numLayers];
00102   strides=new unsigned int[numLayers];
00103   increments=new unsigned int[numLayers];
00104   for(unsigned int res=0; res<numLayers; res++) {
00105     widths[res]=heights[res]=skips[res]=strides[res]=0;
00106     increments[res]=1;
00107   }
00108   images=new unsigned char**[numLayers];
00109   imageValids=new bool*[numLayers];
00110   for(unsigned int i=0; i<numLayers; i++) {
00111     widths[i]=heights[i]=0;
00112     images[i]=new unsigned char*[numChannels];
00113     imageValids[i]=new bool[numChannels];
00114     for(unsigned int j=0; j<numChannels; j++) {
00115       images[i][j]=NULL;
00116       imageValids[i][j]=false;
00117     }
00118   }
00119 }
00120 
00121 void
00122 FilterBankGenerator::setDimensions() {
00123   if(src==NULL)
00124     return;
00125   for(unsigned int i=0; i<numLayers; i++) {
00126     widths[i]=src->getWidth(i);
00127     heights[i]=src->getHeight(i);
00128   }
00129 }
00130 
00131 void
00132 FilterBankGenerator::destruct() {
00133   delete [] widths;
00134   widths=NULL;
00135   delete [] heights;
00136   heights=NULL;
00137   delete [] skips;
00138   skips=NULL;
00139   delete [] strides;
00140   strides=NULL;
00141   delete [] increments;
00142   increments=NULL;
00143   for(unsigned int i=0; i<numLayers; i++) {
00144     delete [] images[i];
00145     delete [] imageValids[i];
00146   }
00147   delete [] images;
00148   images=NULL;
00149   delete [] imageValids;
00150   imageValids=NULL;
00151   numLayers=numChannels=0;
00152 }
00153 
00154 
00155 
00156 /*! @file
00157  * @brief Implements abstract base class for generators of FilterBankEvent's
00158  * @author ejt (Creator)
00159  *
00160  * $Author: ejt $
00161  * $Name: tekkotsu-2_2 $
00162  * $Revision: 1.6 $
00163  * $State: Exp $
00164  * $Date: 2004/02/18 21:13:32 $
00165  */
00166 

Tekkotsu v2.2
Generated Tue Oct 19 14:19:14 2004 by Doxygen 1.3.9.1