Fornitura di un Allocator-Presenter personalizzato per VMR-9

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine 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, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Per usare un relatore allocatore personalizzato con il filtro Video Mixing Renderer 9 (VMR-9), seguire questa procedura:

  1. Implementare una classe che supporta le interfacce IVMRSurfaceAllocator9 e IVMRImagePresenter9 .

  2. Chiamare QueryInterface nel filtro VMR-9 per l'interfaccia IVMRFilterConfig9 .

  3. Chiamare il metodo IVMRFilterConfig9::SetRenderingMode e passare il flag di VMR9Mode_Renderless .

  4. QueryInterface nel filtro VMR-9 per l'interfaccia IVMRSurfaceAllocatorNotify9 .

  5. Chiamare il metodo IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator e passare un puntatore al metodo IVMRSurfaceAllocator9 dell'allocatore.

  6. Chiamare il metodo IVMRSurfaceAllocator9::AdviseNotify e passare un puntatore all'interfaccia IVMRSurfaceAllocatorNotify del filtro VMR-9 .

  7. Nell'implementazione di IVMRSurfaceAllocator9::AdviseNotify, chiamare IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass in un puntatore al dispositivo Direct3D e un handle per il monitor in cui verrà visualizzato il video.

  8. Nell'implementazione del metodo IVMRSurfaceAllocator9::InitializeDevice creare superfici Direct3D corrispondenti ai parametri specificati nel metodo InitializeDevice . Facoltativamente, è possibile usare il metodo IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper per allocare queste superfici. Archiviare i puntatori di superficie in una matrice.

    Nota

    Se si vuole che vmR-9 disegnare i fotogrammi video in una superficie di trama, aggiungere il flag di VMR9AllocFlag_TextureSurface alla struttura VMR9AllocationInfo . Se il dispositivo non supporta trame nel formato video nativo, potrebbe essere necessario creare una superficie di trama separata e quindi copiare i fotogrammi video dalla superficie video alla trama.

     

  9. Durante lo streaming, il metodo VMR-9 ottiene superfici dal relatore allocatore chiamando il metodo IVMRSurfaceAllocator9::GetSurface . VmR-9 specifica la superficie in base all'indice all'interno della matrice di superficie (passaggio 8).

  10. Presentare l'immagine quando il metodo VMR-9 chiama il metodo IVMRImagePresenter9::P resentImage . I parametri includono un puntatore alla superficie Direct3D contenente l'immagine video.

  11. Se il dispositivo Direct3D viene perso in qualsiasi momento, l'allocatore-relatore deve ripristinare il dispositivo e ricreare le superfici. Ad esempio, il dispositivo può essere perso se la modalità di visualizzazione cambia o l'utente sposta la finestra in un altro monitoraggio. Se il dispositivo Direct3D cambia, chiamare il metodo IVMRSurfaceAllocatorNotify9::ChangeD3DDevice .

  12. Quando lo streaming si arresta, il metodo VMR-9 chiama il metodo IVMRSurfaceAllocator9::TerminateDevice . L'allocatore-relatore deve rilasciare tutte le risorse Direct3D.

Esistono alcune differenze tra VMR-7 e VMR-9 nel modo in cui vengono gestiti gli allocatori personalizzati:

  • Il metodo AllocateSurfaceHelper del filtro VMR-9 è disponibile per il relatorere allocatore da usare durante l'allocazione delle superfici. Questo metodo rende non necessario che un relatorere di allocatore personalizzato inoltra le chiamate all'allocatore predefinito. Per questo motivo, il CLSID del filtro VMR-9 predefinito dell'allocatore-relatore non viene pubblicato.
  • A differenza di VMR-7, vmR-9 non fornisce uno speciale allocatore di modalità esclusiva DirectDraw. Il metodo IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper rende questo oggetto non necessario.
  • Per il video interlacciato, vmR-9 de-interlaccia sempre il video prima di presentare l'immagine. L'allocatore-relatore non è più responsabile della de-interlacciatura dell'immagine prima di visualizzarla.

Modalità di riproduzione senza rendering di VMR (relatori allocatori personalizzati)