Quell- und Zielrechtecke in Videorenderern
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]
Es gibt drei Größen in den Formatstrukturen VIDEOINFO, VIDEOINFOHEADER und VIDEOINFOHEADER2 von Videomedientypen. In diesem Artikel wird erläutert, was sie sind und wie sie funktionieren.
Erstens gibt es eine Größe im bmiHeader-Element dieser Strukturen. Das bmiHeader-Element ist eine BITMAPINFOHEADER-Struktur mit eigenen Breiten- und Höhenelementen , bmiHeader.biWidth und bmiHeader.biHeight.
Zweitens gibt es ein Rechteck im rcSource-Member dieser Strukturen; und schließlich befindet sich im rcTarget-Element dieser Strukturen ein Rechteck.
Angenommen, Sie verfügen über zwei Filter, A und B, und dass diese Filter mit einem bestimmten Videomedientyp miteinander verbunden sind (A links oder Upstream und B rechts oder nachgeschaltet).
Die Puffer, die zwischen den Filtern A und B übergeben werden, haben die Größe (bmiHeader.biWidth, bmiHeader.biHeight). Filter A sollte einen Teil des von rcSource ermittelten Eingabevideos nehmen und das Video so strecken, dass der rcTarget-Teil des Puffers gefüllt wird. Der zu verwendende Teil des Eingabevideos basiert darauf, wie rcSource mit der Größe (biWidth, biHeight) des Medientyps vergleicht, mit dem A und B ursprünglich verbunden sind. Wenn rcSource leer ist, verwendet Filter A das gesamte Eingabevideo. Wenn rcTarget leer ist, füllt Filter A den gesamten Ausgabepuffer aus.
Angenommen, Filter A empfängt Videodaten mit einer Größe von 160 x 120 Pixeln. Angenommen, Filter A ist mit filter B mit dem folgenden Medientyp verbunden.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 0, 0)
- rcTarget: (0, 0, 0, 0)
Dies bedeutet, dass Filter A das empfangene Video um 2 in x- und y-Richtung dehiert und einen Ausgabepuffer von 320 x 240 ausfüllt.
Angenommen, Filter A empfängt 160 x 120 Videodaten und ist mit filter B mit dem folgenden Medientyp verbunden.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 160, 240)
- rcTarget: (0, 0, 0, 0)
Das rcSource-Element ist relativ zur verbundenen Puffergröße von 320, 240. Da die angegebene rcSource (0, 0, 160, 240) ist die linke Hälfte des Puffers. Filter A nimmt die linke Hälfte des Eingabevideos oder den Teil (0, 0, 80, 120) und streckt das Video auf eine Größe von (320, 240) (um 4 in x-Richtung und um 2 in y-Richtung) und füllt den Ausgabepuffer von 320 x 240.
Angenommen, Filter A ruft CBaseAllocator::GetBuffer auf, und das zurückgegebene Medienbeispiel verfügt über einen Medientyp, der darauf hinweist, dass Filter B eine andere Größe oder Art von Video als zuvor bereitstellen möchte. Angenommen, der neue Medientyp lautet:
- (biWidth, biHeight): 640, 480
- rcSource: (0, 0, 160, 120)
- rcTarget: (0, 0, 80, 60)
Dies bedeutet, dass das Medienbeispiel über einen Puffer mit einer Größe von 640 x 480 verfügt. Das rcSource-Element ist relativ zum ursprünglichen verbundenen Medientyp (320, 240) und nicht zum neuen Medientyp von (640, 480), sodass rcSource angibt, dass die obere linke Ecke (25 %) des Eingabevideos verwendet werden soll. Dieser Teil des Eingabevideos wird oben links (80, 60) Pixel des Ausgabepuffers von 640 x 480 platziert, wie in rcTarget von (0, 0, 80, 60) angegeben. Da Filter A Videos mit einer Größe von 160 x 120 empfängt, ist die obere linke Ecke des Eingabevideos ein (80, 60) Stück, die gleiche Größe wie die Ausgabe-Bitmap, und es ist keine Dehnung erforderlich.
Filter A platziert keine Daten in den anderen Pixeln des Ausgabepuffers und lässt diese Bits unberührt. Das rcSource-Element wird durch biWidth und biHeight des ursprünglichen verbundenen Medientyps zwischen den Filtern A und B begrenzt, und rcTarget wird durch die neuen biWidth und biHeight des Medienbeispiels begrenzt. Im vorherigen Beispiel konnte rcSource die Grenzen von (0, 0, 320, 240) nicht überschreiten und rcTarget konnte die Grenzen von (0, 0, 640, 480) nicht überschreiten.