Hallo kls ,
beim Messen der Umschaltzeiten bin ich auf zwei Stellen in device.c gestoßen, die unnötig Zeit kosten. Der Patch dazu hängt an und ist klein.
1. Der Transfer-Player wird zu spät angehängt. SetChannel() startet ihn, einhängen tut ihn aber erst die Hauptschleife im ncäshten Durchgang. Bis dahin wirft cTransfer::Receive() alles weg. Je nachdem, was die Hauptschleife gerade treibt, sind das 300–900 ms, zum Beispiel beim Zeichnen der Kanalanzeige oder bei SVDRP beim Schlafen in cRemote::Get().
Bei SVDRP CHAN gibt's obendrauf ein doppeltes Umschalten: HasProgramme() sieht den gestarteten, aber noch nicht eingehängten Player und denkt, es läuft nichts. Also schaltet die Hauptschleife gleich noch mal auf denselben Kanal.
Die Lösung ist ein cControl::Attach() direkt nach dem Launch(). Deine Reihenfolge aus 2.8.3 bleibt dabei, wie sie ist, und für einen schon eingehängten Player tut Attach() einfach nichts.
2. Der TS-Puffer wacht zu selten auf. cTSBuffer weckt den Leser erst ab 10 % Füllstand. Das erreicht Live-TV so gut wie nie, also greift jedes Mal der 100-ms-Timeout. Mit 10 ms geht's flotter, und mehr CPU-Last war nicht messbar.
Messwerte: Beim Umschalten per SVDRP, Web-Oberfläche oder epgsearch sind die ersten Videodaten im Schnitt rund 0,6 s früher beim Ausgabegerät, auf demselben Transponder nach 155 statt 816 ms. Beim Umschalten per Fernbedienung sind es rund 85 ms, weil dort meist Tuner oder CAM das Tempo bestimmen.
vaapivideo macht Punkt 1 schon seit 1.9.0 per cStatus::ChannelSwitch()-Hook, und softhddevice-drm-gles ( rell) zieht gerade nach. Im Core wäre das für alle Ausgabe-Plugins erledigt, und wir könnten unsere Workarounds wieder rauswerfen.
Was meinst du?