@bacardischmal wie hoch ist denn die CPU-Auslastung bei der Wiedergabe?
Gruß Fabian
@bacardischmal wie hoch ist denn die CPU-Auslastung bei der Wiedergabe?
Gruß Fabian
Konnte ich bisher nicht feststellen. Mein Cubietruck und mein Windows-PC mit NVidia-Grafikkarte liefern ein gleich helles Bild. Verwendest du den gleichen HDMI-Anschluss am TV? Nicht dass die unterschiedliche Einstellungen haben.
Hallo beta,
das habe ich noch nicht beobachten können. Kannst du 20-30 Sekunden von deiner Videodatei irgendwo hochladen?
Hallo Jens,
weißt du was die Register MACC_MPEG_IQ_INPUT und MACC_MPEG_IQ_IDCT_INPUT machen? Hat das vielleicht etwas mit dem Quantizer Scale Factor zu tun? Bei meiner Test-Datei ist nämlich q_scale_type gesetzt. Die Einträge in der Quantisierungsmatrix müssen also, so wie ich das verstanden habe, mit einem nicht linearen Faktor multipliziert werden. Evtl. müssen wir das selbst machen? Denn der quantizer_scale_code ist nicht im Picture-Header enthalten und wird auch nicht an den HW-Dekoder weitergegeben - er weiß also gar nichts davon. Ich hätte mal ausprobiert den Faktor auf die Quantisierungsmatrix anzuwenden, aber ich weiß nicht wie man an der Stelle an den Slice-Header herankommt um den quantizer_scale_code auszulesen...
Das sieht deutlich besser aus. Im Vergleich zu VLC unter Windows am gleichen TV-Gerät ist noch MPEG-Rauschen sichtbar. Ich dachte vielleicht, dass es bei mir daran liegt, dass meine Aufzeichnung die alternative Scan-Tabelle benutzt und habe die zusätzlich mal in den Code eingebaut , aber ich kann keinen gravierenden Unterschied feststellen.
Wie könnte man das denn Reverse Engineeren? Gibt es ein Programm, das libve benutzt?
Ich habe die MAF-Beispiele mal blind übernommen und geguckt was passiert:
video.flag_addr = maf_flag_mem + 0x40000000; // convert to bus address
video.flag_stride = (((layer_info.fb.size.width + 31) & 0xffffffe0)*2/8 + 31) & 0xffffffe0;
video.maf_valid = 1;
Wenn man eine der drei Variablen ändert, sehen die Kammartefakte jedes Mal anders aus. Mal sind sie nur in Flächen zu sehen, mal als Klötzchen auf dem ganzen Bild und mal als vertikale Streifen über die ganze Höhe.
maf_flag_mem habe ich mit malloc und nicht mit kmalloc alloziert, da wir ja im user-space sind. Wenn man eine "Müll"-Adresse in video.flag_addr schreibt, schmiert er nicht ab. Das wäre ein Indiz dafür, dass er nur lesend auf diesen Bereich zugreift, wir ihn also füllen müssten...?
QuoteIch bin gerade mit Allwinner wegen MAF in Kontakt. Eine Antwort kam
schon, allerdings ist noch nicht alles geklärt. Mal sehen, vielleicht
gibts hier Aufklärung.
Das klingt erfreulich!
Hallo Andreas,
ich würde vorschlagen "Make it work, make it fast, make it nice", aber prinzipiell bin ich da auch bei dir. Du hast Beispielcode von Allwinner erwähnt. Wo hast du den gesehen?
Kennt jemand noch andere Anwendungen die den HW-Deinterlacer vom disp-Treiber verwenden? Dann könnte man dort ja evtl. etwas abgucken.
Hallo zille,
die Erkennung funktioniert jetzt zuverlässig mit 576i, 720p und 1080i. Servus TV HD sieht jetzt richtig gut aus, ich finde das kann man so benutzen. Bei 720p sieht man leichtes MPEG-Rauschen (Körnung), da ist der Dekodierer vom A20 wahrscheinlich einfach nicht so toll. Bei SD sieht man die MPEG-Artefakte/Schatten wie oben in den "Screenshots", aber keine ausgefransten Kanten mehr. Wenn man genau hinschaut sieht man aber noch innerhalb(!) von sich überblendenen Flächen (z.B. Gesichter oder Programminformationen) Kammstrukturen. Siehe Anhang.
Hallo zille,
deine Ergänzung von pre_frame_valid bringt keine Änderung. Ich habe aber testweise mal video.interlace fest auf TRUE gesetzt, und damit sind die restlichen Kammartefakte weg. Dabei habe ich gesehen, dass wir im Moment nur Bob verwenden. Vielleicht ist das auch der Grund für die miserable Dekodierqualität?
Es gibt da noch ein flag das maf_valid heißt. Wenn ich das setze habe ich in der Horizontalen unterbrochene Kammartefakte. Sieht sehr komisch aus. Wahrscheinlich muss man noch die Parameter flag_stride und flag_addr setzen. In der A20-Doku steht dazu nur "Current frame tile flag buffer address" und "tile flag line-stride". Weiß jemand wir groß die Stride ist?
Der Link sieht aber merkürdig aus. Ich würde sagen der zeigt auf das falsche Ziel. Bei mir sieht das so aus:
root@Cubian:~# ls -la /usr/lib/arm-linux-gnueabihf/libvdpau.so*
lrwxrwxrwx 1 root root 17 Aug 16 2012 /usr/lib/arm-linux-gnueabihf/libvdpau.so -> libvdpau.so.1.0.0
lrwxrwxrwx 1 root root 17 Aug 16 2012 /usr/lib/arm-linux-gnueabihf/libvdpau.so.1 -> libvdpau.so.1.0.0
-rw-r--r-- 1 root root 9716 Aug 16 2012 /usr/lib/arm-linux-gnueabihf/libvdpau.so.1.0.0
root@Cubian:~# ls -la /usr/lib/arm-linux-gnueabihf/vdpau/
total 228
drwxr-xr-x 2 root root 4096 Dec 16 15:16 .
drwxr-xr-x 32 root root 40960 Dec 16 15:16 ..
-rwxr-xr-x 1 root root 145313 Dec 16 15:12 libvdpau_sunxi.so.1
lrwxrwxrwx 1 root root 23 Aug 16 2012 libvdpau_trace.so.1 -> libvdpau_trace.so.1.0.0
-rw-r--r-- 1 root root 34220 Aug 16 2012 libvdpau_trace.so.1.0.0
Display More
softhddevice hängt nur von libvdpau.so.1 ab. Die libvdpau_sunxi.so.1 wird dann zur Laufzeit nachgeladen.
Thx zille, mit 190MB funktioniert Servus TV und die MPEG-Blockartefakte sind (wahrscheinlich wegen der Auflösung) geringer als bei SD. Bewegte Kanten fransen immernoch minimal aus. Siehe Bild im Anhang. Das habe ich bei SD auch beobachtet. Bei Farbverläufen sieht es so aus als wenn die Farbtiefe nur geschätzte 16Bit sind.
EDIT: 720p (Das Erste) funktioniert ebenso.
Bei HD (Das Erste & Servus TV Österreich HD) macht er hier ein Segmentation fault. surface_p ist ein NULL-Pointer. Wenn ich das richtig sehe kann das nur passieren wenn er nicht genügend Speicher hat...
Ich benutze ffmpeg in Version 2.2.11, von softhddevice die GIT-Version vom 16.10.2014 und von libvdpau-sunxi diesen Branch von zille. Die Schilderungen von mir bisher, sind von SD-Kanälen. HD reiche ich nach.
Der Patch hat es gebracht! Zusätzlich musste ich noch auf ffmpeg 2.2 downgraden, da ffmpeg 2.5 wahrscheinlich ein Pixelformat bereitstellt, das softhddevice noch nicht unterstützt (PIX_FMT_VDPAU_MPEG2 vs. PIX_FMT_VDPAU).
Im Bild sind sehr starke MPEG-Kompressionsartefakte sichtbar, die im Original nicht enthalten sind. Das sieht schrecklich aus. Siehe Anhang. Ist das bei euch auch so?
Hallo zille,
NO_MPEG_HW habe ich nicht gesetzt und -a steht bei mir auf sunxihdmi. Mit NO_MPEG_HW=1 kommt das "video/vdpau: no valid vdpau pixfmt found" nicht mehr, springt aber dann sofort in den slow_path in video.c:7274.
Hallo zille,
schade dass du nicht mehr an dem Vorhaben weiterarbeitest. Bei dir hat es doch schon zufriedenstellend funktioniert und dann so kurz vor der Zielgeraden aufgeben?
Bei mir geht softhddevice in Vdpau_get_format() in den slow_path und macht dann ohne Hardware-Beschleunigung weiter:
Nach einigen Debugging-Sessions und dem Beseitigen des FFmpeg/libav-Versions-Chaos, habe ich herausgefunden, dass das Pixelformat nicht stimmt. FFmpeg liefert AV_PIX_FMT_XVMC_MPEG2_IDCT, softhddevice erwartet aber PIX_FMT_VDPAU_MPEG2. Nun habe ich gelesen, dass XvMC eine Erweiterung für X11 ist, die ebenfalls die MPEG-Dekodierung in der GPU ermöglicht. Wie kann ich ihm sagen dass er VDPAU und nicht XvMC zur Dekodierung nutzen soll?
Hallo zille,
irgendwas mache ich falsch, 576i Material spielt der VDR nicht gedeinterlaced ab. Braucht man einen bestimmen Patchlevel/Branch vom sunxi Kernel? Beim Starten von VDR sagt er, dass Temporal unterstützt wird (ist auch in softhddevice aktiviert):
Dec 11 15:17:26 Cubian vdr: video/vdpau: VDPAU API version: 1
Dec 11 15:17:26 Cubian vdr: video/vdpau: VDPAU information: sunxi VDPAU Driver
Dec 11 15:17:26 Cubian vdr: video/vdpau: high quality scaling unsupported
Dec 11 15:17:26 Cubian vdr: video/vdpau: feature deinterlace temporal supported
Ich kann leider den Code vom Gesamtsystem VDR, softhddevice, libvdpau, sunxi-Kernel noch nicht ganz überblicken. Wo kann ich am besten anfangen zu debuggen?
Gruß WoF
Hallo Zille,
kann man deinen Code irgendwo einsehen?