/** \fn updateInfo */ bool vdpauVideoFilterDeint::configure( void) { diaMenuEntry tMode[]={ {ADM_KEEP_TOP, QT_TRANSLATE_NOOP("vdpaufilter","Keep Top Field"),NULL}, {ADM_KEEP_BOTTOM, QT_TRANSLATE_NOOP("vdpaufilter","Keep Bottom Field"),NULL}, {ADM_KEEP_BOTH, QT_TRANSLATE_NOOP("vdpaufilter","Double framerate"),NULL} }; bool doResize=configuration.resizeToggle; diaElemToggle tResize(&(doResize), QT_TRANSLATE_NOOP("vdpaufilter","_Resize:")); diaElemMenu mMode(&(configuration.deintMode), QT_TRANSLATE_NOOP("vdpaufilter","_Deint Mode:"), 3,tMode); diaElemUInteger tWidth(&(configuration.targetWidth),QT_TRANSLATE_NOOP("vdpaufilter","Width :"),16,2048); diaElemUInteger tHeight(&(configuration.targetHeight),QT_TRANSLATE_NOOP("vdpaufilter","Height :"),16,2048); diaElem *elems[]={&mMode,&tResize,&tWidth,&tHeight}; if(diaFactoryRun(QT_TRANSLATE_NOOP("vdpaufilter","vdpau"),sizeof(elems)/sizeof(diaElem *),elems)) { configuration.resizeToggle=(bool)doResize; info.width=configuration.targetWidth; info.height=configuration.targetHeight; ADM_info("New dimension : %d x %d\n",info.width,info.height); updateConf(); cleanupVdpau(); passThrough=!setupVdpau(); return 1; } return 0; }
/** \fn resetVdpau */ bool vdpauVideoFilterDeint::setupVdpau(void) { scaler=NULL; secondField=false; nextFrame=0; if(!admVdpau::isOperationnal()) { ADM_warning("Vdpau not operationnal\n"); return false; } if(VDP_STATUS_OK!=admVdpau::outputSurfaceCreate(VDP_RGBA_FORMAT_B8G8R8A8, info.width,info.height,&outputSurface)) { ADM_error("Cannot create outputSurface0\n"); return false; } for(int i=0;i<ADM_NB_SURFACES;i++) surfacePool[i]=VDP_INVALID_HANDLE; for(int i=0;i<ADM_NB_SURFACES;i++) { if(VDP_STATUS_OK!=admVdpau::surfaceCreate( previousFilter->getInfo()->width, previousFilter->getInfo()->height, &(surfacePool[i]))) { ADM_error("Cannot create input Surface %d\n",i); goto badInit; } aprintf("Created surface %d\n",(int)surfacePool[i]); } // allocate our (dummy) images for(int i=0;i<3;i++) xslots[i].image=new ADMImageDefault( previousFilter->getInfo()->width, previousFilter->getInfo()->height); if(VDP_STATUS_OK!=admVdpau::mixerCreate(previousFilter->getInfo()->width, previousFilter->getInfo()->height,&mixer,true)) { ADM_error("Cannot create mixer\n"); goto badInit; } tempBuffer=new uint8_t[info.width*info.height*4]; scaler=new ADMColorScalerSimple( info.width,info.height, ADM_COLOR_BGR32A,ADM_COLOR_YV12); freeSurface.clear(); for(int i=0;i<ADM_NB_SURFACES;i++) freeSurface.push_back(surfacePool[i]); ADM_info("VDPAU setup ok\n"); if(initGl()==false) { ADM_error("Cannot setup openGL\n"); goto badInit; } ADM_info("VDPAU setup ok\n"); return true; badInit: cleanupVdpau(); passThrough=true; return false; }
/** \fn destructor */ vdpauVideoFilterDeint::~vdpauVideoFilterDeint() { // delete original; delete vidCache; vidCache = NULL; cleanupVdpau(); }
/** \fn destructor */ vdpauVideoFilterDeint::~vdpauVideoFilterDeint() { cleanupVdpau(); }