Condividi tramite


Apertura e chiusura di un flusso

L'interfaccia della classe Stream invia una richiesta di SRB_OPEN_STREAM a un minidriver di classe Stream per aprire un flusso con il formato video selezionato. Le informazioni passate in SRB_OPEN_STREAM includono l'indice del flusso da aprire e un puntatore a un puntatore a una struttura KS_VIDEOINFOHEADER . L'indice di flusso corrisponde all'indice del flusso nella matrice di strutture KS_DATARANGE_VIDEO restituite dal minidriver in risposta a una richiesta di SRB_GET_STREAM_INFO precedente. Per altre informazioni sulla gestione delle SRB_GET_STREAM_INFO, vedere Categorie di flusso.

Il codice di esempio seguente ottiene l'indice di flusso, il formato dei dati di streaming del kernel e l'intestazione delle informazioni video di streaming del kernel.

int StreamNumber = pSrb->StreamObject->StreamNumber;
PKS_DATAFORMAT_VIDEOINFOHEADER  pKSDataFormat = 
    (PKS_DATAFORMAT_VIDEOINFOHEADER) pSrb->CommandData.OpenFormat;
PKS_VIDEOINFOHEADER pVideoInfoHdrRequested = 
    &pKSDataFormat->VideoInfoHeader;

I minidriver devono verificare che possano supportare il formato di flusso richiesto. In particolare, il contenuto della struttura di KS_BITMAPINFOHEADER deve essere verificato, insieme alle informazioni di ritaglio e ridimensionamento specificate dai membri rcSource e rcTarget .

Se l'hardware del dispositivo non supporta la frequenza dei fotogrammi di acquisizione richiesta nel membro AvgTimePerFrame di KS_VIDEOINFOHEADER, deve sempre selezionare la frequenza di fotogrammi inferiore successiva disponibile. Ad esempio, se una fotocamera può supportare una frequenza di fotogrammi di acquisizione di 7 fotogrammi al secondo (fps) e 15 fps e un'applicazione client tenta di aprire il flusso a una frequenza di fotogrammi di acquisizione di 10 fps, la fotocamera deve creare un flusso fisico a 7 fps.

Per un'acquisizione di dieci secondi in cui vengono acquisiti tutti i 70 fotogrammi fisici disponibili, il minidriver deve segnalare 100 fotogrammi acquisiti, 30 fotogrammi di cui sono stati eliminati dalla proprietà KSPROPERTY_DROPPEDFRAMES_CURRENT .

Le regole speciali si applicano quando il buffer di output è una superficie DirectDraw. In questo caso, il membro biWidth della struttura KS_BITMAPINFOHEADER rappresenta effettivamente lo stride della superficie DirectDraw di destinazione, che in genere è maggiore della larghezza dell'immagine video. Lo stride di una superficie è in genere la larghezza della superficie moltiplicata in base alla profondità di byte. Ad esempio, per una superficie a 640 pixel con una profondità di colore di 32 bit per pixel, lo stride sarà 2560 byte.

Per determinare la larghezza dell'immagine richiesta, usare l'esempio di codice seguente:

if (IsRectEmpty(&pVideoInfoHdrRequested->rcTarget) {
    Width =  pVideoInfoHdrRequested->bmiHeader.biWidth;
    Height = pVideoInfoHdrRequested->bmiHeader.biHeight;
} 
else {
    Width = pVideoInfoHdrRequested->rcTarget.right − 
            pVideoInfoHdrRequested->rcTarget.left;
    Height = pVideoInfoHdrRequested->rcTarget.bottom − 
             pVideoInfoHdrRequested->rcTarget.top;
}

L'interfaccia della classe Stream invia una richiesta di SRB_CLOSE_STREAM al minidriver per chiudere un flusso. Il minidriver deve quindi restituire tutti gli SRB di flusso in sospeso all'interfaccia della classe Stream.