InterleavedYUVGenerator.ccGo to the documentation of this file.00001 #include "InterleavedYUVGenerator.h"
00002 #include "Events/EventRouter.h"
00003 #include "Events/FilterBankEvent.h"
00004 #include "Wireless/Wireless.h"
00005 #include "Shared/WorldState.h"
00006
00007 #include "Shared/debuget.h"
00008
00009 InterleavedYUVGenerator::InterleavedYUVGenerator(unsigned int mysid,FilterBankGenerator* fbg, EventBase::EventTypeID_t tid)
00010 : FilterBankGenerator("InterleavedYUVGenerator","InterleavedYUVGenerator",EventBase::visInterleaveEGID,mysid,fbg,tid), srcYChan(0), srcUChan(1), srcVChan(2), isAllocated(NULL)
00011 {
00012
00013 if(fbg!=NULL) {
00014 numLayers=numChannels=0;
00015 setNumImages(fbg->getNumLayers(),fbg->getNumChannels());
00016 }
00017 }
00018
00019 InterleavedYUVGenerator::InterleavedYUVGenerator(unsigned int mysid, unsigned int syc, unsigned int suc, unsigned int svc,FilterBankGenerator* fbg, EventBase::EventTypeID_t tid)
00020 : FilterBankGenerator("InterleavedYUVGenerator","InterleavedYUVGenerator",EventBase::visInterleaveEGID,mysid,fbg,tid), srcYChan(syc), srcUChan(suc), srcVChan(svc), isAllocated(NULL)
00021 {
00022
00023 if(fbg!=NULL) {
00024 numLayers=numChannels=0;
00025 setNumImages(fbg->getNumLayers(),fbg->getNumChannels());
00026 }
00027 }
00028
00029 void
00030 InterleavedYUVGenerator::processEvent(const EventBase& event) {
00031 FilterBankGenerator::processEvent(event);
00032 if(event.getGeneratorID()==getListenGeneratorID() && event.getSourceID()==getListenSourceID()) {
00033 erouter->postEvent(new FilterBankEvent(this,getGeneratorID(),getSourceID(),EventBase::activateETID));
00034 erouter->postEvent(new FilterBankEvent(this,getGeneratorID(),getSourceID(),EventBase::statusETID));
00035 erouter->postEvent(new FilterBankEvent(this,getGeneratorID(),getSourceID(),EventBase::deactivateETID));
00036 }
00037 }
00038
00039 unsigned int
00040 InterleavedYUVGenerator::getBinSize() const {
00041 unsigned int used=FilterBankGenerator::getBinSize();
00042 used+=strlen("InterleavedYUVImage")+LoadSave::stringpad;
00043 used+=widths[selectedSaveLayer]*heights[selectedSaveLayer]*3;
00044 return used;
00045 }
00046
00047 unsigned int
00048 InterleavedYUVGenerator::LoadBuffer(const char buf[], unsigned int len) {
00049 unsigned int origlen=len;
00050 unsigned int used;
00051 std::string tmp;
00052 if(0==(used=FilterBankGenerator::LoadBuffer(buf,len))) return 0;
00053 len-=used; buf+=used;
00054 if(0==(used=decode(tmp,buf,len))) return 0;
00055 len-=used; buf+=used;
00056 if(tmp!="InterleavedYUVImage") {
00057 serr->printf("Unhandled image type for InterleavedYUVGenerator: %s",tmp.c_str());
00058 return 0;
00059 } else {
00060 used=widths[selectedSaveLayer]*heights[selectedSaveLayer]*3;
00061 if(used>len)
00062 return 0;
00063 if(images[selectedSaveLayer][selectedSaveChannel]==NULL)
00064 images[selectedSaveLayer][selectedSaveChannel]=createImageCache(selectedSaveLayer,selectedSaveChannel);
00065 unsigned char* img=images[selectedSaveLayer][selectedSaveChannel];
00066 if(img==NULL)
00067 return 0;
00068 memcpy(img,buf,used);
00069 len-=used; buf+=used;
00070 imageValids[selectedSaveLayer][selectedSaveChannel]=true;
00071 return origlen-len;
00072 }
00073 }
00074
00075 unsigned int
00076 InterleavedYUVGenerator::SaveBuffer(char buf[], unsigned int len) const {
00077 unsigned int origlen=len;
00078 unsigned int used;
00079 if(0==(used=FilterBankGenerator::SaveBuffer(buf,len))) return 0;
00080 len-=used; buf+=used;
00081 if(0==(used=encode("InterleavedYUVImage",buf,len))) return 0;
00082 len-=used; buf+=used;
00083
00084 used=widths[selectedSaveLayer]*heights[selectedSaveLayer]*3;
00085 if(used>len)
00086 return 0;
00087 if(images[selectedSaveLayer][selectedSaveChannel]==NULL) {
00088 serr->printf("InterleavedYUVGenerator::SaveBuffer() failed because selected image is NULL -- call selectSaveImage first to make sure it's up to date\n");
00089 return 0;
00090 }
00091 if(!imageValids[selectedSaveLayer][selectedSaveChannel]) {
00092 serr->printf("InterleavedYUVGenerator::SaveBuffer() failed because selected image is invalid -- call selectSaveImage first to make sure it's up to date\n");
00093 return 0;
00094 }
00095 unsigned char* img=images[selectedSaveLayer][selectedSaveChannel];
00096 if(img==NULL)
00097 return 0;
00098 memcpy(buf,img,used);
00099 len-=used;
00100 return origlen-len;
00101 }
00102
00103 void
00104 InterleavedYUVGenerator::setDimensions() {
00105 FilterBankGenerator::setDimensions();
00106 for(unsigned int i=0; i<numLayers; i++)
00107 strides[i]=widths[i]*3;
00108 }
00109
00110 void
00111 InterleavedYUVGenerator::destruct() {
00112 FilterBankGenerator::destruct();
00113 for(unsigned int i=0; i<numLayers; i++)
00114 delete [] isAllocated[i];
00115 delete [] isAllocated;
00116 isAllocated=NULL;
00117 }
00118
00119 void
00120 InterleavedYUVGenerator::setNumImages(unsigned int nLayers, unsigned int ) {
00121 if(nLayers==numLayers && 1==numChannels)
00122 return;
00123 FilterBankGenerator::setNumImages(nLayers,1);
00124 isAllocated=new bool*[numLayers];
00125 for(unsigned int res=0; res<numLayers; res++) {
00126 increments[res]=3;
00127 isAllocated[res]=new bool[numChannels];
00128 for(unsigned int c=0; c<numChannels; c++)
00129 isAllocated[res][c]=false;
00130 }
00131 }
00132
00133 void
00134 InterleavedYUVGenerator::freeCaches() {
00135 FilterBankGenerator::freeCaches();
00136 for(unsigned int i=0; i<numLayers; i++)
00137 for(unsigned int j=0; j<numChannels; j++)
00138 isAllocated[i][j]=false;
00139 }
00140
00141 void
00142 InterleavedYUVGenerator::invalidateCaches() {
00143 for(unsigned int i=0; i<numLayers; i++)
00144 for(unsigned int j=0; j<numChannels; j++) {
00145 if(!isAllocated[i][j])
00146 images[i][j]=NULL;
00147 imageValids[i][j]=false;
00148 }
00149 }
00150
00151 unsigned char *
00152 InterleavedYUVGenerator::createImageCache(unsigned int layer, unsigned int chan) const {
00153 if(src->getStride(layer)==getStride(layer) && src->getIncrement(layer)==getIncrement(layer)) {
00154
00155 ASSERT(!isAllocated[layer][chan],"pass through over allocated image!")
00156 imageValids[layer][chan]=true;
00157 return src->getImage(layer,srcYChan);
00158 } else {
00159 isAllocated[layer][chan]=true;
00160 return new unsigned char[widths[layer]*heights[layer]*3];
00161 }
00162 }
00163
00164 void
00165 InterleavedYUVGenerator::calcImage(unsigned int layer, unsigned int chan) {
00166 PROFSECTION("InterleavedYUVGenerator::calcImage(...)",state->mainProfile);
00167 if(imageValids[layer][chan])
00168 return;
00169
00170 unsigned char* dimg=images[layer][chan];
00171 const unsigned char* syimg=src->getImage(layer,srcYChan);
00172 const unsigned char* suimg=src->getImage(layer,srcUChan);
00173 const unsigned char* svimg=src->getImage(layer,srcVChan);
00174 const unsigned int inc=src->getIncrement(layer);
00175 const unsigned int skip=src->getSkip(layer);
00176
00177 for(unsigned int y=0; y<getHeight(layer); y++) {
00178 for(unsigned int x=0; x<getWidth(layer); x++) {
00179 *dimg++=*syimg;
00180 *dimg++=*svimg;
00181 *dimg++=*suimg;
00182 syimg+=inc;
00183 svimg+=inc;
00184 suimg+=inc;
00185 }
00186 syimg+=skip;
00187 svimg+=skip;
00188 suimg+=skip;
00189 }
00190 imageValids[layer][chan]=true;
00191 }
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
|