sunxi-vdpau WIP (ehemals interlaced branch)

  • WoF: Das ging flott :p Werde das mal ungetestet übernehmen. Ausschauen tuts gut ...
    Jetzt noch aufräumen, Queue straffen, handle Zugriffe berichtigen ... Zille macht das schon :p
    Danke
    Andreas

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---
    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.7 mit streamdev, satip/vtuner-ng, live, epgsearch, markad ---
    (Client 1) --- HW: RPI4 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (Client 2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • WoF, wäre es nicht einfacher, die Funktionen handle_get und handle_acquire zusammen zu fassen, d.h. setzen des Mutex und Rückgabe des Handles?
    Gruß
    Andreas

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---
    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.7 mit streamdev, satip/vtuner-ng, live, epgsearch, markad ---
    (Client 1) --- HW: RPI4 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (Client 2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • Ich hab auch mal diverse Locks eingebaut, jetzt sollte erstmal alles wichtige threadsicher sein. Sorry falls jemand jetzt umsonst daran gearbeitet hat, ging alles etwas schnell.

    Wozu soll das handle_acquire/release gut sein? Ich weiß, ist vom vaapi-gl backend abgeschrieben, aber ich finde keinen Grund warum man das brauchen sollte. mesa vdpau braucht es auch nicht.

  • Hallo Jemk und Johns,

    das vsync hab ich jetzt eingebaut und bei einem Film funktioniert es Prima. Wenn das OSD dazu kommt brauchen die surfaces aber 25 bis 30 ms. Da stürzt die libvdpau klanglos ab. vdp_presentation_queue_block_until_surface_idle scheint das surface zum Löschen frei zugeben.

    Ich will jetzt ein doppeltes Anzeigen einbauen. Dazu brauche ich eine klare Zuordnung was welches surface ist. Steht in dem zusammengewürfeltem struct irgendwo was drin ( Zeit, Nummer, etc) um ein surface als das eine zu identifizieren?
    Das funktioniert leider nicht:

    Code
    oldvs = nowvs;
    	nowvs = os->vs;
    
    
    	oldtask = task;

    Gruß zille

    Edit: Der Code liegt da.

    Edited once, last by Zille (December 1, 2014 at 11:11 PM).

  • Hallo Jemk und Johns,

    das vsync hab ich jetzt eingebaut und bei einem Film funktioniert es Prima. Wenn das OSD dazu kommt brauchen die surfaces aber 25 bis 30 ms. Da stürzt die libvdpau klanglos ab. vdp_presentation_queue_block_until_surface_idle scheint das surface zum Löschen frei zugeben.

    Ich will jetzt ein doppeltes Anzeigen einbauen. Dazu brauche ich eine klare Zuordnung was welches surface ist. Steht in dem zusammengewürfeltem struct irgendwo was drin ( Zeit, Nummer, etc) um ein surface als das eine zu identifizieren?

    Das OSD wird über VdpOutputSurfaceRenderBitmapSurface oder VdpOutputSurfaceRenderOutputSurface übergeben.
    IIRC wird nur bitmap von sunxi unterstützt. Ob dies nun eine eigene Fläche bleibt und ins Video gerendert wird, weiß ich nicht.
    Eine Freigabe bei Idle sollte kein Problem sein, da diese OSD Fläche jedesmal für jede Video Fläche zum Treiber hochgeladen wird.

    Und das mit dem doppelt verstehe ich nicht. Darum hat sich schon die Anwendung (SoftHdDevice) gekümmert.

    Code
    OSD + Video -> Ausgabefläche

    Die obige Videofläche wird bei Interlace zweimal übergeben. (VdpVideoMixerRender)

    "do_presentation_queue_display" arbeitet mit dem Ausgabeflächen diese enthalten Hintergrund, Videobild (auch mehrmals) und OSD (könnte auch mehrmals sein).

    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?

    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Und das mit dem doppelt verstehe ich nicht. Darum hat sich schon die Anwendung (SoftHdDevice) gekümmert.


    Die Ausgabe passiert mit 20ms pro surface. Die Anlieferung ueber vdp_presentation_queue_display mit OSD Daten dauert aber laenger als 20ms. Das schwankt zwischen 23 bis 30 ms. Da ist die Queue irgendwann mal leer und die lib stuerzt ab. Darum will ich wenn nur 1-2 surfaces in der Queue liegen ein surface doppelt anzeigen um 20 ms rauszuschinden.

    Hab grad VdpPresentationQueueStatus
    *status gefunden. Damit muesste es glaub ich gehen.

    Quote

    Das OSD wird über VdpOutputSurfaceRenderBitmapSurface oder VdpOutputSurfaceRenderOutputSurface übergeben.

    Wenn ich das richtig sehe wird das OSD ueber vdp_presentation_queue_display als Layer uebergeben und angezeigt. Kann das ueber die obigen Methoden schneller gemacht werden? 20ms sind das Limit!

    Gruss zille

  • Achso, wenn keine neue Fläche zur Verfügung steht, dann einfach nichts machen.
    Einfach den Status der Fläche auf "Displayed" lassen.
    "first_presentation_time" darf nur beim ersten Anzeigen gesetzt werden.

    Die Anwendung kümmert sich dann darum, daß A/V im Sync bleibt.

    Auch ältere schwächere NVidia Karten hatten Probleme mit der Peformance mit OSD.
    Ich habe schon von der Anwendungsseite optimiert, es wird nur angezeigt, wenn OSD etwas enthält und es wird nur der Bereich angezeigt der auch Informationen enthält.

    Für weitere Optimierungen müsste man im VDPAU Treiber messen, wo die Zeit verloren geht.
    z.b. wird häufiger der gleiche Inhalt angezeigt, dies könnte man mit etwas CPU Leistung überprüfen, wenn nicht die CPU Leistung bereits das Problem ist.

    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?

    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch


  • Das OSD wird mit Hilfe des Mixer Prozessor (G2D) in das Output Surface kopiert. D.h. die blits und fills werden hardwareseitig erledigt. Evtl. liegt da schon die Schwachstelle.
    In do_presentation_queue_display wird dann zuerst das VideoSurface (os->vs) auf einen Layer geschrieben (q->target->layer). Danach wird überprüft, ob sich was auf dem Output "RGBA" Surface befindet (os->rgba) und entsprechend dargestellt. Dabei wird der VideoSurface-Layer mit einem weiteren Layer (OSD) überlagert.
    d.h. ioctl(q->target->fd, DISP_CMD_LAYER_SET_PARA, args) und ioctl(q->target->fd, DISP_CMD_LAYER_OPEN, args) werden doppelt ausgeführt. 1x für Video Layer, 1x für OSD. Mögliche zweite Schwachstelle.

    @zille: Hast du meineGedanken schon mal angesehen?
    Und was hat das Warten auf 3 Tasks in der Queue für einen Hintergrund?

    Gruß Andreas

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---
    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.7 mit streamdev, satip/vtuner-ng, live, epgsearch, markad ---
    (Client 1) --- HW: RPI4 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (Client 2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • Zu lange dauert das Anliefern mit vdp_presentation_queue_display. Da ich momentan nur an einer Stelle messe steckt da der gesamte Kreis drin. Von VDP_STATUS_OK;, Softhddevice, Aufruf vdp_presentation_queue_display, Speicher reservieren in die Queue packen. Vor VDP_STATUS_OK nehme ich die Zeit.

    Ab Presentation_thread ist problemlos in 20 ms zu schaffen.

    Gruss Zille.

  • Zu lange dauert das Anliefern mit vdp_presentation_queue_display. Da ich momentan nur an einer Stelle messe steckt da der gesamte Kreis drin. Von VDP_STATUS_OK;, Softhddevice, Aufruf vdp_presentation_queue_display, Speicher reservieren in die Queue packen. Vor VDP_STATUS_OK nehme ich die Zeit.

    Ab Presentation_thread ist problemlos in 20 ms zu schaffen.

    Gruss Zille.


    Dann brauchts wohl Zwischenzeiten, um zu sehen, wer der Bremser ist...
    Gruß Andreas

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---
    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.7 mit streamdev, satip/vtuner-ng, live, epgsearch, markad ---
    (Client 1) --- HW: RPI4 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (Client 2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • Hallo Andreas und Zille,
    ich habe mir aus euren beiden Forks vsync und dint was zusammengebastelt :)
    Das Deinterlace funktioniert ganz gut wenn man das Display auf 50Hz hat, es gibt nur ein Problem wenn man auf einen Kanal mit einer anderen Auflösung umschaltet ist das Bild verpuzzelt. Wenn man den VDR dann neu startet wird er richtig angezeigt.

    Eine funktionierende Implementation ist nicht mehr weit entfernt. :]

    Gruß Joachim

  • Hallo Andreas und Zille,
    ich habe mir aus euren beiden Forks vsync und dint was zusammengebastelt :)
    Das Deinterlace funktioniert ganz gut wenn man das Display auf 50Hz hat, es gibt nur ein Problem wenn man auf einen Kanal mit einer anderen Auflösung umschaltet ist das Bild verpuzzelt. Wenn man den VDR dann neu startet wird er richtig angezeigt.

    Eine funktionierende Implementation ist nicht mehr weit entfernt. :]

    Gruß Joachim


    ... und wie sieht es mit einem grossflächigem OSD aus? Die kleinen nach Kanalwechsel überlebt die Lib hier auch.

    Gruss zille

  • Hallo Zille,
    hab deinen fork gestern mal probiert. Nachdem ich ein paar Dinge auskommentiert hatte, kam dann auch ein Bild.
    Wir hatten dann am Ende des Tages mit unseren letzten Commits wohl ähnliche Gedanken :p

    Zeit für IN und OUT betrug dann bei mir am Ende konstant +/- 40000, also 25Hz ?! Mit mpv, wenn ich mich richtig erinnere. OSD klappte auch. Prinzipiell. Ich denke aber, da muss nachgebessert werden.
    Ich habe dann aufgehört und werde heute abend wieder drüber nachdenken...

    Gruß Andreas

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---
    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.7 mit streamdev, satip/vtuner-ng, live, epgsearch, markad ---
    (Client 1) --- HW: RPI4 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (Client 2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---
    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • Hi Andreas,

    Zeit für IN und OUT betrug dann bei mir am Ende konstant +/- 40000, also 25Hz ?! Mit mpv, wenn ich mich richtig erinnere. OSD klappte auch. Prinzipiell.

    Was hast Du für eine Bildwiederholrate? Vsync sollte eigentlich 50 Hz, 20 ms pro Bild sein. Jedenfalls hier in Europa. Aber bei 40ms Du hast keine Probleme mit OSD.

    Gruss zille.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!