DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von NicTheQuick »

Hoto hat geschrieben:Bisherige Lösungsansätze

1. dem Speicherbereich einen BMP Header voran stellen, so dass das Bild direkt mit CatchImage() geladen und mit ResizeImage() verkleinert werden kann.
Vergiss das. Viel zu langsam.
2. die Bilddaten direkt in den Speicherbereich eines PB Images speichern. Ob das aber besser oder gar schnell ist ohne die Daten erst umordnen zu müssen damit die Subpixel Reihenfolge passt?

3. die Daten direkt auszulesen und per Formeln verkleinern, ist da ein ResizeImage() aber nicht eindeutig schneller?
Alles, was mit 2DDrawing zu tun hat, kannst du hier vergessen.
4. mir noch mal die Desktop Duplication API anzuschauen, ob die Daten nicht zuerst im Grafikkartenspeicher landen und es möglich wäre sie dort zu verkleinern. Eine Grafikkarte kann das nun mal am schnellsten.
Am besten resized du das Bild schon im C++-Code mit der entsprechenden DirectX-API. Es ist ja nicht nur so, dass das Bild allein schon 32 MB hat, es wird ja auch noch mindestens 30 mal pro Sekunde aktualisiert. Da fließen also fast 1 GB/s durch die Leitungen. Damit belastest du dein System schon stark genug. Es soll ja schließlich auch noch andere Dinge tun. Und stetig 1GB/s vom Grafikkartenspeicher in den Arbeitsspeicher zu transferieren kann nicht die Lösung sein. Du musst die Grafikkarte die Arbeit des Verkleinerns machen lassen, nicht die CPU. Und ich fürchte dafür musst du an C++ ran.
Aktuell letzte Gedanken dazu

Mit 1. hatte ich bereits angefangen, bevor mir die restlichen Ideen kamen als ich schon im Halbschlaf war, daher muss ich mich in die Punkte noch einlesen. Vor allem 4. klingt für mich nach der eigentlich besten Lösung, allerdings müsste ich mich dann mit C++ erst mal rumschlagen, das ich gerade so halbwegs lesen kann, aber wenn ich schon mal VS C++ 2013 installiert habe... die MIT Lizenz der DXGCap.dll ließe das jedenfalls zu.

Wie würdet ihr es machen? Hab ich noch eine Methode übersehen?
Ups, ich hätte mal vorher lesen sollen, was du unten schreibst. ;-)
Bild
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von Hoto »

Naja, Resizeimage im RAW Format, was eigentlich auch langt (muss mal meine Ansprüche reduzieren) schafft das sehr schnell. QueryPerformanceCounter_() spuckt da ~9800 aus, aber wehe ich nutze Smooth... dann sind es gleich ~430300 (~110ms). XD

Aber gut, ich sollte wohl dazu sagen, dass ich einen i7 8700K @4,8Ghz nutze. XD

Da ist wohl eher der Zwischenschritt das kritische, außer ich könnte die Daten direkt in den Image Speicher kopieren.

Aber 4. ist und bleibt die beste Lösung... wenn da C++ nicht wäre... :freak:

Ohne irgendwelche Beispielcodes zusammen frickeln und mit dem Holzhammer oben drauf wird das nichts...
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von Helle »

Warum werden nicht die Daten in buf direkt genutzt? Alpha weg und für RGB einen Mittelwert bilden für die "zuständige Außen-LED". Mittelwert z.B.: Als LED-Kette habe ich einen WS2801-Strang. LED-Abstand ca. 31 mm. Für meinen 24"-Monitor habe ich dann oben/unten jeweils Platz für 16 LEDs (links und rechts wird aufgefüllt mit vertikaler Kette). Meine Monitor-Auflösung ist 1920*1080; links und rechts etwas weg ergibt horizontal 1600. Wären also (immer für mein Beispiel!) 100 horizontale Pixel pro LED. Für die vertikale Auswertung würde ich dann auch 100 Pixel nehmen. Ich verstehe Ambilight als Erweiterung des Bildschirms; was in der Mitte ist tuts nichts zur Sache. Also aus buf 100*100 Pixel auslesen und den Mittelwert an die entsprechende LED senden. Wobei ich der Meinung bin, das Auslesen jedes (z.B.) 4.Pixels reicht aus.
Das Repeat: ... Until PeekS(*buf) ist natürlich pure Verzweiflung, ist so aber auch erstmal notwendig. Um das wegzukriegen dachte ich "init" (ist auch eine Funktion der Lib) wäre eine Idee; war aber leider wirkungslos. Abhilfe schuf bei mir ein Delay(100) nach "get_output_dimensions(*dxgi_manager,@Width,@Height)". Wird ja nur einmal aufgerufen.
Zur Ansteuerung der WS2801-Kette nutze ich übrigens einen FTDI UM232H; lässt sich mit PB prima programmieren.
Das Ganze muß ich bei Gelegenheit mal ausprobieren...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von NicTheQuick »

@helle: So hätte ich es auch gemacht.

Mal ne blöde Frage: Kann man mit dieser API jeden Film mitschneiden, auch die mit HDCP-Verschlüsselung? Dann wäre es voll einfach diese geschützten Inhalte einfach zu rippen und ohne DRM-Schutz wieder zu speichern.
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von ccode_new »

Auch mal ne doofe Frage: Was hat das mit "HDCP-Verschlüsselung" zu tun ?

Nichts! Oder ?

Kopieren - Auf dem selben Gerät ?
(ohne Streaming-Verschlüsselung: Vielleicht!)

Über HDMI/DVI ????

Anbei:
Nur um Bildschirmvideos/Screenshots zu machen finde ich z.B. "ffmpeg "ganz nett.

https://trac.ffmpeg.org/wiki/Capture/Desktop
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von NicTheQuick »

ccode_new hat geschrieben:Auch mal ne doofe Frage: Was hat das mit "HDCP-Verschlüsselung" zu tun ?
Ganz einfach. Ich kann zum Beispiel unter Linux mit Amazon Prime keine Videos in FullHD gucken, weil Linux (noch) keine Möglichkeit anbietet den Videostream von der Quelle bis zum Monitor/Fernseher verschlüsselt zu übertragen. Das heißt mit einem einfachen Screencapture kann ich das innerhalb Amazon Video abgespielte Video einfach rippen. Und deswegen darf ich kein FullHD abspielen (was ich übrigens eine Frechheit finde). Unter Windows soll das angeblich nicht gehen, weil der Videostream quasi ab dem Browser heraus geschützt sein soll und erst wieder im Monitor/Fernseher entschlüsselt wird. Somit dürfte die Desktop Duplication API auch nicht funktionieren. Falls doch wäre das ja eine schöne Sicherheitslücke und ich würde mich fragen, warum es die Begrenzung unter Linux überhaupt gibt.
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von ccode_new »

Ganz einfach. Ich kann zum Beispiel unter Linux mit Amazon Prime keine Videos in FullHD gucken, weil Linux (noch) keine Möglichkeit anbietet den Videostream von der Quelle bis zum Monitor/Fernseher verschlüsselt zu übertragen. Das heißt mit einem einfachen Screencapture kann ich das innerhalb Amazon Video abgespielte Video einfach rippen. Und deswegen darf ich kein FullHD abspielen (was ich übrigens eine Frechheit finde). Unter Windows soll das angeblich nicht gehen, weil der Videostream quasi ab dem Browser heraus geschützt sein soll und erst wieder im Monitor/Fernseher entschlüsselt wird. Somit dürfte die Desktop Duplication API auch nicht funktionieren. Falls doch wäre das ja eine schöne Sicherheitslücke und ich würde mich fragen, warum es die Begrenzung unter Linux überhaupt gibt.
Es gibt wohl keine Sicherheitslücke.
Es gibt ja ein paar Recorderprogramme im Netz, die diese Api nutzen, und dabei die HDCP-Kette nicht umgehen können.

Das Ganze unterstützt: "GPU-Based Content Protection"
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von NicTheQuick »

Gut. Das heißt aber im Umkehrschluss, dass Hoto seine RGB-LEDs nicht nutzen kann, wenn er solche Inhalte abspielen will. Das heißt kopiergeschützte Blu-Rays und Netflix- bzw. Amazon Prime-Filme werden damit nicht funktionieren.
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von ccode_new »

@Nic

Genau! Das dürfte wohl der Stand der Dinge sein.

Anbei: Wer anderweitiges Wissen hat darf dies gerne einbringen.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von Hoto »

Ja, die Desktop Duplication API respektiert DRM. Was jetzt aber genau alles deswegen nicht geht, kann ich nicht sagen, da ich nicht weiß wie die anderen Ambilight Software Lösungen ganz genau im Detail arbeiten. Netflix (im Chrome Browser) funktioniert bei denen, Amazon Prime kann ich selbst im Moment nicht ausprobieren, hab gerade kein Prime. Möglich das diese Ambilight Software nicht nur eine Methode dafür nutzen und da die DD API eine Rückmeldung gibt, wenn Kopiergeschützer Inhalt abgespielt wird, kann sie intern ja leicht auf eine andere Methode zurück greifen.

Edit: gerade noch mal Netflix mit meinem Code hier (Plus 10 Sek Delay am Anfang) ausprobiert, nimmt problemlos das Bild auf und sieht mir auch nach HD aus. Unter anderem mal mit Guardian of the Galaxies ausprobiert, der sollte wenn ja definitiv DRM haben.
Edit2: ok, in der Netflix App gehts nicht und ich bilde mir auch ein die Bild Quali wäre besser. Und da geht auch die anderen Software nicht. Soviel also dazu. ;)
Helle hat geschrieben:Warum werden nicht die Daten in buf direkt genutzt? Alpha weg und für RGB einen Mittelwert bilden für die "zuständige Außen-LED".
Weil ich dann gleich die anderen Lösungen nutzen kann. Ich will die Farben eben auf meine Art anders berechnen und dazu brauch ich mehr Bild Daten. Aber ich werde jetzt auch einfach mal nach Alternativen gucken, den C++ Code selbst kriege ich nicht editiert, daran haben ich mir jetzt Stunden die Zähne ausgebissen...

Jemand der mit C++ und DX11 umgehen kann hätte das vermutlich in einer halben Stunde umgesetzt. So einfach Hilfe findet man im Internet aber auch nicht.

Ich hab jetzt einfach mal beim DXGCap Author selbst angefragt ob er so ein Feature einbauen könnte, aber noch keine Antwort erhalten, war auch sein einziges C++ Projekt, seither macht er fast nur noch Rust. Übrigens hat der Author die DLL auch mit dem Ziel für Ambilight programmiert, sieht man leicht an seinen anderen Projekten.

Es wäre aber so oder so gut die Daten noch innerhalb des GPU Speichers zu verringern damit nicht ständig bei jedem Abruf 31 Megabyte vom Grafik in der CPU Speicher geschoben werden müssen.
Das Repeat: ... Until PeekS(*buf) ist natürlich pure Verzweiflung, ist so aber auch erstmal notwendig.
Ja, war es auch, nur eine spontane Idee das auf die Schnelle zum laufen zu kriegen. Mehr als ein Testcode ist das alles wirklich nicht.
Um das wegzukriegen dachte ich "init" (ist auch eine Funktion der Lib) wäre eine Idee; war aber leider wirkungslos.
Mit Init hatte ich auch rumprobiert, scheint wirklich keinerlei Wirkung zu haben.
Abhilfe schuf bei mir ein Delay(100) nach "get_output_dimensions(*dxgi_manager,@Width,@Height)". Wird ja nur einmal aufgerufen.
Sicher, aber dann ist die Fehlerabfrage natürlich draußen.

Darum hab ich mir die Tage aber auch keinen Kopf mehr gemacht, hing nur erfolglos am C++ Code rum, ist auch nicht sehr hilfreich wenn man keinerlei Rückmeldung bekommt, wenn sich dank DLL das PB Programm aufhängt. Ist zwar schön, wenn sich der C++ Code ohne Fehler kompelieren lässt, aber das heißt halt nicht, dass es auch läuft. ;) Keine Ahnung ob man das irgendwie debuggen kann. Ich hatte gar nicht vor VS C++ zu mehr als zum kompelieren der DLL zu verwenden. XD
Antworten