rendered paste bodystruct img_args { int width; int height; int maxwidth; int maxheight; unsigned long long Ystart; unsigned long long Ustart; unsigned long long Vstart; unsigned long long Ostart; unsigned long long Ostartb; unsigned long long dummy;};int main(unsigned long long speid, unsigned long long argp, unsigned long long envp) { int tgiA=1; int tgiB=2; int tgoA=3; int tgoB=4; enum control { RUN, STOP, WAIT ,RDY}; int tag = 1,tag_mask=1<<tag; int buffsize; struct img_args *iargs; iargs =(struct img_args*) memalign(128,sizeof(*iargs)); dmaGetnWait(iargs,(unsigned int)argp,(int)envp,tag); printf("Height :%d\n",iargs->height); printf("Width :%d\n",iargs->width); printf("width scaled:%d\n",16*((iargs->width/2 + 8 )&16)); vector unsigned char* IybufferA=memalign(128,iargs->width*4); vector unsigned char* IubufferA=memalign(128,iargs->width); vector unsigned char* IvbufferA=memalign(128,iargs->width); vector unsigned char* IybufferB=memalign(128,iargs->width*4); vector unsigned char* IubufferB=memalign(128,iargs->width); vector unsigned char* IvbufferB=memalign(128,iargs->width); vector unsigned char* ObufferA=memalign(128,iargs->maxwidth*4*2); vector unsigned char* ObufferB=memalign(128,iargs->maxwidth*4*2); vector unsigned char* IyAp; vector unsigned char* IyBp; vector unsigned char* IuAp; vector unsigned char* IuBp; vector unsigned char* IvAp; vector unsigned char* IvBp; unsigned long long Op; unsigned long long Yp; unsigned long long Up; unsigned long long Vp; unsigned long long tmp; unsigned int msg; while (spu_stat_in_mbox() == 0); msg=spu_read_in_mbox(); if (msg==RUN){ printf("RUN\n"); } while (msg!=STOP) { Op=iargs->Ostart; Yp=iargs->Ystart; Up=iargs->Ustart; Vp=iargs->Vstart; dmaGet(IybufferA,Yp,iargs->width*4,tgiA); printf("getting Yp\n"); dmaGet(IubufferA,Up,iargs->width,tgiA); printf("getting Up\n"); dmaGet(IvbufferA,Vp,iargs->width,tgiA); printf("getting Vp\n"); Yp=Yp+iargs->width*4; Up=Up+iargs->width; Vp=Vp+iargs->width; dmaGet(IybufferB,Yp,iargs->width*4,tgiB); printf("getting Yp\n"); dmaGet(IubufferB,Up,iargs->width,tgiB); printf("getting Up\n"); dmaGet(IvbufferB,Vp,iargs->width,tgiB); printf("getting Vp\n"); for (int i=0;i < iargs->height/8;i++) { dmaWaitTag(tgiA); dmaWaitTag(tgoA); yuv420toARGB(IybufferA,IubufferA,IvbufferA,ObufferA,iargs->width,iargs->maxwidth); dmaPut(ObufferA,Op,iargs->maxwidth*4*2,tgoA); printf("puto\n"); Op=Op+iargs->maxwidth*4*2; IyAp=IybufferA+iargs->width*2/16; IuAp=IubufferA+iargs->width/32; IvAp=IvbufferA+iargs->width/32; dmaWaitTag(tgoB); yuv420toARGB(IyAp,IuAp,IvAp,ObufferB,iargs->width,iargs->maxwidth); dmaPut(ObufferB,Op,iargs->maxwidth*4*2,tgoB); Yp=Yp+iargs->width*4; Up=Up+iargs->width; Vp=Vp+iargs->width; Op=Op+iargs->maxwidth*4*2; if (iargs->height/8-1 != i){ dmaGet(IybufferA,Yp,iargs->width*4,tgiA); printf("getting Yp\n"); dmaGet(IubufferA,Up,iargs->width,tgiA); printf("getting Up\n"); dmaGet(IvbufferA,Vp,iargs->width,tgiA); printf("getting Vp\n"); } dmaWaitTag(tgiB); dmaWaitTag(tgoA); yuv420toARGB(IybufferB,IubufferB,IvbufferB,ObufferA,iargs->width,iargs->maxwidth); dmaPut(ObufferA,Op,iargs->maxwidth*4*2,tgoA); printf("puto\n"); Op=Op+iargs->maxwidth*4*2; IyBp=IybufferB+iargs->width*2/16; IuBp=IubufferB+iargs->width/32; IvBp=IvbufferB+iargs->width/32; dmaWaitTag(tgoB); yuv420toARGB(IyBp,IuBp,IvBp,ObufferB,iargs->width,iargs->maxwidth); dmaPut(ObufferB,Op,iargs->maxwidth*4*2,tgoB); Yp=Yp+iargs->width*4; Up=Up+iargs->width; Vp=Vp+iargs->width; Op=Op+iargs->maxwidth*4*2; if (iargs->height/8-1 != i){ dmaGet(IybufferB,Yp,iargs->width*4,tgiB); printf("getting Yp\n"); dmaGet(IubufferB,Up,iargs->width,tgiB); printf("getting Up\n"); dmaGet(IvbufferB,Vp,iargs->width,tgiB); printf("getting Vp\n"); } } while (spu_stat_out_mbox() == 0); msg=RDY; tmp=iargs->Ostart; iargs->Ostart=iargs->Ostartb; iargs->Ostartb=tmp; spu_write_out_mbox(msg); while (spu_stat_in_mbox() == 0); msg=spu_read_in_mbox(); if (msg == RUN){ // printf("RUN\n"); } else if (msg == STOP) { printf("Stopping\n"); } } return 0;}