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 ) 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
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
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135