2011-11-11 72 views
1

開發我的DirectShow應用程序時出現奇怪的問題。我正在使用Delphi 6與DSPACK DirectShow組件庫。當我嘗試使用TPinInfo.achName屬性(_PinInfo)在過濾器中查找引腳時,其中一個IBaseFilter實例似乎無法識別它擁有的引腳。 (注意,在這種情況下,它是TSampleGrabber組件創建的IBaseFilter,它表現出這種奇怪的行爲)。儘管它是由QueryPinInfo返回的ID,但無法通過名稱/ ID在DirectShow過濾器中找到引腳

事件,封裝下面的代碼示例中的序列是這樣的:

  1. 查找在IBaseFilter實例的第一個可用的輸入引腳。在下面的代碼中,這是傳遞給testPinInfo()的引腳。
  2. 在返回的引腳上執行QueryPinInfo()以獲取該信息。返回的信息顯示pin的achName爲'Input'。
  3. 嘗試使用IBaseFilter.findPin()在相同的IBaseFilter實例中找到名爲'Input'的引腳。
  4. 返回NIL指示無法找到該名稱的PIN。這在我看來是一個非常奇怪的情況(錯誤)。

有誰知道什麼樣的條件可能會導致這種情況?我不認爲這是內存損壞問題,因爲當我在調試器中檢查它們時,涉及的數據結構看起來很好。有些IBaseFilter實現可能忽略正確實現FindPin()方法嗎?

這裏的代碼如下:

procedure testPinInfo(intfInputPin: IPin); 
var 
    intfTestPin: IPin; 
    pinInfo_input: TPinInfo; 
begin 
    intfTestPin := nil; 

    // Get the pin information. 
    ZeroMemory(@pinInfo_input, SizeOf(pinInfo_input)); 
    intfInputPin.QueryPinInfo(pinInfo_input); 

    // Now immediately turn around and try to find the pin in the filter that 
    // owns it, using the name found in pinInfo_input 
    pinInfo_input.pFilter.FindPin(pinInfo_input.achName, intfTestPin); 

    // >>> intfTestPin is NIL (unassigned). This is an error. 
end; 

回答

1

不要使用FindPin,你總是有更好的方法來做到這一點。使用感興趣的媒體類型查找所需方向的未連接引腳。如果您專門查找預覽/捕獲引腳,則始終可以選擇使用IKsPropertySet接口來明確標識所需的引腳。

1

我有一個類似的問題,這讓我做FindPin的我自己的版本: -

HRESULT GraphControl::FindPinByName(IBaseFilter* pFilter,LPCWSTR pName,IPin** ppPin) 
{ 
    HRESULT hr = E_FAIL; 
    IEnumPins* pEnum = NULL; 
    IPin* pPin = NULL; 
    DWORD pFetched = 0; 
    PIN_INFO pinInfo = {0}; 

    // Create a pin enumerator 
    if(FAILED(pFilter->EnumPins(&pEnum))) 
     return E_FAIL; 


    // Get the first instance 
    hr = pEnum->Next(1,&pPin,&pFetched); 

    while(hr == S_OK) 
    { 
    pPin->QueryPinInfo(&pinInfo); 
    // Compare the names 
    if (wcscmp(pName,pinInfo.achName) == 0) 
    { 
     // pin names match so use this one and exit 
     *ppPin = pPin; 
     break; 
    } 
    SAFE_RELEASE(pinInfo.pFilter); 
    SAFE_RELEASE(pPin); 

    hr = pEnum->Next(1,&pPin,&pFetched); 
    } 

    SAFE_RELEASE(pinInfo.pFilter); 
    SAFE_RELEASE(pEnum); 

    // if the pPin address is null we didnt find a pin with the wanted name 
    if(&*pPin == NULL) 
     hr = VFW_E_NOT_FOUND; 

    return hr; 
} 
0

對於FindPin需要相應的ID,檢查QueryId()。對於輸入它通常是「In」。