Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

InterleavedYUVGenerator.cc

Go 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   //this part is only necessary if you override setNumImages yourself
00013   if(fbg!=NULL) {
00014     numLayers=numChannels=0; //this is to force setNumImages to override settings provided by FilterBankGenerator
00015     setNumImages(fbg->getNumLayers(),fbg->getNumChannels()); //channels gets overridden to '1' in setNumImages
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   //this part is only necessary if you override setNumImages yourself
00023   if(fbg!=NULL) {
00024     numLayers=numChannels=0; //this is to force setNumImages to override settings provided by FilterBankGenerator
00025     setNumImages(fbg->getNumLayers(),fbg->getNumChannels()); //channels gets overridden to '1' in setNumImages
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 /*nChannels*/) {
00121   if(nLayers==numLayers && 1==numChannels) // this generator only has 1 channel
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     //already interleaved, pass through
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]) //check if createCache set valid flag
00168     return; //indicates pass through from previous stage
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   //std::cout << src->getWidth(layer) << " inc=" << inc << " skip=" << src->getSkip(layer) << " stride=" << src->getStride(layer) << std::endl;
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 /*! @file
00194  * @brief Implements InterleavedYUVGenerator, which generates FilterBankEvents containing raw camera images with interleaved pixels (YUVYUVYUV... instead of YYY...UUU...VVV...)
00195  * @author ejt (Creator)
00196  *
00197  * $Author: ejt $
00198  * $Name: tekkotsu-2_4_1 $
00199  * $Revision: 1.15 $
00200  * $State: Exp $
00201  * $Date: 2005/08/15 22:57:16 $
00202  */
00203 

Tekkotsu v2.4.1
Generated Tue Aug 16 16:32:47 2005 by Doxygen 1.4.4