yuvscaler_t * sws_init_yuvscaler(int srcW,int srcH,int dstW, int dstH,ea_t front_inBuffer, ea_t back_inBuffer, ea_t front_outBuffer, ea_t back_outBuffer) { struct yuvscaler_s *yuvs; yuvs=(struct yuvscaler_s *)memalign(64,sizeof(struct yuvscaler_s)); yuvs->iargs=(struct img_args *)memalign(128,sizeof(struct img_args)); yuvs->iargs->srcW=srcW; yuvs->iargs->srcH=srcH; yuvs->iargs->dstW=dstW; yuvs->iargs->dstH=dstH; yuvs->iargs->Ystart[0]=(unsigned long long)front_inBuffer; yuvs->iargs->Ystart[1]=(unsigned long long)back_inBuffer; yuvs->iargs->Ustart[0]=yuvs->iargs->Ystart[0]+srcW*srcH; //maybe these should be removed... yuvs->iargs->Ustart[1]=yuvs->iargs->Ystart[1]+srcW*srcH; yuvs->iargs->Vstart[0]=yuvs->iargs->Ystart[0]+srcW*srcH + srcW*srcH/4; yuvs->iargs->Vstart[1]=yuvs->iargs->Ystart[1]+srcW*srcH + srcW*srcH/4; yuvs->iargs->Output[0]=(unsigned long long)front_outBuffer; yuvs->iargs->Output[1]=(unsigned long long)back_outBuffer; yuvs->envp=(void*)sizeof(struct img_args); yuvs->argp=yuvs->iargs; yuvs->createflags=SPE_EVENTS_ENABLE; yuvs->entry=SPE_DEFAULT_ENTRY; yuvs->runflags=0; yuvs->ctx=spe_context_create(yuvs->createflags, NULL); yuvs->thread_id=pthread_create(&yuvs->pts,NULL,&sws_spe_thread,yuvs); yuvs->spe_event_yuvscaler = spe_event_handler_create(); yuvs->event.spe = yuvs->ctx; yuvs->event.events = SPE_EVENT_OUT_INTR_MBOX | SPE_EVENT_SPE_STOPPED; spe_event_handler_register(yuvs->spe_event_yuvscaler, &yuvs->event); return yuvs; }
/* Register the event handlers for each context */ void registerEventHandlers(SpuThreadData * spu_data) { int i, no_spus; no_spus = spu_data->no_spu_threads; for (i=0; i<no_spus; i++) { spe_event_unit_t event; spu_data->spus[i].evnt_handler = spe_event_handler_create(); event.events = SPE_EVENT_OUT_INTR_MBOX; event.spe = spu_data->spus[i].ctx; if (spe_event_handler_register(spu_data->spus[i].evnt_handler, &event)) { perror("Failed registering event handler for Cell SPU"); exit(1); } } }