web (HbbTV, VDR*ELEC), Milestone 1 erreicht

  • Ich hoffe, die Werte im BT kann man auf signed/unsigned und die Ausgabe zurückführen. Die sind z.T. etwas gruselig.

    Ich bin mir nicht sicher, obs wirklich an der Nutzung von sws_scale liegt, werfe aber mal die Frage in den Raum, ob fürs Skalieren und Umwandeln nicht ImageMagick/GraphicsMagick auch geeignet wäre.

    Wie das Bild skaliert wird ist völlig egal. Es gibt nur folgende Voraussetzungen:

    - sollte relativ schnell sein

    - die Pixelformate RGBA und BGRA sollten unterstützt werden

    - ich finde eine API oder ein Beispiel dazu ;)


    Ich habe nur sws_scale genommen, weil das ich in der alten Version auch schon verwendet hatte und mein Herz hängt nicht wirklich daran.

  • Das ResetVideo kommt nur genau dann, wenn ein Video endet und direkt danach ein neues Video starten soll.

    Ich habe das Problem nachstellen können und es ist gefixed. Wenn der Transcoder nicht läuft, kann es passieren, daß der Browser ein ResetVideo sendet, ohne vorher tatsächlich den Player initialisiert zu haben. Folge: segfault.

  • Wie das Bild skaliert wird ist völlig egal. Es gibt nur folgende Voraussetzungen:

    - sollte relativ schnell sein

    Ich habe eine Version gebaut, die mittels LANCIR das Bild skaliert. Verwendet werden soll (lokal) sse2. Das Ergebnis ist sehr ernüchternd. Mal abgesehen vom Pixelformat (das sich lösen lässt), habe ich folgende Zeiten nur für das Skalieren der Images:

    sws_scale: 1 ms

    Lancir: > 50 ms


    Der Unterschied ist signifikant und merklich spürbar.

  • Hm, das geht dann so nicht. Mal abgesehen, dass sws_scale ja eigentlich funktionieren müsste und ich immer noch nicht weiß, woran das liegt, kann ich ImageMagick mal ausprobieren.

  • Ich verfolge den Thread hier nun schon eine Weile, bin aber unsicher wie die Videoausgabe hier impementiert ist.

    Meiner Ansicht nach sollte das Video vom Ausgabeplugin ausgegeben werden und das Web Overlay vom Browser.

    So wie ich euch hier verstehe gebt ihr das Video aber über den Browser aus. Ich hoffe ich habs richtig verstanden.

    Das Ausgabeplugin kann das Video an eine beliebige Stelle auf den Screen scalieren. Und das (Web)OSD

    liegt immer darüber. Zumindest denke ich das weil der OSD Layer bei amlogic höhere Priorität hat als das Video.


    Sorry wenn ich hier Mist rede :)

  • jojo61 Na dran :)


    Sowohl das OSD, als auch das Video (bzw. die eingehenden TS Pakete) werden nur über das Ausgabedevice ausgegeben. Dazu gibt im Plugin das cOsdObject und den cPlayer/cControl.

    Der Browser rendert das OSD, welches über das Ausgabedevice als echtes OSD ausgegeben wird. Der Browser "sammelt" aber auch die Video-URL ein, sendet diese an einen Transcoder, der das ganze in einen TS-Stream transcodiert, welches dann über den cPlayer/cControl ausgegeben wird (PlayTS war es, glaube ich).


    Das Video selbst wird über das Ausgabeplugin skaliert und damit gibt es kein Problem. Die Schwierigkeit entsteht durch das OSD. Vom Browser kommt akuell immer ein Image in der Größe 1280 x 720. Können die Ausgabedevices das OSD selbst skalieren? Beispielsweise kommt 1280x720 rein und das soll auf 1920x1080 ausgegeben werden?

    Ich habe schon darüber nachgedacht, ob man die Bildgröße nicht direkt im Browser skalieren kann. Dann werden die Images größer und ich bin mir nicht sicher, ob es dann noch ausreichend schnell funktioniert. Das andere Problem sind die unhandlichen Zoom-Level von CEF.

  • Hm, das geht dann so nicht. Mal abgesehen, dass sws_scale ja eigentlich funktionieren müsste und ich immer noch nicht weiß, woran das liegt, kann ich ImageMagick mal ausprobieren.

    Ich habe jetzt mal FFmpeg 6.0 auf meinem System und ich kann das Problem immer noch nicht nachstellen. Mir fehlt immer noch der Ansatz an dem ich etwas versuchen kann oder mit dem ich spielen kann.

    Für das Plugin gibt es den Branch lancir, mit dem ich Lancir getestet habe. Vielleicht ist der resampling Algorithmus (Lanczos) nicht der schnellste.

  • Können die Ausgabedevices das OSD selbst skalieren? Beispielsweise kommt 1280x720 rein und das soll auf 1920x1080 ausgegeben werden?

    Ja das OSD kann vom Ausgabeplugin scaliert werden. Das RGB Image wird auf ein Opengl Framebuffer hochgeladen und dort dann ausgegeben. Dabei kann es ganz einfach scaliert werden. Habe gerade mal geschaut und das API lässt die scalierung des Images zu. Ist aber derzeit noch nicht implementiert. D.h. die Scalierungsparameter werden nicht ausgewertet. Kann ich aber leicht einbauen.

    Code
    cOglCmdDrawImage::cOglCmdDrawImage(cOglFb *fb, tColor *argb, GLint width, GLint height, GLint x, GLint y, bool overlay,
                                       double scaleX, double scaleY)

    So sieht das bei mir intern aus.

  • Die GL Ausgabeplugins können das schon relativ einfach, aber die OSD Api gibt ein Scaling für Image nicht her. Oder übersehe ich was? Nur ein Bitmap() kann mit scalefactor gezeichnet werden.

  • Da ich mich mit dem OSD kaum beschäftigt habe, habe ich nun mal gesucht und denke das externe API ist

    Code
    DrawImage(const cPoint &Point, const cImage &Image)

    Das müsste dann wohl um die Scalierung erweitert werden. Also etwa so

    Code
    DrawImage(const cPoint &Point, const cImage &Image, double scaleX, double scaleY)

    Oder man macht eine neue Funktion DrawImage_scale......

  • Kann eine Pixmap scaliert ins OSD oder eine andere Pixmap gezeichnet werden?

  • In osd.h:


    static void SetOsdPosition(int Left, int Top, int Width, int Height);

    ///< Sets the position and size of the OSD to the given values.

    ///< This may be useful for plugins that determine the scaling of the

    ///< video image and need to scale the OSD accordingly to fit on the

    ///< screen.

  • Noch etwas zur Umwandlung in ein TS Stream. Das ist eigentlich nicht nötig. Das plugin spiel nur PES Pakete ab.

    Nur der VDR braucht die TS Pakete und macht daraus dann PES Pakete. Evtl. kann man das auch umgehen.

    Hoffentlich lehne ich mich hier nicht zu weit aus dem Fenster :)

  • static void SetOsdPosition(int Left, int Top, int Width, int Height);

    ///< Sets the position and size of the OSD to the given values.

    ///< This may be useful for plugins that determine the scaling of the

    ///< video image and need to scale the OSD accordingly to fit on the

    ///< screen.

    Ich hatte das immer auf das gesamte OSD bezogen.

    Wenn man das aber auf das zu Rendernde Image bezieht dann kann man es darüber scalieren indem man vor dem DrawImage ein SetOSDPosition schickt und dann wird das Image genau dahin in der Grösse gerendert. Wobei ich eine Erweiterung des DrawImage API vorziehen würde.


    Nachtrag:

    Falls das Image immer ganz komplette OSD beinhaltet dann geht es natürlich auch mit dem SetOSD Position.

    Ich bin immer davon ausgegangen das DrawImage nur Teile eines OSDs lädt.

  • Vielleicht habe ich einen Denkfehler, aber wenn die Auflösung 1920×1080 ist, kann man mit Boardmittel ein kleineres Image nicht auf fullscreen skalieren. Wenn die OSD Größe auch verkleinert wird, wird das OSD nicht mehr im Vollbild dargestellt. Die einfachste Möglichkeit wäre, DrawImage um eine Zielgröße oder factor zu ergänzen. Das würde mit OpenGL auch nichts kosten.

  • ... wäre aber eine Änderung am VDR Core.

  • Ihr bringt mich auf sehr gute Ideen.


    Ich habe mir die API von CEF

    genauer durchgelesen, ein wenig getestet und enormes Optimierungspotential entdeckt. In meiner alten Version habe ich noch das ganze Bild genommen und versucht das mittels FFmpeg in ein Video zu verwandlen um es im VDR abspielen zu lassen. Ich meine auch damals hätte ich immer dirtyRects.size == 1 und immer das Vollbild in dirtyRects bekommen.

    Das muss sich geändert haben, auch wenn dirtyRects.size == 1 ist, besteht die RectList jetzt aus viel kleineren Bereichen (wenn nicht gerade alles neu gezeichnet wird). Und damit muss ich nur Teile des OSD übertragen und skalieren.

    DrawImage(const cPoint &Point, const cImage &Image, double scaleX = 1.0, double scaleY = 1.0)

    Diese Erweiterung wäre am Besten. Nur müssten Klaus und alle Ausgabedevice-Entwickler mitziehen. Das scaleX, scaleY kann man ja berechnen. Ich könnte mir vorstellen, daß dies auch für Skins oder ähnliches sinnvoll sein könnte. Skalieren ist ein häufiges Problem.


    Noch etwas zur Umwandlung in ein TS Stream. Das ist eigentlich nicht nötig. Das plugin spiel nur PES Pakete ab.

    Nur der VDR braucht die TS Pakete und macht daraus dann PES Pakete. Evtl. kann man das auch umgehen.

    Hoffentlich lehne ich mich hier nicht zu weit aus dem Fenster :)

    Das hat auch historische und praktische Gründe. Aktuell ist mir noch kein anderes Videoformat als h264 untergekommen, Audio ac3, aac und Konsorten. Damals gab es auch andere Codecs, die nicht für TS vorgesehen sind und auch tatsächlich transkodiert werden mussten, damit Bild und Ton funktionierten. Wobei Transcoding im Moment nur die Umwandlung von mp4 -> TS bedeutet (copy audio/video). Das ist extrem schnell. Aber ich denke, daß später auch andere Videoformate auftauchen können werden. Ich muss mal schauen, ob ich alte Filme in einer Mediathek finde, weil ich glaube, das diese das Hauptproblem waren.

    Das andere Problem entstand aus der Video-Codierung des Browser (OSD und Video) und den Transport nach VDR. Auf der Entwicklungsumgebung war das Encode viel zu schnell und VDR hat das Video dann auch in einem enormen Tempo abgespielt. Absolut unbrauchbar. Eine saubere Bremse habe ich nicht hinbekommen.

    Jetzt nutze ich im Transcoder den FFmepg mit -re und damit bekomme ich die Daten nicht schneller, als sie abgespielt werden sollen und ich muss mich um nix mehr kümmern.


    Als erstes werde ich mich um dirtyRecs kümmern und schauen, wie sich das auswirkt. Wenn die API nicht geändert werden kann, kommen dann vielleicht auch andere Libs wieder in Betracht: GraphicsMagick, ImageMagick, Lancir oder andere.

  • Ich habe mir das Problem nochmals angesehen und denke man kommt ohne das scalieren aus. Wenn man mit der Funktion SetOsdPosition(int Left, int Top, int Width, int Height) das OSD definiert hat, dann kann man dahinein einfach DrawImage machen und es passt ohne zu scalieren.

    Dieses OSD wird dann bei der Anzeige eh scaliert. Derzeit ist bei mir ein OSD von 1920x1080 eingestellt, aber das Videobild ist 3940x2160.

    D.h. ich scaliere das OSD eh immer. Deswegen kann man das OSD auch auf eine beliebige Grösse einstellen.

    Damit handeln wir uns aber ein anderes Problem ein: Der skindesigner z.B. geht davon aus das das OSD immer 1929x1080 ist. Wenn das nun verstellt wird dann passt es nicht mehr. Das WEB Plugin müsste also nach dem Anzeigen eines OSDs die grösse immer wieder zurückstellen damit dann das "normale" OSD richtig anzeigt.


    Im Moment ist die Funktion SetOSDPosition in softhdodroid nicht aktiv. Das kann ich aber gerne implementieren wenn wir das mal testen wollen.

  • Damit handeln wir uns aber ein anderes Problem ein: Der skindesigner z.B. geht davon aus das das OSD immer 1929x1080 ist.

    Das stimmt so nicht ganz.

    Wenn ich bei meiner TT6400 die OSD-Größe im Ausgabedevice (dvbhddevice) entsprechend fest einstelle, z.B. auf 1024x576, dann skaliert der skindesigner entsprechend:

    Code
    Jul 24 12:35:07 vdr[700389]: [700389] OSD size changed to 1024x576 @ 1
    Jul 24 12:35:07 vdr[700389]: [700389] saved setup to /etc/vdr/setup.conf
    Jul 24 12:35:07 vdr[700389]: [700389] OSD size changed to 1024x576 @ 1
    Jul 24 12:35:07 vdr[700389]: [937476] animator thread thread ended (pid=700389, tid=937476)
    Jul 24 12:35:07 vdr[700389]: [700389] skindesigner: Delete Osd
    Jul 24 12:35:07 vdr[700389]: [700389] skindesigner: osd size changed
    Jul 24 12:35:07 vdr[700389]: [700389] skindesigner: old osd size: top 26 left 14 size 1224 * 691
    Jul 24 12:35:07 vdr[700389]: [700389] skindesigner: new osd size: top 20 left 12 size 976 * 553
    Jul 24 12:35:07 vdr[700389]: [700389] skindesigner: initializing skin estuary4vdr

    Ob es allerdings so implementiert ist, wie ihr das braucht, kann ich aber nicht sagen.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!