Behandeln von Formatänderungen aus dem Videorenderer

[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.]

In diesem Abschnitt wird beschrieben, wie ein Decoder- oder Transformationsfilter Formatänderungen aus dem Videorenderer behandeln soll.

Videorendererfilter

Wenn der alte Videorenderer-Filter eine Verbindung herstellt, ist ein RGB-Format erforderlich, das dem Anzeigeformat des primären Monitors entspricht. Dadurch kann GDI zum Rendern verwendet werden, wenn DirectDraw nicht verfügbar ist. Wenn die Wiedergabe gestartet wird, wechselt der Video-Renderer möglicherweise zu einem DirectDraw-kompatiblen Format. Um zu ermitteln, ob der Upstream-Filter das neue Format unterstützen kann, ruft der Videorenderer IPin::QueryAccept am Ausgabepin des Upstream-Filters auf. Wenn der Upstream-Filter das neue Format akzeptiert, gibt die QueryAccept-Methode S_OK zurück. Der Videorenderer wechselt formate, indem ein Medientyp mit dem neuen Format an das nächste Medienbeispiel angefügt wird, das vom Zugehörigen zurückgegeben wird. Der Upstream-Filter sollte auf Formatänderungen überprüfen, indem IMediaSample::GetMediaType für jedes Beispiel aufgerufen wird. Der Videorenderer kann während des Streamings jederzeit zwischen dem ursprünglichen Format und dem neuen Format hin- und herwechseln. QueryAccept wird nach der ersten Formatänderung nicht aufgerufen. Sobald der Upstream Filter das neue Format akzeptiert hat, muss er in der Lage sein, hin und her zu wechseln.

Der Upstream-Filter kann die Formatänderung ablehnen, indem S_FALSE von QueryAccept zurückgegeben wird. In diesem Fall verwendet der Videorenderer weiterhin GDI mit dem ursprünglichen Format.

Videomisch-Rendererfilter

Der Video mixing Renderer-Filter (VMR-7 und VMR-9) stellt eine Verbindung mit jedem Format her, das von der Grafikhardware des Systems unterstützt wird. VmR-7 verwendet immer DirectDraw zum Rendern und ordnet die zugrunde liegenden DirectDraw-Oberflächen zu, wenn der Upstream-Filter eine Verbindung herstellt. VMR-9 verwendet immer Direct3D zum Rendern und ordnet die zugrunde liegenden Direct3D-Oberflächen zu, wenn der Upstream-Filter eine Verbindung herstellt.

Die Grafikhardware erfordert möglicherweise einen größeren Oberflächenschritt als die Bildbreite. In diesem Fall fordert der VMR ein neues Format an, indem QueryAccept aufgerufen wird. Es meldet die Oberflächenstride im biWidth-Member des BITMAPINFOHEADER im Videoformat. Wenn der Upstream-Filter nicht S_OK aus QueryAccept zurückgibt, lehnt der VMR das Format ab und versucht, eine Verbindung mit dem nächsten Format herzustellen, das vom Upstream-Filter angekündigt wird. Der VMR fügt den Medientyp mit dem neuen Format an das erste Medienbeispiel an. Nach dem ersten Beispiel bleibt das Format konstant. Der VMR wechselt während der Ausführung des Diagramms nicht zu formatieren.

Erweitertes Videorendering (EVR)

Der EVR verwendet immer Direct3D zum Rendern. Wenn ein größerer Oberflächenschritt erforderlich ist, verwendet der EVR denselben QueryAccept-Mechanismus wie der VMR.

QueryAccept (Upstream)