Rectangles source et cible dans les convertisseurs vidéo
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
Il existe trois tailles dans les structures de format VIDEOINFO, VIDEOINFOHEADER et VIDEOINFOHEADER2 des types de médias vidéo. Cet article explique ce qu’ils sont et comment ils fonctionnent.
Tout d’abord, il existe une taille dans le membre bmiHeader de ces structures. Le membre bmiHeader est une structure BITMAPINFOHEADER avec ses propres membres de largeur et de hauteur, bmiHeader.biWidth et bmiHeader.biHeight.
Deuxièmement, il existe un rectangle dans le membre rcSource de ces structures ; enfin, il existe un rectangle dans le membre rcTarget de ces structures.
Supposons que vous avez deux filtres, A et B, et que ces filtres sont connectés l’un à l’autre (A à gauche, ou amont, et B à droite ou en aval) avec un certain type de média vidéo.
Les tampons qui passent entre les filtres A et B ont la taille (bmiHeader.biWidth, bmiHeader.biHeight). Le filtre A doit prendre une partie de sa vidéo d’entrée déterminée par rcSource et étendre cette vidéo pour remplir la partie rcTarget de la mémoire tampon. La partie de la vidéo d’entrée à utiliser est basée sur la façon dont rcSource se compare à la taille (biWidth, biHeight) du type de média avec lequel filtre A et B initialement connecté. Si rcSource est vide, le filtre A utilise l’intégralité de sa vidéo d’entrée. Si rcTarget est vide, le filtre A remplit la mémoire tampon de sortie entière.
Par exemple, supposons que le filtre A reçoit des données vidéo de 160 x 120 pixels. Supposons également que le filtre A soit connecté au filtre B avec le type de média suivant.
- (biWidth, biHeight) : 320, 240
- rcSource : (0, 0, 0, 0)
- rcTarget : (0, 0, 0, 0)
Cela signifie que le filtre A étend la vidéo qu’il reçoit de 2 dans les directions x et y, et remplira une mémoire tampon de sortie de 320 x 240.
Par exemple, supposons que le filtre A reçoit 160 x 120 données vidéo et qu’il soit connecté au filtre B avec le type de média suivant.
- (biWidth, biHeight) : 320, 240
- rcSource : (0, 0, 160, 240)
- rcTarget : (0, 0, 0, 0)
Le membre rcSource est relatif à la taille de mémoire tampon connectée de 320, 240. Parce que le rcSource spécifié (0, 0, 160, 240) est la moitié gauche de la mémoire tampon, le filtre A prend la moitié gauche de sa vidéo d’entrée, ou la partie (0, 0, 80, 120) et étire la vidéo à une taille de (320, 240) (par 4 dans le sens x, et par 2 dans le sens y) et en remplissant la mémoire tampon de sortie 320 x 240.
Supposons maintenant que le filtre A appelle CBaseAllocator::GetBuffer, et que l’exemple multimédia retourné a un type de média attaché à celui-ci, ce qui signifie que le filtre B veut filtrer A pour fournir une taille ou un type de vidéo différent de celui fourni précédemment. Supposons que le nouveau type de média est :
- (biWidth, biHeight) : 640, 480
- rcSource : (0, 0, 160, 120)
- rcTarget : (0, 0, 80, 60)
Cela signifie que l’exemple multimédia a une mémoire tampon de 640 x 480. Le membre rcSource est relatif au type de média connecté d’origine (320, 240) et non au nouveau type de média de (640, 480), de sorte que rcSource spécifie que le coin supérieur gauche (25 %) de la vidéo d’entrée doit être utilisé. Cette partie de la vidéo d’entrée est placée en haut à gauche (80, 60) pixels de la mémoire tampon de sortie de 640 x 480, comme spécifié par rcTarget de (0, 0, 80, 60). Étant donné que le filtre A reçoit 160 x 120 vidéos, le coin supérieur gauche de la vidéo d’entrée est une pièce (80, 60), la même taille que l’image bitmap de sortie et aucun étirement n’est requis.
Le filtre A ne place aucune donnée dans les autres pixels de la mémoire tampon de sortie et laisse ces bits intacts. Le membre rcSource est limité par le biWidth et le biHeight du type de média connecté d’origine entre les filtres A et B, et rcTarget est limité par les nouveaux biWidth et biHeight de l’exemple multimédia. Dans l’exemple précédent, rcSource ne pouvait pas sortir des limites de (0, 0, 320, 240) et rcTarget ne pouvait pas sortir des limites de (0, 0, 640, 480).