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

Tekkotsu v2.2.1
Generated Tue Nov 23 16:36:38 2004 by Doxygen 1.3.9.1