Quell- und Zielrechtecke in Videorenderern
Es gibt drei Größen in den Formatstrukturen VIDEOINFO, VIDEOINFOHEADERund VIDEOINFOHEADER2 von Videomedientypen. In diesem Artikel wird erläutert, was sie sind und wie sie funktionieren.
Erstens gibt es eine Größe im bmiHeader-Member dieser Strukturen. Der bmiHeader-Member ist eine BITMAPINFOHEADER-Struktur mit eigenen Breiten- und Höhenmembern, bmiHeader.biWidth und bmiHeader.biHeight.
Zweitens befindet sich ein Rechteck im rcSource-Member dieser Strukturen. und schließlich befindet sich ein Rechteck im rcTarget-Member dieser Strukturen.
Angenommen, Sie verfügen über zwei Filter, A und B, und dass diese Filter mit einem bestimmten Videomedientyp miteinander verbunden sind (A auf der linken Seite oder Upstream und B rechts oder downstream).
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 bestimmten Eingabevideos aufnehmen und dieses Video strecken, um den rcTarget-Teil des Puffers zu füllen. Der Teil des zu verwendenden 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.
Angenommen, Filter A empfängt Videodaten 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)
Das bedeutet, dass filter A das empfangene Video sowohl in x- als auch in y-Richtung um 2 streckt 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)
Der rcSource-Member 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) an 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 320 x 240 auf.
Angenommen, filter A ruft CBaseAllocator::GetBufferauf, und dem zurückgegebenen Medienbeispiel ist ein Medientyp angefügt. Dies deutet darauf hin, dass Filter B filter A eine andere Größe oder Art von Video bereitstellen soll als zuvor. 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. Der rcSource-Member ist relativ zum ursprünglichen verbundenen Medientyp (320, 240) und nicht zum neuen Medientyp von (640, 480), sodass rcSource angibt, dass die linke obere Ecke (25 %) des Eingabevideos verwendet werden soll. Dieser Teil des Eingabevideos wird links oben (80, 60) Pixel des Ausgabepuffers mit 640 x 480 platziert, wie durch rcTarget von (0, 0, 80, 60) angegeben. Da Filter A 160 x 120 Video empfängt, ist die obere linke Ecke des Eingabevideos ein (80, 60) Teil, der die gleiche Größe der Ausgabebitmap aufnimmt, und es ist kein Stretching erforderlich.
Filter A platzieren keine Daten in den anderen Pixeln des Ausgabepuffers und lassen diese Bits unverändert. Der rcSource-Member wird durch biWidth und biHeight des ursprünglichen verbundenen Medientyps zwischen den Filtern A und B begrenzt, und rcTarget wird durch die neue biWidth und biHeight des Medienbeispiels begrenzt. Im vorherigen Beispiel konnte rcSource nicht außerhalb der Grenzen von (0, 0, 320, 240) und rcTarget konnte die Grenzen von (0, 0, 640, 480) nicht überschreiten.