Puntatori di flusso perimetrali iniziali e finali
Per impostazione predefinita, ogni coda AVStream contiene un puntatore di flusso perimetrale principale . Il bordo principale punta a nuovi fotogrammi quando arrivano nella coda. In particolare, il bordo principale punta inizialmente al primo frame per arrivare nella coda e non si sposta fino a quando il minidriver lo sposta. AVStream crea il bordo principale, che esiste quindi per la durata della coda. I minidriver possono modificare il bordo principale usando le funzioni fornite da Microsoft.
Quando un nuovo frame arriva in una coda, AVStream imposta il bordo principale per puntare a questo frame, purché il bordo principale non punti già a un frame.
Per ottenere un puntatore al puntatore del flusso perimetrale principale, il minidriver chiama KsPinGetLeadingEdgeStreamPointer.
Il minidriver è responsabile dell'avanzamento del bordo iniziale in tutte le due situazioni, ma le due situazioni riepilogate nella tabella seguente.
Situazione | Comportamento di AVStream |
---|---|
Un frame arriva in una coda precedentemente vuota. |
AVStream imposta il bordo principale per puntare a questo frame. |
Il bordo principale punta a una cornice. L'IRP corrispondente a questo frame viene annullato. |
AVStream avanza il bordo principale. Il bordo principale punta ora a un telaio più recente. |
Per altre informazioni sull'avanzamento dei puntatori di flusso, vedere Introduzione ai puntatori di flusso .
Specifica di un puntatore di flusso perimetrale finale
I minidriver possono specificare che una coda dispone di un puntatore di flusso perimetrale finale. Il bordo finale indica in genere la cornice più antica di interesse per il minidriver. Per specificare un bordo finale, impostare il flag KSPIN_FLAG_DISTINCT_TRAILING_EDGE nel membro Flag della struttura di KSPIN_DESCRIPTOR_EX pertinente. Chiamare quindi KsPinGetTrailingEdgeStreamPointer per ottenere un puntatore al puntatore del flusso perimetrale finale.
Quando il bordo finale avanza, il conteggio dei riferimenti sulla cornice a cui puntava in precedenza scende a zero e il fotogramma viene completato. Se il frame è l'ultimo contenuto all'interno del relativo IRP, un pin sink completa l'IRP al chiamante; un pin di origine invia l'IRP al pin a cui è connesso.
Gestione di una finestra frame
Come risultato delle regole di conteggio dei riferimenti al frame descritte in Introduzione ai puntatori di flusso, un frame tra il bordo iniziale e finale rimane nella coda fino a quando non viene annullato, anche se il frame non viene fatto riferimento a un puntatore di flusso. Di conseguenza, un minidriver può usare i puntatori perimetrali iniziali e finali per mantenere una finestra di lavoro di più fotogrammi contigui. I fotogrammi nella finestra potrebbero attendere l'elaborazione o il riempimento, ad esempio.
Nel diagramma seguente, i fotogrammi meno recenti si trovano nella parte inferiore. I nuovi fotogrammi arrivano nella parte superiore. Il numero in ogni frame è il conteggio dei riferimenti per tale cornice. Quando i puntatori di flusso avanzano, si spostano verso l'alto in questo diagramma.
La coda più a sinistra mostra come il minidriver può usare un bordo finale per creare un set di fotogrammi di lavoro. Ogni fotogramma tra il bordo iniziale e finale ha un conteggio di riferimento di uno nonostante il fatto che nessun puntatore di flusso fa riferimento a questi fotogrammi.
La coda centrale è un esempio di clonazione dei puntatori di flusso. Il driver ha ripetutamente clonato e quindi avanzato il bordo principale, come descritto nei passaggi del processo di aggiunta in AVStream DMA Services.
La coda più a destra mostra come il minidriver può mantenere il conteggio dei riferimenti per un frame dietro il bordo finale usando un clone del puntatore di flusso.