Dela via


Pin-krav för avbildningsfilter

[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

I det här avsnittet beskrivs kraven för att implementera en utdatastift på ett DirectShow-avbildningsfilter.

Fäst namn

Du kan ange ett pin-valfritt namn. Om stiftnamnet börjar med tilde-tecknet (~) renderas inte pin-koden automatiskt när ett program anropar IGraphBuilder::RenderFile. Om filtret till exempel har en avbildningsstift och en förhandsgranskningsstift kan du ge dem namnet "~Capture" respektive "Preview". Om ett program renderar det filtret i en graf ansluter förhandsgranskningsstiftet till sin standardåtergivning och ingenting ansluter till insamlingsstiftet, vilket är ett rimligt standardbeteende. Detta kan också gälla pins som levererar informationsdata som inte är avsedda att renderas eller stift som behöver anpassade egenskaper. Observera att fästen med tilde-prefixet (~) fortfarande kan anslutas manuellt av programmet.

Fäst kategori

Ett avbildningsfilter har alltid en insamlingsstift och kan ha en pin-kod för förhandsgranskning. Vissa avbildningsfilter kan ha andra utdatastift för att leverera andra typer av data, till exempel kontrollinformation. Varje utdatastift måste exponera IKsPropertySet-gränssnittet. Program använder det här gränssnittet för att fastställa pin-kategorin. Stiftet returnerar vanligtvis antingen PIN_CATEGORY_CAPTURE eller PIN_CATEGORY_PREVIEW. Mer information finns i Pin Property Set.

I följande exempel visas hur du implementerar IKsPropertySet- för att returnera pin-kategorin på en avbildningsstift:

// Set: Cannot set any properties.
HRESULT CMyCapturePin::Set(REFGUID guidPropSet, DWORD dwID,
    void *pInstanceData, DWORD cbInstanceData, void *pPropData, 
    DWORD cbPropData)
{
    return E_NOTIMPL;
}

// Get: Return the pin category (our only property). 
HRESULT CMyCapturePin::Get(
    REFGUID guidPropSet,   // Which property set.
    DWORD dwPropID,        // Which property in that set.
    void *pInstanceData,   // Instance data (ignore).
    DWORD cbInstanceData,  // Size of the instance data (ignore).
    void *pPropData,       // Buffer to receive the property data.
    DWORD cbPropData,      // Size of the buffer.
    DWORD *pcbReturned     // Return the size of the property.
)
{
    if (guidPropSet != AMPROPSETID_Pin) 
        return E_PROP_SET_UNSUPPORTED;
    if (dwPropID != AMPROPERTY_PIN_CATEGORY)
        return E_PROP_ID_UNSUPPORTED;
    if (pPropData == NULL && pcbReturned == NULL)
        return E_POINTER;
    if (pcbReturned)
        *pcbReturned = sizeof(GUID);
    if (pPropData == NULL)  // Caller just wants to know the size.
        return S_OK;
    if (cbPropData < sizeof(GUID)) // The buffer is too small.
        return E_UNEXPECTED;
    *(GUID *)pPropData = PIN_CATEGORY_CAPTURE;
    return S_OK;
}

// QuerySupported: Query whether the pin supports the specified property.
HRESULT CMyCapturePin::QuerySupported(REFGUID guidPropSet, DWORD dwPropID,
    DWORD *pTypeSupport)
{
    if (guidPropSet != AMPROPSETID_Pin)
        return E_PROP_SET_UNSUPPORTED;
    if (dwPropID != AMPROPERTY_PIN_CATEGORY)
        return E_PROP_ID_UNSUPPORTED;
    if (pTypeSupport)
        // We support getting this property, but not setting it.
        *pTypeSupport = KSPROPERTY_SUPPORT_GET; 
    return S_OK;
}

skriva avbildningsfilter