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
00008
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
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
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166