Compartir a través de


Requisitos de anclaje para filtros de captura

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

En este tema se describen los requisitos para implementar un pin de salida en un filtro de captura directShow.

Nombre del pin

Puede asignar un pin a cualquier nombre. Si el nombre del pin comienza con el carácter de tilde (~), el Administrador de gráficos de filtros no representa automáticamente ese pin cuando una aplicación llama a IGraphBuilder::RenderFile. Por ejemplo, si el filtro tiene un pin de captura y un pin de vista previa, puede asignarles el nombre "~Capture" y "Preview", respectivamente. Si una aplicación representa ese filtro en un grafo, el pin de vista previa se conectará a su representador predeterminado y nada se conectará al pin de captura, que es un comportamiento predeterminado razonable. Esto también se puede aplicar a las patillas que proporcionan datos informativos que no están diseñados para representarse o a patillas que necesitan establecer propiedades personalizadas. Tenga en cuenta que la aplicación todavía puede conectar manualmente las patillas con el prefijo tilde (~).

Anclar categoría

Un filtro de captura siempre tiene un pin de captura y es posible que tenga un pin de vista previa. Algunos filtros de captura pueden tener otras patillas de salida para entregar otros tipos de datos, como la información de control. Cada patilla de salida debe exponer la interfaz IKsPropertySet . Las aplicaciones usan esta interfaz para determinar la categoría de anclaje. Normalmente, el pin devuelve PIN_CATEGORY_CAPTURE o PIN_CATEGORY_PREVIEW. Para obtener más información, vea Anclar conjunto de propiedades.

En el ejemplo siguiente se muestra cómo implementar IKsPropertySet para devolver la categoría pin en un pin de captura:

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

Escribir filtros de captura