Bagikan melalui


Persyaratan Pin untuk Filter Pengambilan

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Topik ini menjelaskan persyaratan untuk menerapkan pin output pada filter penangkapan DirectShow.

Sematkan Nama

Anda dapat memberikan pin nama apa pun. Jika nama pin dimulai dengan karakter tilde (~), Filter Graph Manager tidak secara otomatis merender pin tersebut saat aplikasi memanggil IGraphBuilder::RenderFile. Misalnya, jika filter memiliki pin tangkapan dan pin pratinjau, Anda dapat menamainya masing-masing "~Capture" dan "Pratinjau". Jika aplikasi merender yang memfilter dalam grafik, pin pratinjau akan terhubung ke perender defaultnya, dan tidak ada yang akan terhubung ke pin tangkapan, yang merupakan perilaku default yang wajar. Ini juga dapat berlaku untuk pin yang mengirimkan data informasi yang tidak dimaksudkan untuk dirender, atau pin yang memerlukan kumpulan properti kustom. Perhatikan bahwa pin dengan awalan tilde (~) masih dapat dihubungkan secara manual oleh aplikasi.

Sematkan Kategori

Filter tangkapan selalu memiliki pin pengambilan, dan mungkin memiliki pin pratinjau. Beberapa filter pengambilan mungkin memiliki pin output lain, untuk mengirimkan jenis data lain, seperti informasi kontrol. Setiap pin output harus mengekspos antarmuka IKsPropertySet . Aplikasi menggunakan antarmuka ini untuk menentukan kategori pin. Pin biasanya mengembalikan PIN_CATEGORY_CAPTURE atau PIN_CATEGORY_PREVIEW. Untuk informasi selengkapnya, lihat Menyematkan Kumpulan Properti.

Contoh berikut menunjukkan cara mengimplementasikan IKsPropertySet untuk mengembalikan kategori pin pada pin pengambilan:

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

Menulis Filter Pengambilan