Seite 1 von 2
Kennt sich hier einer mit C++ und Assembly-Code aus?
Verfasst: Mo 25 Okt 2004, 11:48
von leth
Hallo,
im Moment arbeite ich für Muxxi an einer Preview von MPEG2 Material. Dazu habe ich die MPEG2lib.dll mit eingebunden. Mittlerweilen habe ich es sogar geschafft die Sourcen selbst zu kompilieren und eine kleine Änderung durchzuführen.
Wenn ich die Sourcen richtig verstehe, dann wurde der Code für Pentium III (SSE und MMX) optimiert. Dazu existiert die Datei '\DVD2AVI\idctmmx.asm'. Nun ist der Code aus dem Jahre 2001 und in der Zwischenzeit gibt es Pentium IV und AMD 64 Prozessoren. Nun wäre echt super, wenn jemand das Ganze dafür anpassen könnte
Außerdem bekomme ich während des kompilierens unter VS.NET 2003 einige Warnungen, die ich aber in der Source nicht ausbessern kann, weil ich davon einfach nichts verstehe!
Des Weiteren wurde die DLL bereits für Audio-Decoding vorbereitet, der Support aber nie richtig fertiggestellt. Auch das wäre mit Sicherheit eine Herausforderung
Also, wenn jemand Lust hat sich der Sache anzunehmen, bitte melden.
Cu leth
Verfasst: Mo 25 Okt 2004, 12:03
von dj3d
kann zwar nicht die sprachen nicht , aber vielleicht hilfs dir weiter !
ist neuer als deine.
quelle:
http://www.winbibel.de/de/mpegcut.htm
Verfasst: Mo 25 Okt 2004, 12:08
von leth
Danke, aber das was ich oben gepostet habe ist genau diese DLL, nur mit ein paar Änderungen für Mpeg2Schnitt und Muxxi.
Cu leth
Verfasst: Mo 25 Okt 2004, 14:42
von dj3d
oder das hilf dir weiter
http://logicnet.dk/lib/
http://www.mpeg.org/MPEG/MSSG/
habe es oben rausgenommen , da gleiche..
Verfasst: Mo 25 Okt 2004, 15:09
von leth
Nochmals ein herzliches 'Vergelt's Gott'
Das ist wieder die Mpeg2lib.dll, die ich ja schon habe. Und die basiert auf:
War also leider wieder nichts. Aber der gute Wille zählt!
Vielen Dank!!
Cu leth
Verfasst: Mo 25 Okt 2004, 22:20
von Charles
Hallo Leth,
warum willst Du eigentlich den "Code für Pentium III (SSE und MMX)" auf die neuen Prozessoren anpassen? Die Sonderbefehle im neueren SSE2 (und wie auch immer die alle heißen) sind halt erweitert worden, die neuen Prozessoren sind ja noch kompatibel mit dem "alten" Standards. Wenn Du die DLL allerdings speziell für P4-Code anpasst, können alle PIII-Besitzer die DLL nicht mehr nutzen...
Da die Mpeg2lib im Mpeg2Schnitt verwendet wird, kann ich aus den Userberichten schliessen, daß schon ab ca. 1 GHz aufwärts das Video ruckelfrei abgespielt werden kann - hängt aber auch von den anderen Komponenten ab - Grafikkarte und Soundschnittstelle.
Vielleicht kannst Du ja mal in den Quellen von Cuttermaran und Mpeg2Schnitt schauen wie die das Abspielen mit Sound gelöst haben, vielleicht kannst Du ja dann Dein Soundproblem umgehen?
Grüße,
Charles
Verfasst: Di 26 Okt 2004, 7:12
von leth
Wenn Du die DLL allerdings speziell für P4-Code anpasst, können alle PIII-Besitzer die DLL nicht mehr nutzen...
So hab ich das garnicht gemein. Dachte eher daran das um die neuen Befehlssätze zu erweitern, so dass ein P4 oder AMD 64 das entsprechend schneller abwickeln kann. Einen älteren Prozessor aussperren möchte ich natürlich nicht!
Da die Mpeg2lib im Mpeg2Schnitt verwendet wird, kann ich aus den Userberichten schliessen, daß schon ab ca. 1 GHz aufwärts das Video ruckelfrei abgespielt werden kann - hängt aber auch von den anderen Komponenten ab - Grafikkarte und Soundschnittstelle.
Ein Film mit einer Auflösung von 720x576 läuft auf meinem Athlon 64 3500+ mit ca. 30 bis 40 FPS. Das bei mpeg2lib.dll mitgelieverte Mpeg2view spielt das mit an die 100 FPS ab. Das Problem ist, dass ich zu blöde bin die Anzeige auf DirectX hinzubekommen. Die Managed DirectX Komponenten sind in der MSDN Library leider sehr schlecht dokumentiert und Bücher gibt es (zumindest auf Deutsch) noch keine
Das Problem liegt jedoch nicht daran ein Bild über DirectX anzeigen zu lassen. Das hatte ich schon eingebaut, nur war das gleich schnell wie die Anzeige die ich über GDI+ realisiert habe. Ich muss wissen, wie man einen Pointer auf eine Bitmap, das liefert nämlich die MPEG2lib.dll, an DirectX übergeben kann und das Bitmap so anzeigen lassen kann.
[Sockenmodus = ON]
Es geht aber nicht nur darum den Film ruckelfrei abzuspielen, sondern schnellstmöglich zu decoden! Warum will ich hier noch nicht sagen

[Sockenmodus = OFF]
Vielleicht kannst Du ja mal in den Quellen von Cuttermaran und Mpeg2Schnitt schauen wie die das Abspielen mit Sound gelöst haben, vielleicht kannst Du ja dann Dein Soundproblem umgehen?
Also Cuttermaran macht es sich da relativ 'einfach' in dem es auf einen installierten MPEG2Decoder zurück greift und dazu den Mediaplayer mit einbindet. Das bringt mir aber nichts, weil ich an einzelne Bilder herankommen muss.
MPEG2Schnitt ist in Delphi geschrieben. Da kannst Du mir auch gleich einen Chinesischen Text vorlegen, das hätte den selben Effekt
Cu leth
Verfasst: Di 26 Okt 2004, 13:33
von Levithan
Verfasst: Di 26 Okt 2004, 17:29
von wingman
Verfasst: Di 26 Okt 2004, 19:48
von jmittelst
Irgendwie wird mir der Mund wässrig, satt bin ich aber schon ... hmmm

Schade, das ich vom programmen keine Ahnung habe, hätte Dir gern geholfen. Kannst mal unter
http://www.3dwin.net/forum/portal3dwin.php reinschauen. Dort gibt es ein Forum für Programmierer, ob Du da jemanden findest, der Dir weiterhelfen kann, kann ich Dir aber auch nicht versprechen. Zu den meisten Themen gibt es da aber schon kompetente Leute.
cu
Jens
Verfasst: Di 26 Okt 2004, 21:28
von Charles
Hallo Leth,
Alles klar: Du willst den Video incl. Audio an eine DirectX-Blackbox senden, und das so schnell als möglich. Da Du Dich über den Sinn der Blackbox (noch) ausschweigen willst

kann ich ja nur raten was da passieren soll.
Aber vielleicht kannst Du den gewünschten Video/Audio-Stream (Schnipsel?) ausschneiden und mit einem externen Tool dann decodieren bzw. umwandeln in das gewünschte Format, und kannst Dir so die eigene Decodierung sparen?
Ich habe mir das Mpeg2Schnitt angeschaut, und habe - so hoffe ich zumindest - die Rückgabe eines Bildes aus der Mpeg2Lib gefunden. Das Ergebnis des Aufrufes wird hier in eine Variable des Typs "PByteArray" geschoben. Das ist eine Dynamische Variable die nur den Pointer auf die tatächliche Position der Datenmenge im Speicher wiederspiegelt. Die Daten werden Byteweise abgelegt, was aber mit der nachfolgenden Verarbeitung zusammenhängen dürfte. Ein Feld des Typs PChar ist lt. Beschreibung das gleiche, wird aber anderes angesprochen. Diese Feldtypen SIND Pointer und könnten denzufolge auch an DirektX weitergegeben werden, wie Du es benötigst. Ich weiß natürlich nicht wie diese Typen in Deiner Programmiersprache heißen oder angewendet werden. In Delphi muss man vor der Benutzung erstmal Speicher zuweisen, die PChar müssen immer mit einem #0 (Low-Value) abgeschlossen werden.
Das Anzeigen im Mpeg2Schnitt wird dann Bild für Bild vorgenommen - das nachzuverfolgen würde aber länger daueren...
Ich hoffe Du kannst mit meinem Geschreibe was anfrangen...
Charles
Verfasst: Mi 27 Okt 2004, 11:29
von leth
DU FIESE SOCKE, DU!
Tja, kennst mich ja
Du willst den Video incl. Audio an eine DirectX-Blackbox senden, und das so schnell als möglich
Nein, bei der DirectX Implementierung geht es darum die Anzeige zu beschleunigen. Im Moment schaft Muxxi mit meinem PC (Athlon 64 3500+) gerade mal ca. 45 FPS. Das ist zum Anschauen mehr als genug, doch nicht um die Position im Film mit einem Slider laufend zu verändern, da wären so etwa 100 FPS, wie es MPEG2View schafft, wünschenswert.
Ich habe mir das Mpeg2Schnitt angeschaut, und habe - so hoffe ich zumindest - die Rückgabe eines Bildes aus der Mpeg2Lib gefunden. Das Ergebnis des Aufrufes wird hier in eine Variable des Typs "PByteArray" geschoben. Das ist eine Dynamische Variable die nur den Pointer auf die tatächliche Position der Datenmenge im Speicher wiederspiegelt. Die Daten werden Byteweise abgelegt, was aber mit der nachfolgenden Verarbeitung zusammenhängen dürfte. Ein Feld des Typs PChar ist lt. Beschreibung das gleiche, wird aber anderes angesprochen. Diese Feldtypen SIND Pointer und könnten denzufolge auch an DirektX weitergegeben werden, wie Du es benötigst. Ich weiß natürlich nicht wie diese Typen in Deiner Programmiersprache heißen oder angewendet werden. In Delphi muss man vor der Benutzung erstmal Speicher zuweisen, die PChar müssen immer mit einem #0 (Low-Value) abgeschlossen werden.
Da liegt nicht das Problem. Die MPEG2lib.dll liefert mir einen Pointer auf eine Bitmap im Speicher. In VB.NET kann man aus diesem Pointer mit einer einzigen Zeile Code ein Bitmap Objekt erstellen und danach in einer PictureBox anzeigen, abspeichern, oder was auch immer. Das klappt ja auch, nur eben mit ca 40-45 FPS (speichern ist natürlich langsamer, so 10 Bilder pro Sekunde).
Wenn ich nun dieses Bitmap an DirectX übergebe bleibt die Geschwindigkeit gleich! Mit ein paar Tests habe ich nun festgestellt, dass die Erstellung des Bitmaps aus dem Pointer am meisten Rechenzeit benötigt und die Geschwindigkeit der Anzeige dadurch halbiert wird.
Nun suche ich eine Möglichkeit den Pointer direkt an DirectX zu übergeben, so dass die GPU daraus ein Bitmap macht und es anzeigt. Dass es geht weiß ich, denn MPEG2View macht genau dies. Nur das wie in VB.NET kann mir anscheinend niemand sagen
Cu leth
Verfasst: Mi 27 Okt 2004, 17:46
von Charles
Wenn Du schon einen Pointer aus der DLL bekommst, wieso reichst Du diese nicht einfach weiter? Sind die Feld-Typen nicht kompatibel?
Oder warum nicht einfach das Ergebnis der DLL in einen PChar übergeben (Ohne Bitmap Konvertierung) und dieses weitergeben an DirektX. Bei Bedarf kannst Du dieses PChar wieder als Quelle für eine Bitmap-Konvertierung verwenden.
Ich glaube auch, daß beim Sliden nicht unbedingt jedes Bild angezeigt werden muss. Vielleicht ist es auch OK, nur jedes x. Bild anzuzeigen oder jeden I-Frame...
Ich würde Dir ja gerne mehr helfen, aber
A) Ich kann kein C
B) Ich habe auch kein VB.NET
Ich teile Dir einfach meine Gedanken mit - was ich probieren/testen würde mit Delphi...
Viel Glück noch,
Charles
PS: Auf jeden Fall freue ich mich schon auf das Ergebnis....

Verfasst: Mi 27 Okt 2004, 18:37
von leth
Wenn Du schon einen Pointer aus der DLL bekommst, wieso reichst Du diese nicht einfach weiter? Sind die Feld-Typen nicht kompatibel?
Das würde ich ja gerne machen, nur bisher konnte mir noch niemand sagen, wie ich den Pointer an DirectX übergeben kann!
Zu MPEG2Schnitt kann ich nur folgendes nochmal wiederholen:
leth hat geschrieben:
MPEG2Schnitt ist in Delphi geschrieben. Da kannst Du mir auch gleich einen Chinesischen Text vorlegen, das hätte den selben Effekt
Ich kann daraus so gut wie nichts rauslesen.
Cu leth
Verfasst: Do 28 Okt 2004, 4:47
von jmittelst
Hmm - von Cuttermaran gibt es doch auch Sourcen - worin ist das denn geschrieben? Oder macht Cuttermaran das wieder ganz anders?
cu
Jens