Condividi tramite


Proprietà di acquisizione VRAM

Un minidriver AVStream incentrato sul pin deve supportare diverse proprietà per consentire l'acquisizione in VRAM. Questa sezione descrive la sequenza di richieste ricevute dal minidriver prima e durante l'elaborazione VRAM.

Prima dell'avvio dell'acquisizione, il proxy KS invia una richiesta get-property KSPROPERTY_PREFERRED_CAPTURE_SURFACE . Il minidriver deve restituire valori diversi a seconda che il driver acquisisca nella memoria di sistema o nella VRAM.

Acquisizione nella memoria di sistema

Per acquisire la memoria di sistema, restituire KS_CAPTURE_ALLOC_SYSTEM_AGP.

Il driver di acquisizione riceve quindi una KSPROPERTY_CURRENT_CAPTURE_SURFACE richiesta di proprietà set con un tipo di valore di memoria di sistema. Il driver di acquisizione funge ora da dispositivo DMA master del bus e inserisce i dati direttamente nella memoria di sistema.

In questa modalità, il driver di acquisizione riceve buffer di memoria di sistema nella funzione di callback AVStrMiniPinProcess del pin di output.

Per informazioni su come implementare DMA nel callback del processo di pin, vedere DMA basato su pacchetti in AVStream.

Per acquisire con più pin di output (ad esempio, pin video, audio e VBI separati), ogni pin deve supportare le proprietà della VRAM e l'elaborazione come descritto in precedenza. Il proxy genera un thread separato per ogni pin.

Acquisizione in VRAM

Se il driver supporta l'acquisizione VRAM, restituire KS_CAPTURE_ALLOC_VRAM in risposta a KSPROPERTY_PREFERRED_CAPTURE_SURFACE.

Il minidriver riceve quindi una richiesta di KSPROPERTY_DISPLAY_ADAPTER_GUID get-property, che esegue una query per il GUID dell'adattatore di visualizzazione.

Ottenere il GUID dell'adattatore dal driver miniport grafico fornito dal fornitore. La struttura DXGK_INTERFACESPECIFICDATA contiene il GUID dell'adattatore da restituire nella richiesta di proprietà. Questa struttura viene generata dal sottosistema DXGK (DirectX Graphics Kernel) e viene passata al driver miniport quando l'adattatore viene inizializzato.

Se il pin supporta il trasporto VRAM e i GUID della scheda di visualizzazione e del filtro downstream corrispondono, il modulo proxy KS viene selezionato come allocatore. Il proxy notifica al pin di acquisizione la selezione del trasporto di superficie VRAM tra i pin impostando la proprietà KSPROPERTY_CURRENT_CAPTURE_SURFACE con il tipo di superficie selezionato per l'acquisizione.

Se il pin riceve KS_CAPTURE_ALLOC_VRAM, riceverà le richieste di elaborazione VRAM.

Le richieste di elaborazione VRAM sono costituite da due parti. Prima di tutto, il driver di acquisizione riceve una richiesta get di KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. Il gestore get riceve un IRP che contiene l'handle di superficie VRAM in modalità kernel.

Il driver di acquisizione o il driver miniport di visualizzazione deve eseguire il mapping dell'handle di superficie VRAM a un indirizzo fisico VRAM effettivo. L'handle di superficie VRAM non rimane valido. Non memorizzarlo nella cache per un uso successivo.

Restituisce l'indirizzo mappato nel VRAM_SURFACE_INFO_PROPERTY_S fornito nella richiesta di proprietà. Il driver di acquisizione può emettere un IOCTL per richiedere il mapping dal driver miniport di visualizzazione.

In secondo luogo, il metodo AVStrMiniPinProcess del filtro di acquisizione viene chiamato quando un pin contiene dati da elaborare.

Il minidriver dovrebbe ora chiamare KsPinGetLeadingEdgeStreamPointer per acquisire e bloccare il puntatore del flusso perimetrale iniziale per questo pin. Questa funzione restituisce un puntatore a una struttura KSSTREAM_POINTER .

Questa struttura del puntatore di flusso contiene un puntatore a un KSSTREAM_HEADER.

Nel membro Dati dell'intestazione del flusso trovare un puntatore a una struttura VRAM_SURFACE_INFO .

Questa struttura contiene l'indirizzo fisico restituito in risposta a KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. Il membro hSurface che rappresenta l'handle è NULL.

Il driver di acquisizione deve:

  • Programmare l'hardware di acquisizione con l'indirizzo fisico VRAM.

  • Gestire il completamento dei fotogrammi video.

  • Compilare il membro cbCaptured di VRAM_SURFACE_INFO con il numero di byte copiati nella superficie VRAM. Non impostare il membro DataUsed di KSSTREAM_HEADER con il numero di byte acquisiti. Impostare invece DataUsed su sizeof(VRAM_SURFACE_INFO).

  • Se il driver di acquisizione esegue il timestamp, imposta PresentationTime, Duration e, se pertinente, OptionsFlags in KSSTREAM_HEADER.

  • Chiamare KsStreamPointerAdvanceOffsets per continuare l'elaborazione o eliminare tutti i cloni e completare la richiesta chiamando KsStreamPointerDelete.

Il metodo CCapturePin::P rocessD3DSurface nel file Capture.cpp nell'esempio AVSHwS (AVSHwS) di AVStream Simulated Hardware Driver Driver Kit (WDK) mostra un modo per implementare questo callback per il supporto VRAM.