2016-06-21 20 views
2

Grund zu verwenden, um benutzerdefinierte allocator in 3rd-Party-Filter zu verwenden:Force-3rd-Party-Directshow-Filter, um benutzerdefinierte allocator

ich ein NUMA-System haben, und mit Filter-Speicher auf den falschen NUMA-Knoten führt zu Leistungsproblem Aufteilung und Abwurf Bilder von der Kamera empfangen.

Mein aktueller Ansatz:

Ich werde schrieb eine Funktion, die alle Filter durchläuft und sie bitten, wenn ihre Eingangsstift eine allocator hat. Dann frage ich diesen Zuordner für meine spezielle Zuweisungsschnittstelle und schließlich, wenn die Schnittstelle nicht gefunden wird, erzeuge ich einen neuen benutzerdefinierten Zuordner und wende dieselben Eigenschaften an wie der vorherige Zuordner. Dann rufe ich auf dem Eingangspin an, um es über den neuen Zuordner zu informieren.

Ich habe versucht, diese Funktion zu verschiedenen Zeiten im Graphenaufbau aufzurufen; derzeit nach IMediaControl::Pause und direkt vor , aber mein benutzerdefinierter Zuordner wird von keinem Drittanbieterfilter verwendet. Die Beispiele befinden sich auf dem falschen NUMA-Knoten.

Zusätzlich verfolge ich auch die Threads, die während des Aufrufs IMediaControl::Pause erstellt wurden und ändere ihre Thread-Affinität zur richtigen CPU. Normalerweise sollten diese DirectShow-Filter den richtigen NUMA-Knoten haben, wie sie auf dem NUMA-Knoten ihrer laufenden CPU reservieren sollten.

Antwort

0

Sie können Zuweiser nicht mit überschreiben. Der Ausgangspin trifft eine Entscheidung über den zu verwendenden Zuordner, speichert intern einen Zeiger und benachrichtigt den Eingangspin. Sie können den Zuordner nicht extern ersetzen, zumindest nicht in dem Zustand, in dem die Pins angeschlossen sind.

Einige Filter sind auf ihre eigenen Zuweiser angewiesen und können einfach nicht mit anderen zusammenarbeiten. Es gibt keine generische Lösung für den Allocator-Austausch, spezifische Filter könnten durch die Tatsache ausgetrickst werden, dass der Ausgabe-Pin möglicherweise keine spezifischen Anforderungen für den Zuordner hat und den Peer-Eingabe-Pin anfordert, eine geeignete Instanz bereitzustellen.

+0

Ich habe das vermutet, aber wie kann sichergestellt werden, dass die Proben auf dem gleichen NUMA-Knoten sind? Die Zuweisungsschnittstellen oder die 'ALLOC_PROPERTIES' haben keine Optionen, um diese Art von Eigenschaft sicherzustellen. Vielleicht sollte ich mich mehr auf die Threading-Affinität konzentrieren, aber das ist keine 100% funktionierende Lösung –

+0

Ich bin nicht sicher, ob Sie das überhaupt mit bereits eingebauten Filtern, die nichts über NUMA wissen, zuverlässig erreichen können. Sie sollten mehr Optionen haben, die Sie tun, einen benutzerdefinierten Filter - Sie wählen natürlich den Zuordner dann haben Sie auch die Kontrolle über Threads, die Sie erstellen und Threads, die Sie weiter streamen. –

+0

Der 3rd-Party-Filter, über den wir sprechen, ist in diesem Fall ein Videokompressionsfilter. Der ursprüngliche Plan bestand also darin, den Benutzer aus installierten Komprimierungsfiltern auswählen zu lassen, anstatt einen benutzerdefinierten Komprimierungsfilter zu erstellen. Die einzige andere Lösung, die ich mir vorstellen kann, ist die Verarbeitung im Videospeicher. Aber ich müsste alles in MFT neu schreiben, wenn ich mich richtig erinnere. –