Condividi tramite


Fornitura di un Allocator-Presenter personalizzato per VMR-9

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft raccomanda vivamente di utilizzare nuovi codici con MediaPlayer, IMFMediaEngine e Acquisizione audio/video mediante 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.

Per usare un allocatore-relatore 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 sul filtro VMR-9 per l'interfaccia IVMRFilterConfig9.

  3. Chiamare il metodo IVMRFilterConfig9::SetRenderingMode e passare il flag 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 di allocator-presenter .

  6. Chiamare il metodo IVMRSurfaceAllocator9::AdviseNotify del proprio allocatore-presentatore e passare un puntatore all'interfacciadel filtro VMR-9IVMRSurfaceAllocatorNotify9.

  7. Nella tua implementazione di IVMRSurfaceAllocator9::AdviseNotify, chiama IVMRSurfaceAllocatorNotify9::SetD3DDevice. Passa un puntatore al dispositivo Direct3D e un handle al monitor dove apparirà il video.

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

    Nota

    Se si vuole che VMR-9 disegni i fotogrammi video su una superficie texture, aggiungere il flag VMR9AllocFlag_TextureSurface alla struttura VMR9AllocationInfo. Se il dispositivo non supporta le 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, VMR-9 ottiene le superfici dall'allocatore-presentatore chiamando il metodo IVMRSurfaceAllocator9::GetSurface. VMR-9 specifica la superficie in base al relativo indice all'interno della matrice di superficie (passaggio 8).

  10. Presenta l'immagine quando VMR-9 chiama il metodo IVMRImagePresenter9::PresentImage. I parametri includono un puntatore alla superficie Direct3D che contiene 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ò andare perso se la modalità di visualizzazione cambia o l'utente sposta la finestra in un altro monitor. Se il dispositivo Direct3D cambia, chiamare il metodo IVMRSurfaceAllocatorNotify9::ChangeD3DDevice del filtro VMR-9.

  12. Quando lo streaming si arresta, VMR-9 chiama il metodo IVMRSurfaceAllocator9::TerminateDevice. Il componente allocator-presenter deve rilasciare tutte le sue risorse Direct3D.

Esistono alcune differenze tra VMR-7 e VMR-9 nel modo in cui vengono gestiti gli allocator presenter personalizzati.

  • Il metodo AllocateSurfaceHelper del filtro VMR-9 è disponibile per il presentatore-allocatore da usare quando si allocano le superfici. Questo metodo elimina la necessità per un allocatore personalizzato di inoltrare qualsiasi chiamata all'allocatore-presenter predefinito. Per questo motivo, il CLSID del presentatore allocatore del filtro VMR-9 predefinito non viene pubblicato.
  • A differenza di VMR-7, il VMR-9 non fornisce uno speciale allocatore-presenter della 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-presentatore non è più responsabile della deinterlacciatura dell'immagine prima di visualizzarla.

Modalità di Riproduzione Senza Rendering VMR (Allocator-PresentersPersonalizzata)