Homepage Demos Overview Downloads Tutorials 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(EventBase::EventGeneratorID_t gid, unsigned int sid, unsigned int mysid)
00010   : FilterBankGenerator("InterleavedYUVGenerator",gid,sid,EventBase::visInterleaveEGID,mysid), srcYChan(0), srcUChan(1), srcVChan(2)
00011 { }
00012 
00013 InterleavedYUVGenerator::InterleavedYUVGenerator(EventBase::EventGeneratorID_t gid, unsigned int sid, unsigned int mysid, unsigned int syc, unsigned int suc, unsigned int svc)
00014   : FilterBankGenerator("InterleavedYUVGenerator",gid,sid,EventBase::visInterleaveEGID,mysid), srcYChan(syc), srcUChan(suc), srcVChan(svc)
00015 { }
00016 
00017 void
00018 InterleavedYUVGenerator::processEvent(const EventBase& event) {
00019   FilterBankGenerator::processEvent(event);
00020   if(event.getGeneratorID()==getListenGeneratorID() && event.getSourceID()==getListenSourceID())
00021     erouter->postEvent(new FilterBankEvent(this,getGeneratorID(),getSourceID()));
00022 }
00023 
00024 unsigned int
00025 InterleavedYUVGenerator::getBinSize() const {
00026   unsigned int used=FilterBankGenerator::getBinSize();
00027   used+=strlen("InterleavedYUVImage")+LoadSave::stringpad;
00028   used+=widths[selectedSaveLayer]*heights[selectedSaveLayer]*3;
00029   return used;
00030 }
00031 
00032 unsigned int
00033 InterleavedYUVGenerator::LoadBuffer(const char buf[], unsigned int len) {
00034   unsigned int origlen=len;
00035   unsigned int used;
00036   std::string tmp;
00037   if(0==(used=FilterBankGenerator::LoadBuffer(buf,len))) return 0;
00038   len-=used; buf+=used;
00039   if(0==(used=decode(tmp,buf,len))) return 0;
00040   len-=used; buf+=used;
00041   if(tmp!="InterleavedYUVImage") {
00042     serr->printf("Unhandled image type for InterleavedYUVGenerator: %s",tmp.c_str());
00043     return 0;
00044   } else {
00045     used=widths[selectedSaveLayer]*heights[selectedSaveLayer]*3;
00046     if(used>len)
00047       return 0;
00048     if(images[selectedSaveLayer][selectedSaveChannel]==NULL)
00049       images[selectedSaveLayer][selectedSaveChannel]=createImageCache(selectedSaveLayer,selectedSaveChannel);
00050     unsigned char* img=images[selectedSaveLayer][selectedSaveChannel];
00051     if(img==NULL)
00052       return 0;
00053     memcpy(img,buf,used);
00054     len-=used; buf+=used;
00055     imageValids[selectedSaveLayer][selectedSaveChannel]=true;
00056     return origlen-len; 
00057   }
00058 }
00059 
00060 unsigned int
00061 InterleavedYUVGenerator::SaveBuffer(char buf[], unsigned int len) const {
00062   unsigned int origlen=len;
00063   unsigned int used;
00064   if(0==(used=FilterBankGenerator::SaveBuffer(buf,len))) return 0;
00065   len-=used; buf+=used;
00066   if(0==(used=encode("InterleavedYUVImage",buf,len))) return 0;
00067   len-=used; buf+=used;
00068   
00069   used=widths[selectedSaveLayer]*heights[selectedSaveLayer]*3;
00070   if(used>len)
00071     return 0;
00072   unsigned char* img=getImage(selectedSaveLayer,selectedSaveChannel);
00073   if(img==NULL)
00074     return 0;
00075   memcpy(buf,img,used);
00076   len-=used;
00077   return origlen-len;
00078 }
00079 
00080 void
00081 InterleavedYUVGenerator::setDimensions() {
00082   FilterBankGenerator::setDimensions();
00083   for(unsigned int i=0; i<numLayers; i++)
00084     strides[i]=widths[i]*3;
00085 }
00086 
00087 void
00088 InterleavedYUVGenerator::setNumImages(unsigned int nLayers, unsigned int nChannels) {
00089   if(nLayers==numLayers && nChannels==numChannels)
00090     return;
00091   FilterBankGenerator::setNumImages(nLayers,1);
00092   for(unsigned int res=0; res<numLayers; res++)
00093     increments[res]=3;
00094 }
00095 
00096 unsigned char *
00097 InterleavedYUVGenerator::createImageCache(unsigned int layer, unsigned int /*chan*/) const {
00098   return new unsigned char[widths[layer]*heights[layer]*3];
00099 }
00100 
00101 void
00102 InterleavedYUVGenerator::calcImage(unsigned int layer, unsigned int chan) const {
00103   PROFSECTION("InterleavedYUVGenerator::calcImage(...)",state->mainProfile);
00104   unsigned char* dimg=images[layer][chan];
00105   const unsigned char* syimg=src->getImage(layer,srcYChan);
00106   const unsigned char* suimg=src->getImage(layer,srcUChan);
00107   const unsigned char* svimg=src->getImage(layer,srcVChan);
00108   const unsigned int inc=src->getIncrement(layer);
00109   //std::cout << src->getWidth(layer) << " inc=" << inc << " skip=" << src->getSkip(layer) << " stride=" << src->getStride(layer) << std::endl;
00110   for(unsigned int y=0; y<getHeight(layer); y++) {
00111     for(unsigned int x=0; x<getWidth(layer); x++) {
00112       *dimg++=*syimg;
00113       *dimg++=*svimg;
00114       *dimg++=*suimg;
00115       syimg+=inc;
00116       suimg+=inc;
00117       svimg+=inc;
00118     }
00119     syimg+=src->getSkip(layer);
00120     suimg+=src->getSkip(layer);
00121     svimg+=src->getSkip(layer);
00122   }
00123   imageValids[layer][chan]=true;
00124 }
00125 
00126 /*! @file
00127  * @brief Implements InterleavedYUVGenerator, which generates FilterBankEvents containing raw camera images with interleaved pixels (YUVYUVYUV... instead of YYY...UUU...VVV...)
00128  * @author ejt (Creator)
00129  *
00130  * $Author: ejt $
00131  * $Name: tekkotsu-2_2_1 $
00132  * $Revision: 1.9 $
00133  * $State: Exp $
00134  * $Date: 2004/11/09 20:01:49 $
00135  */
00136 

Tekkotsu v2.2.1
Generated Tue Nov 23 16:36:38 2004 by Doxygen 1.3.9.1