Partager via


Spécifications des broches pour les filtres de capture

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Cette rubrique décrit les conditions requises pour implémenter une broche de sortie sur un filtre de capture DirectShow.

Nom de la broche

Vous pouvez donner un nom quelconque à une épingle. Si le nom du code pin commence par le caractère tilde (~), le Gestionnaire de graphes de filtre n’affiche pas automatiquement cette épingle lorsqu’une application appelle IGraphBuilder::RenderFile. Par exemple, si le filtre a une broche de capture et une broche d’aperçu, vous pouvez les nommer respectivement « ~Capture » et « Aperçu ». Si une application affiche ce filtre dans un graphique, la broche d’aperçu se connecte à son convertisseur par défaut, et rien ne se connecte à la broche de capture, ce qui est un comportement par défaut raisonnable. Cela peut également s’appliquer aux broches qui fournissent des données d’information qui ne sont pas destinées à être rendues, ou aux broches qui nécessitent des propriétés personnalisées définies. Notez que les broches avec le préfixe tilde (~) peuvent toujours être connectées manuellement par l’application.

Catégorie de broches

Un filtre de capture a toujours une broche de capture et peut avoir une broche d’aperçu. Certains filtres de capture peuvent avoir d’autres broches de sortie, pour fournir d’autres types de données, comme des informations de contrôle. Chaque broche de sortie doit exposer l’interface IKsPropertySet . Les applications utilisent cette interface pour déterminer la catégorie de broches. La broche retourne généralement PIN_CATEGORY_CAPTURE ou PIN_CATEGORY_PREVIEW. Pour plus d’informations, consultez Pin Property Set.

L’exemple suivant montre comment implémenter IKsPropertySet pour retourner la catégorie de broche sur une broche de capture :

// 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;
}

Écriture de filtres de capture