2016-03-06 21 views
3

框架步對於視頻混合呈現,我有實現對CBaseRenderer

//IFilterGraph * m_FilterGraph 
IVideoFrameStep * ivfs=0; 
HRESULT hr = m_FilterGraph->QueryInterface(IID_IVideoFrameStep, (void**)&ivfs); 
if (SUCCEEDED(hr)) 
{ 
    ivfs->Step(1, 0); 
} 
SAFE_RELEASE(ivfs); 

和它的作品,但使用派生類基類CBaseRenderer的,我不能做出同樣的。閱讀參考頁面,我試圖在渲染器上實現IKsPropertySet接口,但它從來不會被查詢,所以這是關於它...

那麼如何啓用幀自定義渲染器上的步進?

我也很好奇知道如何實現實際的步進。

對於一個骯髒的快速解決方案,由於這樣的事實,我似乎擁有一個直接指向渲染,我只是叫

//CBaseRenderer * m_pRenderer 
m_pRenderer->BeginFlush(); 
m_pRenderer->EndFlush(); 
從應用程序線程

。它工作,直到我從步進狀態(=暫停)切換到播放狀態。從本質上講,它從來沒有崩潰,但似乎有一個滯後等於步進狀態的持續時間。顯然這是不正確的。

+1

你可以顯示你的'QueryInterface'實現嗎? – wimh

+0

@Wimmel,你在說。我正在調用'CBaseRenderer :: QueryInterface'並且缺少一個繼承級別。 – mainactual

回答

3

好吧,我找到了EC_STEP_COMPLETE通知。所以這將做到這一點。

STDMETHODIMP CSteppingBaseRenderer::NonDelegatingQueryInterface(const IID &riid, void **ppv){ 
    if (!ppv) 
     return E_POINTER; 
    if (riid == IID_IKsPropertySet){ 
     return GetInterface((IKsPropertySet*)this, ppv); 
    } 
    return CBaseRenderer::NonDelegatingQueryInterface(riid,ppv); 
} 
STDMETHODIMP CSteppingBaseRenderer::Set( 
      REFGUID guidPropSet, 
      DWORD dwPropID, 
      LPVOID pInstanceData, 
      DWORD cbInstanceData, 
      LPVOID pPropData, 
      DWORD cbPropData) 
{ 
    if (guidPropSet == AM_KSPROPSETID_FrameStep) 
    { 
     if (dwPropID == AM_PROPERTY_FRAMESTEP_STEP) 
     { 
      m_Stepping = 1; 
      return S_OK; 
     }else if (dwPropID == AM_PROPERTY_FRAMESTEP_CANSTEP) 
     { 
      return S_OK; 
     } 
    } 
    return E_PROP_SET_UNSUPPORTED; 
} 
HRESULT CSteppingBaseRenderer::DoRenderSample(IMediaSample *pMediaSample){ 
    //... 
    if (m_Stepping && !(--m_Stepping)) 
    { 
     this->NotifyEvent(EC_STEP_COMPLETE, 0, 0); 
    } 
    return NOERROR; 
}