2014-03-12 32 views
0

目前我的過濾器只是將數據從一個輸入引腳轉發到渲染器過濾器。我正在Graphstudio中測試它。 現在,一切似乎工作得很好,除了在我的輸出引腳的傳遞方法中調用 連接的輸入引腳返回拒絕樣本的錯誤代碼。 ( VFW_E_SAMPLE_REJECTED 0x8004022B)視頻渲染器過濾器拒絕示例

根據MSDN會發生這種情況如果符合下列條件:

  • 的引腳沖洗(見沖洗)。
  • 引腳未連接。
  • 過濾器停止。
  • 發生

其他一些錯誤,我不認爲第一個是真實的。它不能沖洗所有輸入樣品

第二個不能是真實的,因爲過濾器已經連接。

第三個不太可能。爲什麼要停止過濾器。

所以我認爲它一定是一些其他的錯誤,但我找不到有用的信息。

HRESULT MCMyOutputPin::Deliver(IMediaSample* sample) 
{ 
    HRESULT hr = NO_ERROR; 
    myLogger->LogDebug("In Outputpin Deliver", L"D:\\TEMP\\yc.log"); 
    if (sample->GetActualDataLength() > 0) 
    { 

     hr = m_pInputPin->Receive(sample); 





     sample->AddRef(); 
    } 

    return hr; 
    //Forward to filter 
} 

正如你可以看到我確信使用由輸入引腳

HRESULT MCMyOutputPin::DecideAllocator(IMemInputPin *pPin, IMemAllocator **ppAlloc) 
{ 
    ALLOCATOR_PROPERTIES *pprops = new ALLOCATOR_PROPERTIES; 
    /*HRESULT hr = pPin->GetAllocatorRequirements(pprops); 
    if (FAILED(hr))*/ 
     //return hr; 
    HRESULT hr = pPin->GetAllocator(ppAlloc); 
    if (hr == VFW_E_NO_ALLOCATOR) 
    { 
     hr = InitAllocator(ppAlloc); 
     if (FAILED(hr)) 
      return hr; 
    } 
    hr = DecideBufferSize(*ppAlloc, pprops); 
    if (FAILED(hr)) 
     return hr; 

    hr = pPin->NotifyAllocator(*ppAlloc, TRUE); 

    if (FAILED(hr)) 
    { 
     return hr; 
    } 
    *ppAlloc = m_pAllocator; 
    m_pAllocator->AddRef(); 
    return hr; 

} 

這裏提供的IMemAllocator是我從precdeing過濾我inputpin得到樣本:

HRESULT CMyInputPin::Receive(IMediaSample *pSample) 
{ 
    mylogger->LogDebug("In Inputpin Receive", L"D:\\TEMP\\yc.log"); 
    //Forward to filter 
    filter->acceptFilterInput(pinname, pSample); 
    return S_OK; 
} 

這就叫我的過濾器中的acceptFilterInput:

void MyFilter::acceptFilterInput(LPCWSTR pinname, IMediaSample* sample) 
{ 

    //samplesPin0.insert(samplesPin0.end(), sample); 
    mylogger->LogDebug("In acceptFIlterInput", L"D:\\TEMP\\yc.log"); 
    outpin->Deliver(sample); 



} 

的交付方法已經張貼以上

enter image description here

回答

2

這麼多的問題問最近,你還是不要問他們以正確的方式。這裏是checklist在發佈前檢查你的問題。

你有拒絕?那麼什麼是錯誤代碼。

出於性能原因,視頻呈現對於輸入來說是挑剔的。所以如果你連接到視頻渲染器,你必須正確地做一切事情。即使您可以使用其他濾鏡切角,它也不適用於視頻渲染器。

我的猜測是你忽略了引腳連接上的媒體採樣必須屬於約定的分配器的規則。 VMR將只接受來自其自己的分配器的樣本(有效地由視頻表面支持)。一個不會簡單地將來自屬於另一個分配器的輸入引腳的媒體採樣「轉發」到VMR的輸入。我最好的就是你遇到的問題。 您必須複製數據而不是在引腳之間傳遞介質採樣指針(或者您必須傳播VMR的分配器,這是一項非常高級的任務)。

此外,VMR/EVR對視頻跨度有特定的要求。只要我看到VMR和你的過濾器之間有直接的聯繫,我懷疑你可能會忽略它,在這種情況下,你稍後會面對這個問題,但你可以馬上開始閱讀MSDN:Handling Format Changes from the Video Renderer

+0

謝謝你的回答羅馬。我編輯了我的答案以包含相關的代碼。我確實使用輸入引腳(videorender)的分配器 – Luke

+0

不,它不能讓我相信媒體樣本屬於合適的分配器。 –

+0

我需要做些什麼才能確保它屬於正確的分配器? – Luke