FilterBankGenerator.ccGo 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
00010
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
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
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
|