"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

libav und x264 (C/C++, evtl. ARMv7 asm) für Android kompilieren: Ich packs ned!

GrandAdmiralThrawn 04.11.2011 - 23:03 5395 23
Posts

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Grüß euch!

Ich hab mir ja jetzt so ein dreckiges Android Phone gekauft... ok. Gleich zum Punkt:

Ich würd gerne das [libav Codecsystem] mit der [Android NDK] Toolchain bauen, und danach noch [x264] dagegen linken und bauen, und das fertige (hoffentlich statisch gelinkte) x264 Binary dann am Android Phone nutzen.

Hat irgendwer damit Erfahrung, wie man C/C++ mit klassischem configure/make Setup mit der Android NDK Toolchain übersetzt? Ich pack diesen cross-compile Wahnsinn gar ned, und die Doku is Mörda..

Daher wollte ich Mal nachfragen, ob es hier jemanden gibt, der evtl. etwas Orientierungs-Starthilfe leisten könnte.

Als Plattform fürn Bau hab ich ein CentOS 6.0 Linux, und halt die neueste Android NDK. SDK auch, brauchts aber wohl ned für den Code. GNU make, autoconf, yasm usw. sind natürlich auch vorhanden.. Ich glaub ja ich bräuchte nur ein entsprechend passendes Setup, sodaß statt den System Tools und Libs halt nur die des NDK genutzt werden mit der korrekten Target Arch und entsprechenden Optimierungen, plus evtl den yasm, um die ARMv7 Assembler Codepfade nutzen zu können, die ja auch vorliegen bei dem Source.

Aber wie das genau aussehen soll, ich durchblicks ned. Es gibt Leute im Netz, die es geschafft haben, aber die fragmentierten und unvollständigen Infos dazu waren nicht sehr hilfreich. Guide gibts keins, und der Market... najo, den kann man in so einem Fall vergessen.. Commandline Tools für Video Encoding gibts da generell ned..

Zu Hülf?!
Bearbeitet von GrandAdmiralThrawn am 04.11.2011, 23:07

Viper780

Er ist tot, Jim!
Avatar
Registered: Mar 2001
Location: Wien
Posts: 49016
ich würd mich an xda developers wenden da gibts genügend entwickler.

Warum willst du per CLI videos am Handy encoden?

EDIT:
Problem an der ganzen Sache ist das die guten Video de-/encoder nutzen vom Grafikchip machen (sollten) und dir somit ein rein Arm7 optimierter Code nicht all zu viel bringt, vorallem solltest wissen was für Einheiten in _deinem_ ARM7 stecken die sind ja nicht immer gleich

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Das is ein TI OMAP3 (ARMv7), ich muß noch nachsehen, ob ich eine HW FPU habe, das weiß ich noch ned sicher. Was ich weiß ist, daß ich keine NEON SIMD Extensions zur Verfügung habe. Phone ist ein Motorola Milestone 2.

Und: x264 und GPU Nutzung sind nach wie vor nicht wirklich realisiert, und der Output von x264 ist in seiner Qualität noch von keinem GPU-gestützten Encoder erreicht worden, nach wie vor nicht. Von daher steh ich dem GPU Encoding solange skeptisch gegenüber, bis wirklich x264 selbst entsprechend portiert ist.

Also GPU Support ist weder am PC noch sonstwo für x264 verfügbar, darüber muß ich mir keine Gedanken machen.

Werde aber deinem Rat folgen, und mich an XDA Devs wenden, wenn hier niemand weiter wissen sollte (Habe bei XDA noch nie gepostet, und oc.at ist normal erste Anlaufstelle).

thx

Edit: Der Grund ist, ich will einen von mir veröffentlichten x264 Benchmark auf Android portieren. Ihn ins Linux auf x86_64 und sogar MIPS zu bringen war möglich. ARM @ Android ist die nächste Stufe der Challenge!
Bearbeitet von GrandAdmiralThrawn am 04.11.2011, 23:44

Viper780

Er ist tot, Jim!
Avatar
Registered: Mar 2001
Location: Wien
Posts: 49016
ok verstehe, im grunde eine nette Challange, wenn ich wo drüber stolpere sag ich dir bescheid. xda dev sind sehr gute Leute dabei und die meisten wollen auch helfen

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Ok, danke!

[Hier mein Post bei den XDA Developers]

Ich hoffe ich bin ned ganz falsch unterwegs dort (Poststyle, Subforum usw.).

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
armv7 hat übrigens immer eine Hardware-FPU.

Viper780

Er ist tot, Jim!
Avatar
Registered: Mar 2001
Location: Wien
Posts: 49016
Als CPU sollte ein OMAP-3630 drinnen sein welcher ein Cortex-A8 ist mit einer PowerVR SGX530 GPU und DaVinci erweiterungen http://en.wikipedia.org/wiki/Texas_Instruments_DaVinci

und anstelle der NEON SIMD hat er eine IVA 2 Einheit in einem eigenen DSP

Marcellus

OC Addicted
Avatar
Registered: Mar 2005
Location: ~
Posts: 1755
Wie siehts aus?

Ich hab die Erfahrung gemacht, dass ziemlich jede google software in einem komplett unbrauchbaren build system steckt, ich habs nicht einmal geschafft libjingle zu bauen. Android bringt sämtliche compiler vorkompiliert mit in irgendeinem wirschen 32/64bit misch.

Wenn du x264 für elf brauchst und nicht für den java crap kannst du dir openembedded ansehen, das funktioniert recht schmerzlos, solang du +4Gb ram hast.

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Ich nehme schon an, daß ELF binaries am Android laufen, also jo, ELF. Für ARMv7 halt. Sache is, daß ich einfach keinen Schimmer habe wie man cross-compiled und diese NDK toolchain verwendet. Die Doku will ich irgendwie ned lesen, weil ich hab so die Ahnung daß ich da 5 Stunden les, und dann geht genausoviel wie vorher wal ich eh nix kapier.

openembedded hab ich noch nie gehört, müßt ich Mal schaun was das is und kann.

+4GB? Meine Workstation hier mit Linux hat 6GB. Das Handy natürlich eher nicht. ;) Aber ich schätze du meinst die Desktopapplikation?!

Soweit ich das verstanden habe, wird der Binärcode im Android irgendwie über JNI aufgerufen und läuft dann auch in dieser komischen VM.. linked aber gegen die Systemlibs. kA wie das genau läuft.

Auf xdadevelopers hat noch keiner geantwortet.

Edit: openembedded Mal nach Anleitung gesaugt.. Hmm.. Jetzt steh ich wieder da wie ein Depp... Komm wohl ned drumherum mit stundenlang einzulesen, um dann umso epischer zu scheitern. ;) :rolleyes:

Edit 2: Einige Stunden später: Ich komm auf keinen grünen Zweig. Irgendwie muß man da so eine Art Jobfile schreiben.. kA. Gibts nix, das einen bestehenden Source-Tree mit configure/make-Style einfach "einliest" und dann "Build for Android 2.x / OMAP3", fertig? rofl.

Bah....

Edit 3: Versucht, x264 mit bitbake zu bauen.. den hauts irgendwo bei ncurses auf... pfh. Bold reichts ma.

Edit 4: ncurses Patches am Angstrom Server ned mehr verfügbar (HTTP 403 wtf), und Main URL für ncurses-5.7 auf einen funktionierenden Mirror gesetzt. kA ob das auseinanderbricht ohne die Patches... aber das funzt wahrscheinlich eh alles sowieso nie.

Edit 5: binutils Package, Checksum mismatch.. Geht dahin mit dem "Framework"...

Edit 6: Im Package bison.. make[1]: *** [all-recursive] Error 1

...

rm -Rf ~/openembedded - und tschüss!
Bearbeitet von GrandAdmiralThrawn am 07.11.2011, 14:11

Marcellus

OC Addicted
Avatar
Registered: Mar 2005
Location: ~
Posts: 1755
Openembedded hat eben nichts mit android zu tun, deswegen elf binary, statt java irgendwas.

Zeitweise gibts schon probleme, aber du hast wenigstens die Möglichkeit etwas zu fixen. Sobald du den gcc mit arm target hast brauchst du den rest vom chroot ansich gar nicht mehr in dem Fall. Ich hab dir openembedded nur empfohlen, weils im vergleich zu buildroot/crossdev bei mir eigentlich immer recht gut ootb funktioniert hat.

Falls du noch mehr Ideen brauchst, es gibt ein tool namens crossdev, dass du dir ansehen könntest.

Llvm hat ein arm target, aber ich hab ka welche version.

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Ich danke dir für jeden Hinweis, der helfen könnte (auch für Openembedded, kannte ich noch ned).

Leider gewinne ich nach kurzer Begegnung mit der Android NDK und dem Openembedded System langsam aber sicher den Eindruck, daß man einfach russischer Raketenwissenschafter und Unix Systemcoder Guru sein muß, um sowas zuwege zu bringen!?!

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Cross-compilen ist meist relativ mühsam, weil das von den Maintainern selten getestet wird und daher immer irgendwo krachen geht.

Ich habe schon einige Erfahrung damit, aber OpenEmbedded hab ich mir trotzdem noch nie angetan. Sich da einzuarbeiten ist schon eher ein größeres Investment.

Grundsätzlich geht es immer so, dass du den cross-Compiler vor dem configure des Packages in den Pfad nimmst, und wenn du Glück hast, geht der Rest von allein ;). Oder du setzt die CC- und CXX-Variablen auf z.B. armv5tel-unknown-linux-gnu-{gcc,g++} (das muss dann natürlich auch im Pfad sein, oder du gibst den vollen Pfad an).

Das Problem ist dann halt meistens, dass die Pakete recht viele Abhängigkeiten haben, die du alle erst mal vorher cross-compilen musst. Für dieses Abhängigkeitsmanagement helfen natürlich dann solche umfassenden Frameworks wie OpenEmbedded.

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Für das Erfüllen solcher Dependencies sollte doch z.B. die Android NDK sorgen, oder? Openembedded scheint mir ja eine ganze Linux Distro bauen zu wollen! rofl. Aber die NDK, das is ja eine komplette Toolchain inklusive der Android Libraries usw.? Ich habs trotzdem ned geschafft, den Compiler zur Arbeit zu bewegen ("No working C compiler found", das kann natürlich vom nicht passenden CFLAG bis hin zur Nutzung des falschen gcc alles sein).

******e, daß es hier niemanden gibt, der C/C++ Code schon Mal für Android portiert hat. ;)
Bearbeitet von GrandAdmiralThrawn am 07.11.2011, 19:00

Marcellus

OC Addicted
Avatar
Registered: Mar 2005
Location: ~
Posts: 1755
Jein, openembedded ist eben dafür ausgelegt, dass du ein rootfilesystem für ein embedded system bauen kannst und dann auch pakete dafür bauen kannst.

Sprich openembedded compile -> rootfs auf eine sd karte und dann davon am handy/router/wwi was booten.

Ich kenn openembedded, weil ich probiere shr auf mein handy zu portieren, android ist so ein verkrüppeltes posix system.

Mit angström hab ich nicht viel Erfahrung, vllt kommst du mit shr besser zurecht. Seit die entwicklung von shr-unstable auf shr-core umgestellt wurde komm ich mit der config nicht zurecht, aber ansich musst du "nur" ein machine recipe finden, dass den selben cpu hat, wie dein handy, dafür x264 kompilieren und dann die binary auf dein handy kopieren. Build guide

Es gibt haufenweise guides, wie man android direkt bauen kann, dann musst du in das chroot ein rezept für x264 reinbasteln dann hättest du auch das ganze android java zeug drinnen. Damit hab ich mich aber nicht auseinandergesetzt, weil mir android viel zu sehr auf die eier geht.

@Ringding das ganze mit "händisch" cross compilen ist denk ich schon mühsamer, wenn du gegen eine bibilothek linken musst, dann endest du ganz schnell mit einem Ausdruck mit 20 Variablen, die du setzen musst und die rauszufinden dauert wesentlich länger, als openembedded anzureißen. Aber ja, es gibt viel zu lesen bis es funktioniert.
Bearbeitet von Marcellus am 07.11.2011, 19:02

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Das Android-NDK kann dir auch nicht jeden Abhängigkeitswunsch erfüllen. Wenn x264 eine Lib haben will, die nicht dabei ist, musst du sie eben selber bauen (wie du es mit libav anscheinend auch machen willst).
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz