Поделиться через


Требования к закреплению для фильтров записи

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

В этом разделе описываются требования для реализации выходного закрепления в фильтре захвата DirectShow.

Название контакта

Вы можете присвоить закреплению любое имя. Если имя булавки начинается с символа тильды (~), диспетчер фильтра Graph не будет автоматически отображать этот закрепление, когда приложение вызывает IGraphBuilder::RenderFile. Например, если фильтр содержит закрепление захвата и контакт предварительного просмотра, вы можете назвать их "~Capture" и "Preview" соответственно. Если приложение отображает этот фильтр в графе, контакт предварительного просмотра будет подключаться к его отрисовщику по умолчанию, и ничто не будет подключаться к закреплению захвата, что является разумным поведением по умолчанию. Это также может применяться к контактам, которые предоставляют информационные данные, которые не предназначены для отрисовки, или к контактам, которым требуется задать настраиваемые свойства. Обратите внимание, что закрепления с префиксом тильды (~) по-прежнему могут быть подключены приложением вручную.

Закрепление категории

Фильтр захвата всегда имеет закрепление захвата и может иметь контакт предварительного просмотра. Некоторые фильтры записи могут иметь другие выходные контакты для доставки других типов данных, таких как сведения об элементах управления. Каждый вывод должен предоставлять интерфейс IKsPropertySet . Приложения используют этот интерфейс для определения категории контактов. Закрепление обычно возвращает либо PIN_CATEGORY_CAPTURE, либо PIN_CATEGORY_PREVIEW. Дополнительные сведения см. в разделе Закрепление набора свойств.

В следующем примере показано, как реализовать IKsPropertySet для возврата категории закреплений в контакте захвата:

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

Написание фильтров записи