Index: libs/libmythtv/siparser.cpp
===================================================================
--- libs/libmythtv/siparser.cpp	(revision 9489)
+++ libs/libmythtv/siparser.cpp	(working copy)
@@ -1028,6 +1028,7 @@
 #ifdef USING_DVB_EIT
     uint bestPrioritySE   = UINT_MAX;
     uint bestPriorityEE   = UINT_MAX;
+    unsigned char enc[1] = {'0x05'};
 
     for (uint i = 0; i < eit->EventCount(); i++)
     {
@@ -1089,7 +1090,17 @@
             }
 
             ExtendedEventDescriptor eed(bestDescriptorsEE[j]);
-            event.Description += eed.Text();
+            // just hardcoded values for fixing Pro7Sat.1 EPG
+            if ((event.NetworkID == 8468) && (event.TransportID == 769))
+            {
+                event.Description += eed.TextByEncoding(enc, 1);
+                VERBOSE(VB_EIT, "SIParser: Fixing wrong character encoding for event on " +
+                        QString("ServiceID: %1 TransportID: %2 NetworkID: %3")
+                        .arg(event.ServiceID).arg(event.TransportID)
+                        .arg(event.NetworkID));
+            }
+            else
+                event.Description += eed.Text();
         }
 
         // Parse short event descriptor for the most preferred language
@@ -1097,8 +1108,21 @@
         {
             ShortEventDescriptor sed(bestDescriptorSE);
             event.LanguageCode    = sed.CanonicalLanguageString();
-            event.Event_Name      = sed.EventName();
-            event.Event_Subtitle  = sed.Text();
+            // just hardcoded values for fixing Pro7Sat.1 EPG
+            if ((event.NetworkID == 8468) && (event.TransportID == 769))
+            {
+                event.Event_Name      = sed.EventNameByEncoding(enc, 1);
+                event.Event_Subtitle  = sed.TextByEncoding(enc, 1);
+                VERBOSE(VB_EIT, "SIParser: Fixing wrong character encoding for event on " +
+                        QString("ServiceID: %1 TransportID: %2 NetworkID: %3")
+                        .arg(event.ServiceID).arg(event.TransportID)
+                        .arg(event.NetworkID));
+            }
+            else
+            {
+                event.Event_Name      = sed.EventName();
+                event.Event_Subtitle  = sed.Text();
+            }
             if (event.Event_Subtitle == event.Event_Name)
                 event.Event_Subtitle = "";
         }
Index: libs/libmythtv/mpeg/dvbdescriptors.cpp
===================================================================
--- libs/libmythtv/mpeg/dvbdescriptors.cpp	(revision 9489)
+++ libs/libmythtv/mpeg/dvbdescriptors.cpp	(working copy)
@@ -63,7 +63,7 @@
 }
 
 // Decode a text string according to ETSI EN 300 468 Annex A
-QString dvb_decode_text(const unsigned char *src, uint raw_length)
+QString dvb_decode_text(const unsigned char *src, uint raw_length, const unsigned char * encoding, uint enc_length)
 {
     if (!raw_length)
         return "";
@@ -77,9 +77,17 @@
     }
 
     // Strip formatting characters
-    char dst[raw_length];
+    char dst[raw_length+enc_length];
     uint length = 0;
-    for (uint i = 0; i < raw_length; i++)
+    // if a override encoding is specified copy it in front of the text
+    if (encoding)
+        for (uint i = 0; i < enc_length; i++)
+        {
+            dst[length] = encoding[i];
+            length++;
+        }
+    
+    for (uint i = length; i < raw_length; i++)
     {
         if ((src[i] < 0x80) || (src[i] > 0x9F))
         {
@@ -97,6 +105,7 @@
     if (buf[0] >= 0x20)
     {
         return decode_iso6937((unsigned char*)buf, length);
+        //return QString::fromLatin1(buf, length);
     }
     else if ((buf[0] >= 0x01) && (buf[0] <= 0x0B))
     {
Index: libs/libmythtv/mpeg/dvbdescriptors.h
===================================================================
--- libs/libmythtv/mpeg/dvbdescriptors.h	(revision 9489)
+++ libs/libmythtv/mpeg/dvbdescriptors.h	(working copy)
@@ -38,7 +38,9 @@
 
 static QString coderate_inner(uint coderate);
 
-extern QString dvb_decode_text(const unsigned char *src, uint length);
+extern QString dvb_decode_text(const unsigned char *src, uint length,
+                               const unsigned char * encoding=NULL,
+                               uint enc_length=0);
 
 #define byteBCDH2int(i) (i >> 4)
 #define byteBCDL2int(i) (i & 0x0f)
@@ -825,6 +827,10 @@
     // for (i=0; i<N; i++) { text_char 8 } 
     QString Text(void) const
         { return dvb_decode_text(&_data[8 + _data[6]], TextLength()); }
+    QString TextByEncoding(const unsigned char * encoding, uint length) const
+        { return dvb_decode_text(&_data[8 + _data[6]], TextLength(), encoding,
+                                 length);
+        }
     QString toString() const { return QString("ExtendedEventDescriptor(stub)"); }
 };
 
@@ -1231,11 +1237,15 @@
     // for (i=0;i<event_name_length;i++) { event_name_char 8 }
     QString EventName(void) const
         { return dvb_decode_text(&_data[6], _data[5]); }
+    QString EventNameByEncoding(const unsigned char * encoding, uint length) const
+        { return dvb_decode_text(&_data[6], _data[5], encoding, length); }
     // text_length              8
     uint TextLength(void) const { return _data[6 + _data[5]]; }
     // for (i=0;i<text_length;i++) { text_char 8 }
     QString Text(void) const
         { return dvb_decode_text(&_data[7 + _data[5]], TextLength()); }
+    QString TextByEncoding(const unsigned char * encoding, uint length) const
+        { return dvb_decode_text(&_data[7 + _data[5]], TextLength(), encoding, length); }
 
     QString toString() const
         { return LanguageString() + " : " + EventName() + " : " + Text(); }
