Condividi tramite


Uso dell'acquisizione WDDM in DirectShow

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questo argomento si applica a Windows Vista e versioni successive.

Alcune schede video hanno funzionalità integrate di acquisizione video. In queste schede, i fotogrammi video acquisiti vengono inseriti in memoria video (VRAM). Prima di Windows Vista, non c'era alcun meccanismo standard per l'elaborazione dei fotogrammi mentre rimanevano in VRAM. Al contrario, i dati devono essere copiati nella memoria di sistema, elaborati e quindi copiati nuovamente in VRAM per la visualizzazione. In Windows Vista DirectShow supporta ora un meccanismo per mantenere i fotogrammi video in VRAM in tutta la pipeline di elaborazione, dall'acquisizione alla visualizzazione.

Il filtro KsProxy determina se il driver supporta l'acquisizione della superficie VRAM eseguendo una query sul driver per la proprietà KSPROPERTY_PREFERRED_CAPTURE_SURFACE. Questa proprietà è documentata nella documentazione di Windows Driver Kit. Se il driver supporta l'acquisizione della superficie VRAM, KsProxy alloca un tipo speciale di campione multimediale che contiene un puntatore a una superficie Direct3D.

KsProxy determina quindi se il filtro downstream supporta DirectX Video Acceleration (DXVA) 2.0, come indicato di seguito:

  1. KsProxy esegue una query sul pin di input downstream per l'interfaccia IMFGetService .
  2. Se il pin espone IMFGetService, KsProxy chiama IMFGetService::GetService per l'interfaccia IDirect3DDeviceManager . L'identificatore del servizio è MR_VIDEO_ACCELERATION_SERVICE.

Entrambe queste interfacce sono documentate nella documentazione di Media Foundation SDK.

Se il filtro downstream non supporta DXVA 2.0, KsProxy alloca un buffer di memoria di sistema aggiuntivo. Usa questo buffer per copiare i fotogrammi video da VRAM alla memoria di sistema. Il metodo IMediaSample::GetPointer dell'esempio multimediale restituisce un puntatore a questo buffer di memoria di sistema.

Tuttavia, se il filtro downstream supporta DXVA 2.0, KsProxy non alloca un buffer di memoria di sistema. In tal caso, il metodo GetPointer restituisce E_NOTIMPL. Il filtro downstream dovrebbe invece accedere direttamente alla superficie Direct3D dell'esempio. Esistono due modi per il filtro downstream per ottenere un puntatore alla superficie, entrambi equivalenti:

  • Eseguire una query sull'esempio per l'interfaccia IMFGetService e chiamare GetService per l'interfaccia IDirect3DSurface9 . L'identificatore del servizio è MR_BUFFER_SERVICE.
  • Eseguire una query sull'esempio per l'interfaccia IMediaSample2Config e chiamare IMediaSample2Config::GetSurface.

Argomenti relativi all'acquisizione avanzata