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

Tekkotsu v2.1
Generated Tue Mar 16 23:19:13 2004 by Doxygen 1.3.5