Condividi tramite


Chiamata di Deinterlace DDI da un componente User-Mode

Un componente in modalità utente, ad esempio vmR, avvia le chiamate all'DDI di deinterlacing.

In modo che vmR possa deinterlace ed eseguire la conversione della frequenza dei fotogrammi nel contenuto video, il driver di visualizzazione deve implementare le funzioni di callback di compensazione del movimento definite dai membri della struttura DD_MOTIONCOMPCALLBACKS .

Per semplificare lo sviluppo dei driver, i writer di driver possono usare un modello di codice di compensazione del movimento e implementare le funzioni di esempio di deinterlacing. Il modello di compensazione del movimento chiama le funzioni di esempio deinterlacing per eseguire la conversione deinterlacing e frame-rate nel contenuto video. Per altre informazioni sull'uso di un modello di compensazione del movimento, vedere Codice di esempio per dispositivi DirectX VA.

La procedura seguente illustra in che modo vmR avvia le chiamate all'DDI deinterlace:

  1. Quando vmR viene aggiunto a un grafico di filtro, avvia una chiamata alla funzione di callback DdMoCompGetGuids fornita dal driver per recuperare l'elenco di dispositivi supportati dal driver. Il membro GetMoCompGuids della struttura DD_MOTIONCOMPCALLBACKS punta a questa funzione di callback. Per altre informazioni su un grafico di filtro, vedere Architettura del minidriver KS.

  2. Se il GUID del dispositivo contenitore deinterlace è presente, vmR avvia una chiamata alla funzione di callback DdMoCompCreate per creare un'istanza del dispositivo. Il membro CreateMoComp di DD_MOTIONCOMPCALLBACKS punta alla funzione di callback. Nella chiamata DdMoCompCreate viene specificato un puntatore al GUID del dispositivo contenitore nel membro lpGuid della struttura DD_CREATEMOCOMPDATA . Il GUID del dispositivo contenitore è definito come segue:

    DEFINE_GUID(DXVA_DeinterlaceContainerDevice, 0x0e85cb93,0x3046,0x4ff0,0xae,0xcc,0xd5,0x8c,0xb5,0xf0,0x35,0xfd);
    
  3. Per determinare le modalità di conversione deinterlacing o frame-rate disponibili per un determinato formato video di input, vmR avvia una chiamata alla funzione di callback DdMoCompRender fornita dal driver. Il membro RenderMoComp di DD_MOTIONCOMPCALLBACKS punta alla funzione di callback. Nella chiamata DdMoCompRender la costante DXVA_ProcAmpControlQueryCapsFnCode (definita in dxva.h) viene impostata nel membro dwFunctiondella strutturaDD_RENDERMOCOMPDATA. Il membro lpInputData di DD_RENDERMOCOMPDATA passa i parametri di input al driver puntando a una struttura di DXVA_VideoDesc completata. Il driver restituisce l'output tramite il membro lpOutputData di DD_RENDERMOCOMPDATA; lpOutputData punta a una struttura DXVA_DeinterlaceQueryAvailableModes .

    Se il driver implementa una funzione di esempio DeinterlaceQueryAvailableModes , la funzione di callback DdMoCompRender chiama DeinterlaceQueryAvailableModes.

  4. Per ogni modalità deinterlace supportata dal driver, vmR avvia una chiamata alla funzione di callback DdMoCompRenderfornita dal driver. Nella chiamata DdMoCompRender la costante DXVA_DeinterlaceQueryModeCapsFnCode (definita in dxva.h) è impostata nel membro dwFunction di DD_RENDERMOCOMPDATA. Il membro lpInputData di DD_RENDERMOCOMPDATA passa i parametri di input al driver puntando a una struttura DXVA_DeinterlaceQueryModeCaps completata. Il driver restituisce l'output tramite il membro lpOutputData di DD_RENDERMOCOMPDATA; lpOutputData punta a una struttura DXVA_DeinterlaceCaps .

    Se il driver implementa una funzione di esempio DeinterlaceQueryModeCaps , la funzione di callback DdMoCompRender chiama DeinterlaceQueryModeCaps.

  5. Dopo che vmR ha determinato le funzionalità di deinterlacing di una particolare modalità deinterlace (ad esempio, bob deinterlacing), avvia una chiamata a DdMoCompCreate per creare un'istanza del dispositivo in modalità deinterlace (ad esempio, il dispositivo deinterlace bob). Nella chiamata DdMoCompCreate viene specificato un puntatore al GUID della modalità deinterlace nel membro lpGuid di DD_CREATEMOCOMPDATA. Il GUID del dispositivo deinterlace bob è definito come segue:

    DEFINE_GUID(DXVAp_DeinterlaceBobDevice, 0x335aa36e,0x7884,0x43a4,0x9c,0x91,0x7f,0x87,0xfa,0xf3,0xe3,0x7e);
    

    Se il driver implementa una funzione di esempio DeinterlaceOpenStream , la funzione di callback DdMoCompCreate chiama DeinterlaceOpenStream.

  6. Per ogni operazione di deinterlacing, vmR avvia una chiamata alla funzione di callback fornita dal driver DdMoCompRender . Nella chiamata DdMoCompRender la costante DXVA_ProcAmpControlQueryCapsFnCode (definita in dxva.h) viene impostata nel membro dwFunction di DD_RENDERMOCOMPDATA. Il membro lpBufferInfo di DD_RENDERMOCOMPDATA punta a una matrice di buffer che descrive la superficie di destinazione e ogni esempio di origine video di input. Il membro lpInputData di DD_RENDERMOCOMPDATA passa i parametri di input al driver puntando a una struttura DXVA_DeinterlaceBlt completata. Il driver non restituisce alcun output; ovvero, il membro lpOutputData di DD_RENDERMOCOMPDATA è NULL.

    Se il driver implementa una funzione di esempio DeinterlaceBlt , la funzione callback DdMoCompRender chiama DeinterlaceBlt.

  7. Per ogni operazione di composizione deinterlacing e sottostream, vmR in Microsoft Windows Server 2003 SP1 e versioni successive e Windows XP SP2 e versioni successive avvia una chiamata alla funzione di callback fornita dal driver DdMoCompRender . Nella chiamata DdMoCompRender la costante DXVA_DeinterlaceBltExFnCode (definita in dxva.h) è impostata nel membro dwFunction di DD_RENDERMOCOMPDATA. Il membro lpBufferInfo di DD_RENDERMOCOMPDATA punta a una matrice di buffer che descrive la superficie di destinazione e la superficie per ogni esempio di origine video di input. Il membro lpInputData di DD_RENDERMOCOMPDATA passa i parametri di input al driver puntando a una struttura DXVA_DeinterlaceBltEx completata. Il driver non restituisce alcun output; ovvero, il membro lpOutputData di DD_RENDERMOCOMPDATA è NULL.

    Se il driver implementa una funzione di esempio DeinterlaceBltEx , la funzione di callback DdMoCompRender chiama DeinterlaceBltEx.

  8. Quando vmR non deve più eseguire altre operazioni di deinterlace, viene chiamata la funzione di callback DdMoCompDestroy fornita dal driver. Il membro DestroyMoComp di DD_MOTIONCOMPCALLBACKS punta alla funzione di callback.

    Se il driver implementa una funzione di esempio DeinterlaceCloseStream , la funzione di callback DdMoCompDestroy chiama DeinterlaceCloseStream.

  9. Il driver rilascia quindi tutte le risorse usate dal dispositivo in modalità deinterlace.