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 me.
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 http://projects.vdr-developer.org/projects/plg-smarttvweb/wiki/SamsungSmartT... 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
http://cvs.berlios.de/cgi-bin/viewcvs.cgi/softdevice/softdevice/SoftOsd.c?vi...
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 onwards:
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)); Pixmap->Clear(); 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,
Marko