[vdr] Trouble with softdevice -vo dfb:mgatv OSD with vdr 2.0.4

Marko Mäkelä marko.makela at iki.fi
Fri Nov 1 22:19:48 CET 2013

Hi all,

I used to follow the vdr development between 1.3.x and 1.6.0. I stopped 
updating my system around 2007, because it was working well enough for 

This year, I bought a Samsung SmartTV, hoping that it could be replace 
the old PC. Little did I know that the USB interface does not deliver 
enough power to USB-powered hard disks, or that the TV wants to encrypt 
all recordings with a device-specific key, in *.srf files.

So, I decided to revive my aging VDR setup, and maybe use DLNA or the 
as the primary output method once the system has been upgraded. I 
installed a recent Debian distribution and compiled vdr 2.0.4, DirectFB 
1.0.1, DFB++ 1.0.1, ffmpeg (latest 0.5 or 0.6 IIRC; 0.9 was already too 
new) and latest softdevice-cvs. I had to patch softdevice a little.

Finally, I got a smooth picture with -P'softdevice -vo dfb:mgatv' on a 
nearly-HDTV VGA panel. Not bad for 11-year-old hardware.

The only remaining problem is that I do not see any OSD menu. Usually 
when I activate the OSD, I get a random square (often white) somewhere, 
sometimes on the top left corner of the screen. It turned out that this 
square is being written by osd.c. cSoftOsd in softdevice is derived from 
cOsd. It overrides cOsd::SetAreas() so that it can ignore OSD events 
when the output is suspended. Otherwise, it is just calling the method 
in the base class. You can see the code at


 From the Softdevice diagnostic messages and code I understood that the 
Matrox MGA450 might not support an alpha channel on the primary layer 
that is overlaid on top of the back end scaler (BES) layer. Instead, it 
could simply be a color key (black is transparent). The pixel format of 
the OSD seems to be 32bpp nevertheless.

The problematic code is in cOsd::SetAreas(), vdr-2.0.4/osd.c:1811 

      isTrueColor = NumAreas == 1 && Areas[0].bpp == 32;
      if (isTrueColor) {
	width = Areas[0].x2 - Areas[0].x1 + 1;
	height = Areas[0].y2 - Areas[0].y1 + 1;
	cPixmap *Pixmap = CreatePixmap(0, cRect(Areas[0].x1, Areas[0].y1, width, height));
	bitmaps[numBitmaps++] = new cBitmap(10, 10, 8); // dummy bitmap for GetBitmap()
      else {

If I change the assignment to isTrueColor=false, the square goes away 
and I will get the familiar gray rectangles on the screen (from the 
"else" block that I omitted above). For example, when I press OK, there 
will be a rectangle at the bottom. Unfortunately, the rectangles are all 
gray, no other colours or text in them. According to strace, fontconfig 
and some *.ttf fonts are being loaded, so I suppose that the graphics 
are being generated, and the problem is somewhere in cOsd or cSoftOsd.

Could someone help me get more than the rectangles on the screen?

Best regards,


More information about the vdr mailing list