mfclock=NULL;
mfmediatype=NULL;
endofstream=false;
+ start_get_evr_samples=false;
ResetSyncOffsets();
if (surfaces[i]!=NULL) surfaces[i]->Release();
surfaces[i]=NULL;
}
+ start_get_evr_samples=false;
Unlock();
}
HRESULT hres= surfallocnotify->AllocateSurfaceHelper(allocinf,numbuf,&surfaces.at(0));
vheight=allocinf->dwHeight;
vwidth=allocinf->dwWidth;
+ start_get_evr_samples=false;
Unlock();
/* char buffer[1024];
sprintf(buffer,"%d * %d",allocinf->dwWidth,allocinf->dwHeight);
HRESULT STDMETHODCALLTYPE DsAllocator::StartPresenting(DWORD_PTR userid){
//MessageBox(0,"drive me","drive me",0);
((OsdWin*)Osd::getInstance())->setExternalDriving(this,vwidth,vheight);
+ start_get_evr_samples=false;
return S_OK;
}
HRESULT STDMETHODCALLTYPE DsAllocator::StopPresenting(DWORD_PTR userid){
((OsdWin*)Osd::getInstance())->setExternalDriving(NULL,0,0);
+ start_get_evr_samples=false;
return S_OK;
}
mfclock->GetCorrelatedTime(0,&endtime,&dummy);
LONGLONG delay=endtime-starttime;
mediasink->Notify( EC_PROCESSING_LATENCY,(LONG_PTR)&delay,0);
+
+ //Check if presentation is soon
+ MFTIME systime=0;
+ LONGLONG currenttime=0;
+ hres=outdatabuffer.pSample->GetSampleTime(&prestime);
+ if (hres==S_OK)
+ {
+ if (mfclock) mfclock->GetCorrelatedTime(0,¤ttime,&systime);
+ }
+ LONGLONG delta=prestime-currenttime;
+ if (delta<0) {
+ break; //break if presentation is soon
+ }
+
+
}
} else break;
switch (mess) {
case MFVP_MESSAGE_FLUSH:{
//Log::getInstance()->log("DsAllocator", Log::DEBUG , "EVR Message MFVP_MESSAGE_FLUSH received");
- FlushEVRSamples(); }break;
+ FlushEVRSamples();
+ start_get_evr_samples=false;
+ }break;
case MFVP_MESSAGE_INVALIDATEMEDIATYPE: {
Log::getInstance()->log("DsAllocator", Log::DEBUG , "EVR Message MFVP_MESSAGE_INVALIDATEMEDIATYPE received");
if (mfmediatype) mfmediatype->Release();
mfmediatype=NULL;
+ start_get_evr_samples=false;
RenegotiateEVRMediaType();}break;
case MFVP_MESSAGE_PROCESSINPUTNOTIFY: {
- //Log::getInstance()->log("DsAllocator", Log::DEBUG , "EVR Message MFVP_MESSAGE_PROCESSINPUTNOTIFY received");
- GetEVRSamples(); } break;
+ Log::getInstance()->log("DsAllocator", Log::DEBUG , "EVR Message MFVP_MESSAGE_PROCESSINPUTNOTIFY received");
+ if (!start_get_evr_samples) GetEVRSamples();
+ start_get_evr_samples=true;
+ } break;
case MFVP_MESSAGE_BEGINSTREAMING:{
Log::getInstance()->log("DsAllocator", Log::DEBUG , "EVR Message MFVP_MESSAGE_BEGINSTREAMING received");
ResetSyncOffsets();
Log::getInstance()->log("DsAllocator", Log::DEBUG , "EVR Message MFVP_MESSAGE_ENDSTREAMING received");
((OsdWin*)Osd::getInstance())->SetEVRStatus(OsdWin::EVR_pres_off);
((OsdWin*)Osd::getInstance())->setExternalDriving(NULL,vwidth,vheight);
+ start_get_evr_samples=false;
//FlushEVRSamples();
//if (mfmediatype) mfmediatype->Release();
//mfmediatype=NULL;
Log::getInstance()->log("DsAllocator", Log::DEBUG , "EVR Message MFVP_MESSAGE_ENDOFSTREAM received");
MessageBox(0,"endofstream","endofstream",0);
endofstream=true;
+ start_get_evr_samples=false;
} break;
case MFVP_MESSAGE_STEP: {
Log::getInstance()->log("DsAllocator", Log::DEBUG , "EVR Message MFVP_MESSAGE_STEP received");
((OsdWin*)Osd::getInstance())->setExternalDriving(this,vwidth,vheight);
Log::getInstance()->log("DsAllocator", Log::DEBUG , "OnClockStart");
((OsdWin*)Osd::getInstance())->SetEVRStatus(OsdWin::EVR_pres_started);
- GetEVRSamples();
+ //GetEVRSamples();
return S_OK;
}
*surf=NULL;
*waittime=10;
- if (fullevrsamples.size()==0) GetEVRSamples();
Lock();
+ if (fullevrsamples.size()==0) {
+ *waittime=1;
+ if (start_get_evr_samples) GetEVRSamples();
+ }
//Log::getInstance()->log("DsAllocator", Log::DEBUG , "Enter Get Next Surface");
while (fullevrsamples.size()>0)
void DsAllocator::DiscardSurfaceandgetWait(DWORD *waittime)
{
//Log::getInstance()->log("DsAllocator", Log::DEBUG , "Discard surface and get Wait");
- GetEVRSamples();
+ if (start_get_evr_samples) GetEVRSamples();
//Log::getInstance()->log("DsAllocator", Log::DEBUG , "Discard surface and get Wait2");
Lock();
if (fullevrsamples.size()==0) {