Требования к закреплению для фильтров записи
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
В этом разделе описываются требования к реализации выходного закрепления в фильтре записи DirectShow.
Закрепление имени
Можно присвоить пин-код любому имени. Если имя пин-кода начинается с символа тильды (~), диспетчер графов фильтров не автоматически отображает этот закрепление при вызове приложения IGraphBuilder::RenderFile. Например, если фильтр содержит пин-код записи и пин-код предварительного просмотра, можно назвать их "~Capture" и "Preview", соответственно. Если приложение отрисовывает этот фильтр в графе, предварительный просмотр пин-код подключается к своему отрисовщику по умолчанию, и ничего не будет подключаться к закреплению записи, что является разумным поведением по умолчанию. Это также может применяться к закреплениям, которые предоставляют информационные данные, которые не предназначены для отрисовки, или закреплений, которым требуется набор настраиваемых свойств. Обратите внимание, что закрепление с префиксом тильды (~) по-прежнему можно подключить вручную приложением.
Категория закреплений
Фильтр записи всегда имеет закрепление записи и может иметь значок предварительного просмотра. Для доставки других типов данных, таких как сведения об элементах управления, некоторые фильтры записи могут иметь другие выходные пин-коды. Каждый пин-код вывода должен предоставлять интерфейс IKsPropertySet. Приложения используют этот интерфейс для определения категории закреплений. Пин-код обычно возвращает PIN_CATEGORY_CAPTURE или PIN_CATEGORY_PREVIEW. Дополнительные сведения см. в наборе свойств pin.
В следующем примере показано, как реализовать 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;
}
Связанные разделы