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