Bild im Framebuffer anzeigen

  • Hi!


    Ich würde gerne ein Bild direkt im Framebuffer anzeigen, aber nicht den ePictureViewer verwenden, da dieser den gesamten Bildschirmhintergrund schwarz macht, und das will ich nicht... :frowning_face:


    Also ich stelle mir das so vor: ein Bild , von dem ich Breite+Höhe kenne (sagen wir 200 x 160) auf dem Screen positionieren und dann nur diese Koordinaten mit einem Bild füllen, während das normale Fernsehbild weiterläuft.


    Wenn ich mir im ePictureViewer die Zeile

    Code
    struct fb_cmap map_back = {0, 256, red_b, green_b, blue_b, NULL};


    anschaue, weiss ich, dass das letzte Argument für Transparenz steht. Eventuell ist es ja auch damit getan, hier einen Wert zu setzen? :confused_face: Wenn ja, nur welchen? :frowning_face:


    Ich wäre über Hinweise von Euch sehr dankbar! :smiling_face:


    Grüße Dr. Best

    Einmal editiert, zuletzt von Dr.Best ()

  • Schau dir mal die Routine ClearFB an (lib/picviewer/fbdisplay.cpp):



    Über diese Routine wird der Framebuffer "gelöscht" falls ein Bild kleiner ist wie die Bildschirmauflösung (720x576).
    Geswitched wird hier über die Farbtiefe. Bei 16Bit (also 2 Bytes, case 2) wird der 16Bit Wert für "black" in den Framebuffer über ne Schleife geschrieben. Bei 8 Bit (1 Byte, case default) gehts einfacher da man mit memset den ganzen Framebuffer mit Nullen füllt und dann ist auch schwarz.
    Wenn du statt schwarz hier eine Transparenz haben willst, dann musst du im 8 Bit Fall die Farbnummer der 256 Farben-Palette schicken die auf Transparent gesetzt ist (weiss ich auswendig nicht, lässt sich aber im Source finden, fast alle Programmierer nehmen hier für die letzte Farbe 0xFF ob das bei Enigma auch so ist oder ob es ne andere Farbnummer ist, keine Ahnung), im 16 Bit Fall musst du ein 2Byte Wort schicken. Diese Werte sind eigentlich auch schon definiert (genauso wie "black"), da kannst du auch das passende "Macro" für "transparent raussuchen, falls es einen gibt. Das 2 Byte Wort kann sich ganz verschieden zusammen setzen, je nachdem welches Farbformat gewählt wurde. Wurde RGB565 gesetzt, hasst du Pech dann sind alle 16 Bit für die Farbwerte (5Bit R, 6Bit G, 5Bit B) verbraten und es gibt keine transparenz. Es gibt da verschiedene Modi, die gesetzt werden können (RGBA5551 hat zum Beispiel ein Bit für Transparenz, sprich entweder Transparenz ein/aus aber nichts "halbtransparentes", usw.). Wenn du dir die Routinen in fb_display.cpp mal genauer ansiehst, kannst du relativ viel über den Framebuffer lernen und die Routinen sind auch alle relativ allgemein. Du kannst quasi die ganzen Display und Convert und Pic Decode Routinen (pictureViewer.cpp) nutzen und den "Rahmen" drum herum selbst schreiben (quasi als Ersatz für ePicViewer). Dann müsstest du das hinbekommen ohne die eigentlichen Enigma Sourcen zu verbiegen.

  • Danke für Deine Erklärungen Seddi! =)


    Ich hatte am Wochenende mal versucht, einfach die clearFB auszukommentieren und überhaupt kein Bild dargestellt .


    Also diesen Codeabschnitt hatte ich auskommentiert:


    Code
    /* ClearFB if image is smaller */
    	if (x_size < (int)var->xres || y_size < (int)var->yres)
    		clearFB(var->bits_per_pixel, bp);
    	blit2FB(fbbuff, x_size, y_size, var->xres, var->yres, x_pan, y_pan, x_offs, y_offs, bp);


    Das komsiche ist, das in dem Moment, dass der Bildschirm dennoch schwaz wird. Eventuell ist ja das SetMode dafür verantwortlich, aber wie Du merkst hab ich von Tuten und Blasen bei dem Thema keine Ahnung, sind nur Vermutungen.... :grinning_squinting_face:


    Code
    if (screenInfo->bits_per_pixel != 16)
    	{
    		fbClass::getInstance()->lock();
    		fbClass::getInstance()->SetMode(720, 576, 16);
    #if HAVE_DVB_API_VERSION == 3
    		fbClass::getInstance()->setTransparency(0);
    #endif
    	}



    Zitat

    Wenn du dir die Routinen in fb_display.cpp mal genauer ansiehst, kannst du relativ viel über den Framebuffer lernen und die Routinen sind auch alle relativ allgemein. Du kannst quasi die ganzen Display und Convert und Pic Decode Routinen (pictureViewer.cpp) nutzen und den "Rahmen" drum herum selbst schreiben (quasi als Ersatz für ePicViewer). Dann müsstest du das hinbekommen ohne die eigentlichen Enigma Sourcen zu verbiegen.


    Ich hab , wie gesagt, letztes Wochenende hier ziemlich "rumgespielt", aber zu keinem Ergebniss gekommen (also bzgl. schwarzen Hintergrund, Bilder konnte ich immerhin anzeigen und positionieren). Vielleicht funktioniert das ja jetzt Dank Deiner Erklärung. :smiling_face: Werde später es nochmal versuchen, am Wochenende habe ich entnervt aufgegeben, da ich von Framebuffern aber auch wirklich überhaupt keine Ahnung habe :winking_face: und mir das Lesen im Internet über dieses Thema leider nicht weitergeholfen hat. :confused_face:



    Nachtrag (kann mir nicht selber antworten! :grinning_squinting_face: :frowning_face:


    in apps/tuxbox/enigma/lib/gdi/fb.cpp --> fbClass::SetMode habe ich eben gesehen, dass hier auch der Befehl


    Code
    memset(lfb, 0, stride*yRes);

    gesetzt wird...


    Mir glatt entgangen am WE... :smiling_face: Darum dürfte der Bildschirm wohl auch immer schwarz werden...


    Das mit den transparenten Farben setzen hab ich zwar beim ersten Lesen nicht gleich verstanden von Dir, aber vielleicht wird das ja noch was... :winking_face:

    3 Mal editiert, zuletzt von Dr.Best ()

  • Im ersten Abschnitt, den du auskommentiert hast, hast du auch die Funktion:


    blit2FB(...


    mit auskommentiert ... nun ja wie soll ich sagen genau diese Funktion schiebt das dekodierte Bild in den Framebuffer :grinning_squinting_face:


    Das "memset(lfb, 0, stride*yRes);" schiebt lediglich Nullen in den Framebuffer. Da kommt es nun drauf an in welchem 16Bit Farbmode der Framebuffer ist, ich vermute mal RGB565. Somit sind alle 16 Bit für die Farbwerte verbraten und ein 0x0000 bedeutet somit dann einen schwarzen Punkt, sprich ein memset(lfb, 0, stride*yRes); bedeutet einen schwarzen Schirm.
    Ich kann dir zwar viel über den fb erzählen, kenne aber die Routinen im Enigma nicht wirklich gut, die müsste ich mir erst mal ansehen. Es ist etwas schwerer den Framebuffer im 16Bit Modus zu erklären, 8Bit oder 32Bit Modi sind da Einsteigerfreundlicher, weil keine "Farbformate" wie RGB565, RGBA5551,etc. dazu kommen.
    Aber so wie ich vorhin grob drüber geschaut habe, müsste man den ePicviewer an einigen Stellen umbauen, damit du eine Transparenz bekommst. Die ist so wie ich gesehen habe in diesen Routinen gar nicht vorgesehen.

  • Zitat

    Original von Seddi
    Im ersten Abschnitt, den du auskommentiert hast, hast du auch die Funktion:


    blit2FB(...


    mit auskommentiert ... nun ja wie soll ich sagen genau diese Funktion schiebt das dekodierte Bild in den Framebuffer :grinning_squinting_face:


    Wollte ich ja, damit ich sehen kann, ob der schwarze Hintergrund am Bild lag oder am Setmode.


    Ich hab mir auch schon die Spiele angeschaut (fx2), ob ich hier irgendwo Code Hinweise bekomme. Leider aber auch nix, was ich jetzt sofort richtig interpretieren könnte.LazyT schafft es ja auch irgendwie, nur ein kleines Bild darstellen zu können...


    Ich frag nochmal bei Gelegenheit im irc nach!


    Danke für Deine Hilfe!