00001 #include "RLEGenerator.h"
00002 #include "Events/EventRouter.h"
00003 #include "Events/SegmentedColorFilterBankEvent.h"
00004 #include "Wireless/Wireless.h"
00005 #include "Shared/WorldState.h"
00006
00007 #include "Shared/debuget.h"
00008
00009 RLEGenerator::RLEGenerator(EventBase::EventGeneratorID_t gid, unsigned int sid, unsigned int mysid)
00010 : FilterBankGenerator("RLEGenerator",gid,sid,EventBase::visRLEEGID,mysid), numRuns(NULL), maxRuns(NULL)
00011 { }
00012
00013 void
00014 RLEGenerator::processEvent(const EventBase& event) {
00015 FilterBankGenerator::processEvent(event);
00016 if(const SegmentedColorFilterBankEvent * segsrc=dynamic_cast<const SegmentedColorFilterBankEvent *>(&event))
00017 erouter->postEvent(new SegmentedColorFilterBankEvent(this,getGeneratorID(),getSourceID(),*segsrc));
00018 else
00019 erouter->postEvent(new FilterBankEvent(this,getGeneratorID(),getSourceID()));
00020 }
00021
00022 unsigned int
00023 RLEGenerator::getBinSize() const {
00024 unsigned int used=FilterBankGenerator::getBinSize();
00025 used+=strlen("RLEImage")+LoadSave::stringpad;
00026 used+=sizeof(unsigned int);
00027 if(imageValids[selectedSaveLayer][selectedSaveChannel])
00028 used+=XMIT_BYTES_PER_RUN*numRuns[selectedSaveLayer][selectedSaveChannel];
00029 else
00030 used+=XMIT_BYTES_PER_RUN*maxRuns[selectedSaveLayer];
00031 return used;
00032 }
00033
00034
00035 unsigned int
00036 RLEGenerator::LoadBuffer(const char buf[], unsigned int len) {
00037 unsigned int origlen=len;
00038 unsigned int used;
00039 std::string tmp;
00040 if(0==(used=FilterBankGenerator::LoadBuffer(buf,len))) return 0;
00041 len-=used; buf+=used;
00042 if(0==(used=decode(tmp,buf,len))) return 0;
00043 len-=used; buf+=used;
00044 if(tmp!="RLEImage") {
00045 serr->printf("Unhandled image type for RLEGenerator: %s",tmp.c_str());
00046 return 0;
00047 } else {
00048 if(0==(used=decode(numRuns[selectedSaveLayer][selectedSaveChannel],buf,len))) return 0;
00049 len-=used; buf+=used;
00050 if(maxRuns[selectedSaveLayer]<numRuns[selectedSaveLayer][selectedSaveChannel])
00051 return 0;
00052 if(images[selectedSaveLayer][selectedSaveChannel]==NULL)
00053 images[selectedSaveLayer][selectedSaveChannel]=createImageCache(selectedSaveLayer,selectedSaveChannel);
00054 run * runs=reinterpret_cast<run*>(images[selectedSaveLayer][selectedSaveChannel]);
00055 if(runs==NULL)
00056 return 0;
00057 unsigned int y=0;
00058 for(unsigned int i=0; i<numRuns[selectedSaveLayer][selectedSaveChannel]; i++) {
00059 if(0==(used=decode(runs[i].color,buf,len))) return 0;
00060 len-=used; buf+=used;
00061 if(0==(used=decode(runs[i].x,buf,len))) return 0;
00062 len-=used; buf+=used;
00063 if(0==(used=decode(runs[i].width,buf,len))) return 0;
00064 len-=used; buf+=used;
00065 if((unsigned int)(runs[i].x+runs[i].width)>=getWidth(selectedSaveLayer))
00066 y++;
00067 runs[i].y=y;
00068 }
00069 imageValids[selectedSaveLayer][selectedSaveChannel]=true;
00070 return origlen-len;
00071 }
00072 }
00073
00074 unsigned int
00075 RLEGenerator::SaveBuffer(char buf[], unsigned int len) const {
00076 unsigned int origlen=len;
00077 unsigned int used;
00078 if(0==(used=FilterBankGenerator::SaveBuffer(buf,len))) return 0;
00079 len-=used; buf+=used;
00080 if(0==(used=encode("RLEImage",buf,len))) return 0;
00081 len-=used; buf+=used;
00082
00083 run * runs=reinterpret_cast<run*>(getImage(selectedSaveLayer,selectedSaveChannel));
00084 if(runs==NULL)
00085 return 0;
00086 if(0==(used=encode(numRuns[selectedSaveLayer][selectedSaveChannel],buf,len))) return 0;
00087 len-=used; buf+=used;
00088 for(unsigned int i=0; i<numRuns[selectedSaveLayer][selectedSaveChannel]; i++) {
00089 if(0==(used=encode(runs[i].color,buf,len))) return 0;
00090 len-=used; buf+=used;
00091 if(0==(used=encode(runs[i].x,buf,len))) return 0;
00092 len-=used; buf+=used;
00093 if(0==(used=encode(runs[i].width,buf,len))) return 0;
00094 len-=used; buf+=used;
00095 }
00096 return origlen-len;
00097 }
00098
00099 void
00100 RLEGenerator::setDimensions() {
00101 FilterBankGenerator::setDimensions();
00102 for(unsigned int i=0; i<numLayers; i++)
00103 maxRuns[i]=calcExpMaxRuns(i);
00104 }
00105
00106 void
00107 RLEGenerator::setNumImages(unsigned int nLayers, unsigned int nChannels) {
00108 if(nLayers==numLayers && nChannels==numChannels)
00109 return;
00110 FilterBankGenerator::setNumImages(nLayers,nChannels);
00111 maxRuns=new unsigned int[numLayers];
00112 numRuns=new unsigned int*[numLayers];
00113 for(unsigned int i=0; i<numLayers; i++) {
00114 maxRuns[i]=calcExpMaxRuns(i);
00115 numRuns[i]=new unsigned int[numChannels];
00116 }
00117 }
00118
00119
00120 unsigned char *
00121 RLEGenerator::createImageCache(unsigned int layer, unsigned int ) const {
00122 return reinterpret_cast<unsigned char*>(new run[maxRuns[layer]]);
00123 }
00124
00125
00126 void
00127 RLEGenerator::calcImage(unsigned int layer, unsigned int chan) const {
00128 PROFSECTION("RLEGenerator::calcImage(...)",state->mainProfile);
00129 numRuns[layer][chan] = CMVision::EncodeRuns(reinterpret_cast<run*>(images[layer][chan]),src->getImage(layer,chan),getWidth(layer),getHeight(layer),maxRuns[layer]);
00130 imageValids[layer][chan]=true;
00131 }
00132
00133 void
00134 RLEGenerator::destruct() {
00135 FilterBankGenerator::destruct();
00136 for(unsigned int i=0; i<numLayers; i++)
00137 delete [] numRuns[i];
00138 delete [] numRuns;
00139 numRuns=NULL;
00140 delete [] maxRuns;
00141 maxRuns=NULL;
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155