DeskStream 2 Release Candidate 1.8

  • Ich habe einige Demos für JavaScript und den Einsatz der JIT-Compiler bewundert, da ist mir die Idee gekommen, den DeskStream-Client als Javascript (oder ggf in Java direkt) zu implementieren.
    Somit könnte man von jedem Browser aus eine Verbindung zum Server herstellen. Ihr könnt ja mal eure Meinung posten. Ich sage aber gleich, dass ich weder Java noch JS beherrsche, Code lesen (eingeschränkt) ja, Code schreiben nein :D Es würden also JS/Java-Programmierer gesucht....

    Da ich gerade Java lerne bietet sich das an !
    Aber ich hab keine Ahnung ob wir deinen Assembler Quellcode in Java benutzen kann

  • In Java? Gar nicht. Da musst du es in nativem Java schreiben. Andy, schreib den Algorithmus doch mal in Pseudocode auf ;)

  • Hi,
    nur mal kurze Zwischeninfo, ich bin hier weitab vom Schuss ohne AutoIt und ohne Internet 8)

    Die übertragenen Daten setzen sich folgendermaßen zusammen:
    Ich sags gleich, durch das verdammte little Endian (da hats der Assemblerprogrammierer gut^^) könnte es etwas stressig mit dem dekodieren werden!

    Es gibt 3 Sorten von "Paketen".
    1. Paket: Es werden aufeinanderfolgende Pixel mit unterschiedlichen Farben zusammengefasst.
    Datenformat: 3 Byte Adresse (Offsetadresse in einer 32-Bit-Bitmap), 1 Byte Anzahl Pixel, 2 Byte Farbe, 2 Byte Farbe, 2 Byte Farbe usw.....
    Da man für das Offset der Adresse nur 22 Bit braucht, sind Bit 22 und Bit 23 (Bitnummern starten bei null! ) für die Identifikation der Pakete verwendet!
    Wenn Bit 22 gesetzt ist (also im gelesenen ersten Dword (4 Bytes)), dann sind Bit 0 bis 21 die Adresse des ersten Pixels.
    Die PixelFarbe habe ich auf 16 Bit komprimiert, AA (alpha) ist einfach weggelassen, bei RR(rot) werden nur die 5 höchsten Bits verwendet, bei GG(grün) die 6 höchsten Bits, und bei BB (blau) wieder die 5 höchsten Bits.
    Das Word (2 Byte Farbe) müsstest du dann per Bitschiebeoperationen in 32 Bit "extrahieren", also aus den 16 Bit BBBBBGGGGGGRRRRR dann die 32 Bitfarbe AAAAAAAABBBBB000GGGGGG00RRRRR000 machen :thumbup:
    So, und jetzt so lange die dekomprimierten Pixel nacheinander in die Bitmap schreiben, bis die Anzahl (s. Datenformat, das vierte Byte) erreicht ist.

    2. Paket: Es werden Pixel mit gleicher Farbe zusammengefasst.
    Datenformat: 3 Byte Adresse (Offsetadresse in einer 32-Bit-Bitmap), 2 Byte Farbe, 1 Byte Anzahl
    siehe oben, allerdings identifiziert sich dieses Paket durch das gesetzte BIT 23 im ersten Dword!
    Bit 0 bis 21 sind wieder die Offsetadresse, die Farbe wird wie oben aus den 2 Byte extrahiert und so lange hintereinander in dei Bitmap geschrieben, bis die Anzahl (6. Byte im Paket) erreicht ist.

    3. Paket: Nur einzelne Pixel,
    Datenformat: 3 Byte Offset (22 Bit), 2 Byte Farbe
    wie gehabt, Offsetadresse ermitteln (Bit 22 und 23 sind NICHT gesetzt!), und extrahierte Farbe in die Bitmap schreiben.


    Der Server schickt natürlich nur diejenigen Pixel, die sich während 2 Frames geändert haben, wenn sich wenig bis garnichts ändert, sind die Daten entsprechend gering!


    Uhhhhhh, bevor man die "rohen" Pakete bekommt, muß man natürlich die durch die zusätzliche Komprimierung verkleinerten Pakete entpacken.
    Ich würde es daher zum Testen so machen, daß die Komprimierung (durch die Windowsfunktion _LZW_Compress() imho) erstmal im Server abgeschaltet wird. GGf gibts ja eine Java-Komprimierungsfunktion, die besteht dann sicher auch für Windows, diese könnte man dann einsetzen!


    Hab leider zzt kein Internet/AutoIt, da weitab vom Schuss einquartiert, sonst hätte ich die Entpackungsfunktion mal in AutoIt geschrieben^^

  • Respekt leute, habt euer Projekt ganz schön weit gebracht ;)
    Kleine allgemeine Frage, die aber warscheinlich selbsterklärend ist:
    Nachdem der Client connected ist, lässt der Server meinen CPU (leider noch Athlon X2) auf 40-50% laufen.
    Ergehts euch da anders? Ich schätz mal nicht, aber fragen kostet nichts ;)

    Mfg

  • Okay, danke^^
    Noch ne kleine Frage an dich und Andy:
    Ist es erlaubt euer Script umzuschreiben und in sein eigenes einzufügen, wenn man das Copyright dran lässt?
    Bei sowas frag ich lieber, bevor ich mich da dran mach und zum Schluss dürft ich das garnicht, obwohls Open Source ist.

    Mfg

  • Hi,
    bin zzt. etwas weit ab vom Schuss, nächste Woche aber wieder öfter online. Da gibts dann auch eine "Speedversion" (ich werde den/die "externen" Packer _LZW_Compress() / Decompress ) komplett in SSE schreiben ggf doch auch mal den Huffmann-Filter probieren :thumbup: )
    Dann braucht man die "externe" Windowsfunktion nicht mehr und ich kann mich mal im optimieren austoben....
    Leider ist dann der Punkt erreicht, wo ich meinen liebgewonnenen PIII@1,2Ghz nicht mehr zum Testen nehmen kann *schnüff*, da SSE2 und SSE3-Befehle nicht unterstützt werden (wurden)

    Zitat

    Nachdem der Client connected ist, lässt der Server meinen CPU (leider noch Athlon X2) auf 40-50% laufen.

    Da sollte auch noch was zu machen sein, auf meinem Stromspar-Athlon 4850 läuft der Server auch mit ~50%. Das liegt aber an der DO/UNTIL-Schleife im Server, die auf eine Antwort vom Client wartet :whistling: , schreib da ein sleep() rein, oder besser, ich mach für die nächste Version ein "Minisleep" (irgendwo war da doch ein Script aus dem eng. Forum um kurze Sleeps zu machen...)
    Selbst bei 1680x1050 braucht der Asm-teil zur Berechnung der Bilddifferenzen nur ~1 ms...daran liegts also nicht^^

    Ja, den Handshake hab ich mir auch vorgenommen, da geht dann auch noch was (Übertragung während der Rechenzeit beim Packen spart bei Full-Video ca. 50-100ms/Frame! )
    Weiterhin werde ich mal dem Protokoll per Wireshark auf den Pelz rücken, irgendwas ist bei der AutoIt-TCP-Übertragung faul, angeblich habe ich bei AutoItverbindungen über TCP wesentlich weniger Netzlast, was nur heissen kann, dass die Daten langsamer übertragen werden!? Kann das jemand bestätigen? Also als Test ein 100MB-File auf einen anderen Rechner per AutoIt-TCP dauert länger wie eine "Kopie" im Explorer.

    Zitat

    Ist es erlaubt euer Script umzuschreiben und in sein eigenes einzufügen, wenn man das Copyright dran lässt?

    Ich spreche mal nur für mich....."wer soll dich daran hindern?" :D
    Im Ernst, wenn du sinnvolle Erweiterungen einbaust, stell die Version irgendwo zur Verfügung (ggf auch an uns senden) damit alle davon partizipieren können!
    Wenn das Script Teil eines größeren Projekts werden soll , um so besser...dann war die ganze Arbeit doch nicht für die Katz^^

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (2. Juli 2011 um 16:19)

  • Hi,

    Zitat

    "Speedversion" (ich werde den/die "externen" Packer _LZW_Compress() / Decompress ) komplett in SSE schreiben ggf doch auch mal den Lanczos-Filter probieren :thumbup: )


    Ach jetzt doch ? :D

    Zitat

    irgendwo war da doch ein Script aus dem eng. Forum um kurze Sleeps zu machen..


    (Link)


    Zitat

    AutoItverbindungen über TCP wesentlich weniger Netzlast,


    Also wie ich das gesehn habe werden die An TCPSend übergebenen Daten in ~2Kb Stücke gehackt und dann einzeln versendet statt in einem Schwall

  • Andy: Ein Sleep(0) sollte in der Schleife schon etwas helfen.

    Zitat

    A value of zero causes the thread to relinquish the remainder of its time slice to any other thread that is ready to run. If there are no other threads ready to run, the function returns immediately, and the thread continues execution.

    Windows XP/2000: A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. This behavior changed starting with Windows Server 2003.

    Edit: Mache am besten direkt einen DllCall zu recv und setzte MSG_WAITALL http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx

    Einmal editiert, zuletzt von progandy (16. Juni 2011 um 19:06)

  • Hi,

    Zitat


    Ach jetzt doch ?

    leb mal 6 Wochen solo in div. Pensionen/Hotels ohne einen privaten Rechner, ohne i-net und rotiere 12h am Tag auf Arbeit...da kommste nach 2 Wochen zur Ablenkung auf Jogging und nach weiteren 2 Wochen tun sich im Kopf Algorithmen auf, wie man bestehende Scripte umbauen könnte^^

    Zitat

    Edit: Mache am besten direkt einen DllCall zu recv und setzte MSG_WAITALL

    ja, gute Idee! Falls sich nicht bestätigt, daß MSG_WAITALL unter XP nicht funktioniert!

  • Kleiner Anreiz für euch:
    Wie wärs, wenn ihr eine Art Datenübertragung via Drag&Drop einbaut?
    Ich hab leider zurzeit zu wenig Zeit um mir drüber Gedanken zu machen, aber die Idee wollt ich mal los werden ;)
    Natürlich wär auch so eine Datenübertragung, wie TeamViewer sie anbietet ganz reizvoll.
    Wenn ihr euch Gedanken drüber macht, lassts mich wissen, würde gerne helfen, wenn nicht, dann schau ich das ichs selbst hinbekomm, sobald ich Zeit find (in ca. 2-3 Wochen).

    Mfg

  • Wirklich interessant das Script.
    Ich wollte etwas zum Thema Javascript-Client im Browser sagen.

    Ich habe mich mal näher (anderes Projekt) mit Pixelakrobatik (Canvas) in Javascript beschäftigt. Die Performance ist schon überraschend gut, es gibt sogar Beispiele (für Firefox) wie mit Javascript Videostreams live verändert werden. Allerdings würde ich Javascript dennoch nicht die Dekodierung von Grafikdaten in dieser Form übernehmen lassen. Soo ideal ist das dann auch nicht.

    Eine andere Möglichkeit wäre, die Grafiken in einem Standardformat zu übertragen, so daß diese von Javascript schlicht angezeigt bzw. in eine Canvas gerendert werden können. Das wäre z.B. PNG, wo man dann über die Transparenz/Alpha-Kanal die unveränderten Bildschirmbestandteile "weglassen" kann. Das würde natürlich die Server-Seite verkomplizieren.

    Eine zweite Möglichkeit wäre, ein zusätzliches Programm für die Grafik-Übertragung zu verwenden. Mir fällt da spontan der VLC ein, welcher als Streaming-Quelle auch "screen" kennt. Der Browser könnte dann den Stream schlicht "abspielen". Javascript und dem Autoit-Server bliebe dann das Maus/Tastatur-Handling.

  • dann mach sie mal bitte sauber.... echt unfähige leute heutzutage unterwegs!

    ne spaß bei seite, hab jetzt mit nem neuen scite editor oder UDX compression compiliert, und siehe da es funktioniert :D also problem solved.

    desktream läuft super! gefällt mir. wär noch geil wenn man die steuerung übernehmen könnte wie bei net- teamviewer

  • Steuerung ist in Ansätzen möglich, ich wurstele gerade an einer Impelmentierung von OpenCl (nicht Gl) in AutoIt, damit kann man die Datenkompression auf einer geeigneten Graka laufen lassen, das sollte die übertragenen Datenmengen nochmal reduzieren und somit schnellere Bildraten bringen....lasst euch überraschen...

  • Hey hab mir die Teile mal gezogen und muss sagen Hochachtung, ist echt sehr gut gemacht vor allem die Kompression hat mich beeindruckt hab das auch mal versucht und bin kläglich gescheitert XD
    Hab das Programm mit meinem Rechner und lappi übers Internet getestet und festgestellt dass es doch relativ unpraktisch ist, dass man beim "Server", der ja das Bild sendet, vorher noch Portregeln etc. erstellen muss, damit das übers Internet klappt. Ich selber kenn mich mit Tcp überhaupt nicht aus, aber es müsste doch möglich sein, den Verbindungsaufbau umzudrehen, damit ich als Helfer meine Portweiterleitung konfiguriere und derjenige der das Bild sendet nur meine Ip eingeben muss. Hintergrund ist natürlich dass ich Portregeln erstellen kann, der hilfesuchende damit aber meistens schon an den Rand des Wahnsinns gebracht wird.
    Naja wollte nur wissen ob das prinzipiell möglich ist und wenn ja ob sich ein "TCP Pro" finden lässt, der das umstellen kann.

  • Natürlich gibt es noch andere Fernwartungstools, die entweder mit Proxies/Repeatern arbeiten (so daß beide Seiten NAT nutzen können) oder zumindest deren Serverkomponente aktiv Verbindung zum Fernwarter sucht und daher auf Serverseite kein Portmapping benötigt.
    "Teamviewer" ist da recht bekannt, privat kostenlos nutzbar, beruflich so zwischen 500,- und 1000,-
    Heise bietet eine vnc-basierte Lösung an: http://www.heise.de/netze/tools/fernwartung
    Ich verwende ChunkVNC, welches mit einem Repeater/Proxy arbeitet: http://www.chunkvnc.com

    (sorry für das Off-Topic)