From 2ca07bfe6be0dc3f6dc88c51619f6bf6655a46ff Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 8 Nov 2025 21:36:20 +0100 Subject: [PATCH] Bugfix-failed: attempt to fix XVideo widget drawing problems Based on the additional insight gained through the FrOSCon talk, an attempt was made to investigate and fix the garbled display of the docking panel header directly above our VideoDisplayWidget. However, that turned out to be a problem with insufficeint support of the XVideo standard with my (very old, 2011) NVidia graphic card. Indeed, the hardware+software stack needs to support this Auto-Keying extension of XVideo, so that the video display can be integrated seamlessly into the rest of the UI. In my case, the driver seemingly just fills the complete XWindow with the key-marker and thus the decorations of the docking panel, which happens to use the same XWindow, will just not be flushed to the display. This unsuccessful research indicates that upholding support for XVideo could become problematic... --- src/stage/output/xv-displayer.cpp | 12 + wiki/thinkPad.ichthyo.mm | 530 +++++++++++++++++++++++++++++- 2 files changed, 528 insertions(+), 14 deletions(-) diff --git a/src/stage/output/xv-displayer.cpp b/src/stage/output/xv-displayer.cpp index 6d23bfaab..00e7a9b74 100644 --- a/src/stage/output/xv-displayer.cpp +++ b/src/stage/output/xv-displayer.cpp @@ -142,6 +142,18 @@ namespace output { } } } + /* WARNING: some graphic cards (notably my very old NVidia card) do not properly support the XV-Keying feature. + * The above loop is written in a »defensive« way, insofar it is not permitted to set/change X attributes + * that are not provided and supported by your hardware and driver stack. + * It may thus happen (and it happens on my System) that the X driver somehow applies a default keying + * to the complete XWindow. However, if parts of that window are used by other UI elements (as is the case + * with our docking-panels), then these other widgets become "garbled" and will not repaint properly. + * It does not help to attempt to paint explicitly with low-level X functions into that problematic region, + * and I could not figure out why such an attempted fix does not work, when we paint in the on_map()-Event. + * We can paint just fine with the same low-level functions from within the put() call. + * + * Anyhow, as such the XV display works correct even in such cases, but it looks "broken" :-( + */ } if (gotPort) diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 7e35e2c21..e64b0ffe9 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -130337,10 +130337,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + - + @@ -130355,6 +130355,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + + @@ -130390,7 +130394,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -130400,12 +130404,480 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + + + + + + + + + + + + + + + + +

+ wenn man beispielsweise zwar einen XV_COLORKEY setzen kann, aber kein XV_AUTOPAINT_COLORKEY +

+ +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + +

+ ...dann kann ich das ganze Fenster füllen, durchaus auch mit beliebigen Farben (wobei hier eine Falle wartet, da die Farbtiefe unterschiedlich sein könnte). +

+ +
+ + + + +

+ dixplay_x11.c, line 623 +

+

+ +

+
+
+

+ static inline void  xv_draw_colorkey(void) { +

+

+ XSetForeground( xj_dpy, xj_gc,  0 ); +

+

+ if (xj_box[1] >  0 ) { +

+

+ XFillRectangle( xj_dpy, xj_win,  xj_gc, 0, 0,  xj_box[2], xj_box[1]); +

+

+ XFillRectangle( xj_dpy, xj_win,  xj_gc, 0, xj_box[1]+xj_box[3],  xj_box[2], xj_box[1]+xj_box[3]+xj_box[1]); +

+

+ } /* else */ +

+

+ if (xj_box[0] >  0 ) { +

+

+ XFillRectangle( xj_dpy, xj_win,  xj_gc, 0, 0,  xj_box[0], xj_box[3]); +

+

+ XFillRectangle( xj_dpy, xj_win,  xj_gc, xj_box[0]+xj_box[2],  0, xj_box[0]+xj_box[2]+xj_box[0],  xj_box[3]); +

+

+ } +

+

+ } +

+

+ +

+
+
+

+ +

+

+ ... verwende dann in XSetForeground ggfs eine andere Farbe, wie 0x00FF00 für Grün +

+ +
+ +
+ + + + + + + + + + + + + + + + + +

+     number of attributes: 7 +

+

+       "XV_SET_DEFAULTS" (range 0 to 0) +

+

+               client settable attribute +

+

+       "XV_ITURBT_709" (range 0 to 1) +

+

+               client settable attribute +

+

+               client gettable attribute (current value is 0) +

+

+       "XV_SYNC_TO_VBLANK" (range 0 to 1) +

+

+               client settable attribute +

+

+               client gettable attribute (current value is 1) +

+

+       "XV_BRIGHTNESS" (range -1000 to 1000) +

+

+               client settable attribute +

+

+               client gettable attribute (current value is 0) +

+

+       "XV_CONTRAST" (range -1000 to 1000) +

+

+               client settable attribute +

+

+               client gettable attribute (current value is 0) +

+

+       "XV_SATURATION" (range -1000 to 1000) +

+

+               client settable attribute +

+

+               client gettable attribute (current value is 0) +

+

+       "XV_HUE" (range -1000 to 1000) +

+

+               client settable attribute +

+

+               client gettable attribute (current value is 0) +

+

+     maximum XvImage size: 16384 x 16384 +

+

+     Number of image formats: 4 +

+

+       id: 0x32595559 (YUY2) +

+

+         guid: 59555932-0000-0010-8000-00aa00389b71 +

+

+         bits per pixel: 16 +

+

+         number of planes: 1 +

+

+         type: YUV (packed) +

+

+       id: 0x32315659 (YV12) +

+

+         guid: 59563132-0000-0010-8000-00aa00389b71 +

+

+         bits per pixel: 12 +

+

+         number of planes: 3 +

+

+         type: YUV (planar) +

+

+       id: 0x59565955 (UYVY) +

+

+         guid: 55595659-0000-0010-8000-00aa00389b71 +

+

+         bits per pixel: 16 +

+

+         number of planes: 1 +

+

+         type: YUV (packed) +

+

+       id: 0x30323449 (I420) +

+

+         guid: 49343230-0000-0010-8000-00aa00389b71 +

+

+         bits per pixel: 12 +

+

+         number of planes: 3 +

+

+         type: YUV (planar) +

+ +
+
+ + + + +

+ number of attributes: 5 +

+

+ "XV_COLORKEY" (range 0 to 16777215) +

+

+ client settable attribute +

+

+ client gettable attribute (current value is 2110) +

+

+ "XV_BRIGHTNESS" (range -128 to 127) +

+

+ client settable attribute +

+

+ client gettable attribute (current value is 0) +

+

+ "XV_CONTRAST" (range 0 to 255) +

+

+ client settable attribute +

+

+ client gettable attribute (current value is 128) +

+

+ "XV_SATURATION" (range 0 to 255) +

+

+ client settable attribute +

+

+ client gettable attribute (current value is 128) +

+

+ "XV_HUE" (range -180 to 180) +

+

+ client settable attribute +

+

+ client gettable attribute (current value is 0) +

+

+ maximum XvImage size: 1024 x 1024 +

+

+ Number of image formats: 7 +

+

+ id: 0x32595559 (YUY2) +

+

+ guid: 59555932-0000-0010-8000-00aa00389b71 +

+

+ bits per pixel: 16 +

+

+ number of planes: 1 +

+

+ type: YUV (packed) +

+

+ id: 0x32315659 (YV12) +

+

+ guid: 59563132-0000-0010-8000-00aa00389b71 +

+

+ bits per pixel: 12 +

+

+ number of planes: 3 +

+

+ type: YUV (planar) +

+

+ id: 0x30323449 (I420) +

+

+ guid: 49343230-0000-0010-8000-00aa00389b71 +

+

+ bits per pixel: 12 +

+

+ number of planes: 3 +

+

+ type: YUV (planar) +

+

+ id: 0x36315652 (RV16) +

+

+ guid: 52563135-0000-0000-0000-000000000000 +

+

+ bits per pixel: 16 +

+

+ number of planes: 1 +

+

+ type: RGB (packed) +

+

+ depth: 0 +

+

+ red, green, blue masks: 0x1f, 0x3e0, 0x7c00 +

+

+ id: 0x35315652 (RV15) +

+

+ guid: 52563136-0000-0000-0000-000000000000 +

+

+ bits per pixel: 16 +

+

+ number of planes: 1 +

+

+ type: RGB (packed) +

+

+ depth: 0 +

+

+ red, green, blue masks: 0x1f, 0x7e0, 0xf800 +

+

+ id: 0x31313259 (Y211) +

+

+ 222 +

+

+ guid: 59323131-0000-0010-8000-00aa00389b71 +

+

+ bits per pixel: 6 +

+

+ number of planes: 3 +

+

+ type: YUV (packed) +

+

+ id: 0x0 +

+

+ guid: 00000000-0000-0000-0000-000000000000 +

+

+ bits per pixel: 0 +

+

+ number of planes: 0 +

+

+ type: RGB (packed) +

+

+ depth: 1 +

+

+ red, green, blue masks: 0x0, 0x0, 0x0 +

+ +
+
+
+
+ + + + + + + + + + - + + + + + + + + + @@ -130439,7 +130911,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + + + @@ -130451,7 +130925,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -130475,7 +130949,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - + @@ -130653,8 +131127,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - - + + @@ -130711,10 +131185,22 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) - - - - + + + + + + + + +

+ Es ist ein sehr alter Standard, durchaus komplex und detailiertere Doku ist kaum noch zu finden (-> Einzelfragen auf Stackoverflow). Manpages sind, wie üblich, nur dann sinnvoll, wenn man schon weiß, worum es geht). Hinzu kommt, daß es wohl erhebliche Streubreite gibt bzgl. der Implementierung. »Beispielsweise« unterstützt meine uralt-Nvidia-Karte nicht das automatische Keying (Attribut XV_COLORKEY und XV_AUTOPAINT_COLORKEY sind nicht definiert, aber der X-Treiber macht ein Auto-Keying auf dem gesamten X-Window und das ist problematisch mit den Dockingpanels, die das gleiche XWindow verwenden) +

+ +
+ + +
@@ -161076,7 +161562,7 @@ unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<vo - + @@ -166915,6 +167401,22 @@ that situation will improve in forseeable future. + + + + +

+ Weil da nun die Kopfzeile (Docking-Panel) nicht richtig gezeichnet wird, bzw. pseudo-transparent wird. +

+

+ Abbruch. Es zeigt sich, daß meine Grafikkarte das Auto-Keying von XV nicht unterstützt, d.h. die Attribute XV_AUTOPAINT_COLORKEY und XV_COLORKEY sind nicht definiert. Habe noch mind. 2 Stunden herumexperimentiert, bin aber auf keinen »grünen Zweig« gekommen. Diese Erfahrung läßt es für mich sehr fraglich erscheinen, ob wir XV unterstützen sollen....? +

+ +
+ + + +