Freigeben über


Quell- und Zielrechtecke in Videorenderern

[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]

Es gibt drei Größen in der VIDEOINFO, VIDEOINFOHEADERund VIDEOINFOHEADER2 Formatstrukturen von Videomedientypen. In diesem Artikel wird erläutert, was sie sind und wie sie funktionieren.

Zunächst gibt es eine Größe im bmiHeader Mitglied dieser Strukturen. Das bmiHeader Member 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 gibt es ein Rechteck im rcTarget Mitglied dieser Strukturen.

Angenommen, Sie haben zwei Filter, A und B, und dass diese Filter miteinander verbunden sind (A auf der linken oder vorgelagerten Seite und B auf der rechten oder nachgeschalteten Seite) mit einem bestimmten Videomedientyp.

Die Puffer, die zwischen den Filtern A und B übergeben werden, weisen die Größe auf (bmiHeader.biWidth, bmiHeader.biHeight). Filter A sollte einen Teil seines Eingabevideos übernehmen, der durch rcSource- bestimmt wird, und dieses Video strecken, um den rcTarget- Teil des Puffers auszufüllen. Der teil des zu verwendenden Eingabevideos basiert darauf, wie rcSource mit dem (biWidth, biHeight) Größe des Medientyps vergleicht, mit dem A und B ursprünglich verbunden sind. Wenn rcSource- leer ist, verwendet Filter A sein gesamtes Eingabevideo. Wenn rcTarget- leer ist, füllt Filter A den gesamten Ausgabepuffer aus.

Angenommen, Filter A empfängt Videodaten mit einer Auflösung von 160 x 120 Pixeln. Gehen Sie auch davon aus, dass filter A mit filter B mit dem folgenden Medientyp verbunden ist.

  • (biWidth, biHeight): 320, 240
  • rcSource: (0, 0, 0, 0)
  • rcTarget: (0, 0, 0, 0)

Dies bedeutet, dass filter A das Video, das es empfängt, um 2 in die x- und y-Richtung ausdehnt und einen 320 x 240 Ausgabepuffer ausfüllt.

Gehen Sie als weiteres Beispiel davon aus, dass Filter A 160 x 120 Videodaten empfängt und dass sie mit dem Filter B mit dem folgenden Medientyp verbunden ist.

  • (biWidth, biHeight): 320, 240
  • rcSource: (0, 0, 160, 240)
  • rcTarget: (0, 0, 0, 0)

Das 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) und das Video auf eine Größe von (320, 240) (um 4 in x-Richtung und um 2 in der y-Richtung) und füllen den Ausgabepuffer 320 x 240.

Gehen Sie nun davon aus, dass ein Filter a-Aufrufe CBaseAllocator::GetBufferund das zurückgegebene Medienbeispiel über einen Medientyp verfügt, der anzeigt, dass Filter B filter A möchte, um eine andere Größe oder Art von Video bereitzustellen, als zuvor bereitgestellt wurde. Gehen Sie davon aus, dass der neue Medientyp wie folgt lautet:

  • (biWidth, biHeight): 640, 480
  • rcSource: (0, 0, 160, 120)
  • rcTarget: (0, 0, 80, 60)

Dies bedeutet, dass das Medienbeispiel einen Puffer mit einer Größe von 640 x 480 aufweist. Das element rcSource 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 640 x 480 Ausgabepuffers 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) Stück, die gleiche Größe der Ausgabebitmap, 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 ist durch die biWidth- und biHeight- des ursprünglichen verbundenen Medientyps zwischen den Filtern A und B gebunden, und rcTarget- wird durch die neue biWidth und biHeight des Medienbeispiels gebunden. Im vorherigen Beispiel konnte rcSource- nicht außerhalb der Grenzen von (0, 0, 320, 240) und rcTarget- nicht außerhalb der Grenzen von (0, 0, 640, 480) gehen.