vdr-1.5.10, dxr3 and subtitles

Message ID ae19db840711040343h500c0800l8cf9cbc49d9a3b0f@mail.gmail.com
State New
Headers

Commit Message

Ville Aakko Nov. 4, 2007, 11:43 a.m. UTC
  2007/11/3, Klaus Schmidinger <Klaus.Schmidinger@cadsoft.de>:

> VDR reduces the colors if the output device can't display all of them.
>
> Maybe the dxr3 device doesn't correctly respond to the CanHandleAreas()
> call?
>
> See cDvbSubtitleConverter::FinishPage(), the calls to sr->ReduceBpp()
> and sr->ShrinkBpp().

Yes, I think you are probably right. I looked at the code and modified
it so that bpp ís always reduced to 2 (I think) - hack included. I'm
not a programmer and know nothing about C++, really. But it works for
me (kind of - see below). Of course, this is not a proper fix.

But, I think from previous the discussion here, that the color depth
dxr3 can handle isn't that straightforward for. It can handle 8bpp but
in a limited way; so just reducing bpp would not use the dxr3 hardware
to the full potential. Some additional checking and processing is
needed? Though I'm just an end user really, I don't know really, I'm
kind of guessing =). Anyways, the subtitles look really good even with
2bpp, so in this case I think just reducing is sufficient.

There's still problem even after reducing the bpp; I think the OSD
levels isn't properly implemented in the CVS (dxr3-0-2 branch). I'll
post about this in the dxr3plugin-users list. (Symptoms: No other OSD
is shown while subtitles are shown, previous subtitles aren't
"cleared").

 - Ville
  

Patch

diff -Naur vdr-1.5.10/dvbsubtitle.c vdr-1.5.10.old/dvbsubtitle.c
--- vdr-1.5.10/dvbsubtitle.c	2007-11-04 13:01:35.000000000 +0200
+++ vdr-1.5.10.old/dvbsubtitle.c	2007-11-04 12:59:42.000000000 +0200
@@ -984,10 +984,10 @@ 
   int NumAreas = Page->regions.Count();
   int Bpp = 8;
   bool Reduced = false;
-//  while (osd->CanHandleAreas(Areas, NumAreas) != oeOk) {
+  while (osd->CanHandleAreas(Areas, NumAreas) != oeOk) {
         int HalfBpp = Bpp / 2;
         if (HalfBpp >= 2) {
-           while (int i = 0; i < NumAreas; i++) {
+           for (int i = 0; i < NumAreas; i++) {
                if (Areas[i].bpp >= Bpp) {
                   Areas[i].bpp = HalfBpp;
                   Reduced = true;
@@ -997,7 +997,7 @@ 
            }
         else
            return; // unable to draw bitmaps
-//        }
+        }
   if (Reduced) {
      for (int i = 0; i < NumAreas; i++) {
          cSubtitleRegion *sr = Page->regions.Get(i);