Rettangoli di origine e destinazione nei renderer video
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Sono disponibili tre dimensioni nelle strutture di formato VIDEOINFO,VIDEOINFOHEADER e VIDEOINFOHEADER2 di tipi di supporti video. Questo articolo illustra cosa sono e come funzionano.
Prima di tutto, esiste una dimensione nel membro bmiHeader di queste strutture. Il membro bmiHeader è una struttura BITMAPINFOHEADER con i propri membri di larghezza e altezza, bmiHeader.biWidth e bmiHeader.biHeight.
In secondo luogo, c'è un rettangolo nel membro rcSource di queste strutture; e infine, c'è un rettangolo nel membro rcTarget di queste strutture.
Si supponga di avere due filtri, A e B e che questi filtri siano connessi tra loro (A a sinistra, o upstream, e B a destra o downstream) con un determinato tipo di supporto video.
I buffer che passano tra filtri A e B hanno le dimensioni (bmiHeader.biWidth, bmiHeader.biHeight). Filtro A deve prendere una parte del video di input determinato da rcSource e estendere tale video per riempire la parte rcTarget del buffer. La parte del video di input da usare è basata sulla modalità di confronto tra rcSource e le dimensioni (biWidth, biHeight) del tipo di supporto che filtra A e B originariamente connesse. Se rcSource è vuoto, il filtro A usa l'intero video di input. Se rcTarget è vuoto, il filtro A riempie l'intero buffer di output.
Si supponga, ad esempio, che il filtro A riceva dati video di 160 x 120 pixel. Si supponga anche che il filtro A sia connesso al filtro B con il tipo di supporto seguente.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 0, 0, 0)
- rcTarget: (0, 0, 0, 0, 0)
Ciò significa che il filtro A estenderà il video ricevuto da 2 nelle direzioni x e y e riempirà un buffer di output di 320 x 240.
Come un altro esempio, si supponga che il filtro A riceva dati video da 160 x 120 e che sia connesso al filtro B con il tipo di supporto seguente.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 160, 240)
- rcTarget: (0, 0, 0, 0, 0)
Il membro rcSource è relativo alla dimensione del buffer connesso pari a 320, 240. Poiché rcSource specificato (0, 0, 160, 240) è la metà sinistra del buffer, il filtro A porterà la metà sinistra del video di input o la parte (0, 0, 80, 120) e estende il video a una dimensione di (320, 240) (da 4 nella direzione x e da 2 nella direzione y) e riempiendo il buffer di output 320 x 240.
Si supponga ora che il filtro A chiami CBaseAllocator::GetBuffer e che l'esempio multimediale restituito abbia un tipo di supporto collegato a esso, firmando che il filtro B vuole filtrare A per fornire una dimensione o un tipo di video diverso rispetto a quello fornito in precedenza. Si supponga che il nuovo tipo di supporto sia:
- (biWidth, biHeight): 640, 480
- rcSource: (0, 0, 160, 120)
- rcTarget: (0, 0, 80, 60)
Ciò significa che l'esempio multimediale ha un buffer pari a 640 x 480 dimensioni. Il membro rcSource è relativo al tipo di supporto connesso originale (320, 240) non al nuovo tipo di supporto (640, 480), quindi rcSource specifica che l'angolo superiore sinistro (25%) del video di input deve essere usato. Questa parte del video di input viene posizionata nella parte superiore sinistra (80, 60) pixel del buffer di output 640 x 480, come specificato da rcTarget di (0, 0, 80, 60). Poiché il filtro A riceve 160 x 120 video, l'angolo superiore sinistro del video di input è un pezzo (80, 60) , la stessa dimensione della bitmap di output e non è necessaria alcuna estensione.
Filtro A non inserisce dati negli altri pixel del buffer di output e lascerà tali bit non toccati. Il membro rcSource è associato dal biWidth e biHeight del tipo di supporto connesso originale tra filtri A e B e rcTarget viene associato dal nuovo biWidth e biHeight dell'esempio multimediale. Nell'esempio precedente, rcSource non è riuscito a uscire dai limiti di (0, 0, 320, 240) e rcTarget non poteva uscire dai limiti di (0, 0, 640, 480).