Fixar requisitos para filtros de captura

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Este tópico descreve os requisitos para implementar um pino de saída em um filtro de captura do DirectShow.

Nome do pino

Você pode dar qualquer nome a um pino. Se o nome do pino começar com o caractere til (~), o Gerenciador de Grafo de Filtro não renderizará automaticamente esse pino quando um aplicativo chamar IGraphBuilder::RenderFile. Por exemplo, se o filtro tiver um pin de captura e um pin de visualização, você poderá nomeá-los como "~Capturar" e "Visualização", respectivamente. Se um aplicativo renderizar esse filtro em um grafo, o pino de visualização se conectará ao renderizador padrão e nada se conectará ao pino de captura, o que é um comportamento padrão razoável. Isso também pode se aplicar a pinos que fornecem dados informativos que não devem ser renderizados ou a pinos que precisam de propriedades personalizadas definidas. Observe que os pinos com o prefixo de bloco (~) ainda podem ser conectados manualmente pelo aplicativo.

Categoria de fixação

Um filtro de captura sempre tem um pin de captura e pode ter um pin de visualização. Alguns filtros de captura podem ter outros pinos de saída para fornecer outros tipos de dados, como informações de controle. Cada pino de saída deve expor a interface IKsPropertySet . Os aplicativos usam essa interface para determinar a categoria de pino. O pino normalmente retorna PIN_CATEGORY_CAPTURE ou PIN_CATEGORY_PREVIEW. Para obter mais informações, consulte Fixar Conjunto de Propriedades.

O exemplo a seguir mostra como implementar IKsPropertySet para retornar a categoria de pino em um 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;
}

Escrevendo filtros de captura