From be253dbf68916bdff1eeb0b7a67fc4edb7728116 Mon Sep 17 00:00:00 2001
From: angelaschmid <angela.schmid@wolke7.net>
Date: Tue, 25 Mar 2014 18:59:13 +0100
Subject: [PATCH] FIX: UPC subtitle

---
 mythtv/libs/libmythtv/eithelper.cpp         | 16 +++++++++++++++-
 mythtv/libs/libmythtv/mpeg/dvbdescriptors.h | 27 +++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/mythtv/libs/libmythtv/eithelper.cpp b/mythtv/libs/libmythtv/eithelper.cpp
index bf980ed..428e36b 100644
--- a/mythtv/libs/libmythtv/eithelper.cpp
+++ b/mythtv/libs/libmythtv/eithelper.cpp
@@ -583,6 +583,17 @@ void EITHelper::AddEIT(const DVBEventInformationTable *eit)
             EITFixUp::TimeFix(starttime);
         QDateTime endtime   = starttime.addSecs(eit->DurationInSeconds(i));
 
+        if (subtitle.isEmpty()) {
+            desc_list_t SubTitleIds = MPEGDescriptor::FindAll(list, 0xa7);
+            for (uint j = 0; j < SubTitleIds.size(); j++) {
+                SubTitleUPCCablecomDescriptor desc(SubTitleIds[j]);
+
+                if (!desc.SubTitleUPCCablecomCountryCode().isEmpty()) {
+                    subtitle = desc.SubTitleUPCCablecomSubTitle();
+                }
+            }
+        }
+
         DBEventEIT *event = new DBEventEIT(
             chanid,
             title,     subtitle,      description,
@@ -1246,7 +1257,10 @@ static void init_fixup(QMap<uint64_t,uint> &fix)
 
     // DVB-C T-Kábel Hungary
     // FIXME this should be more specific. Is the encoding really wrong for all services?
-    fix[  100 << 16] = EITFixUp::kEFixForceISO8859_2; 
+    fix[  100 << 16] = EITFixUp::kEFixForceISO8859_2;
+
+    // DVB-C UPC Cablecom Switzerland
+    fix[ 1U << 16] |= EITFixUp::kFixGenericDVB;
 }
 
 /** \fn EITHelper::RescheduleRecordings(void)
diff --git a/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h b/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h
index 682e5b5..5c4f304 100644
--- a/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h
+++ b/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h
@@ -1325,6 +1325,33 @@ class ParentalRatingDescriptor : public MPEGDescriptor
     // }
 };
 
+class SubTitleUPCCablecomDescriptor : public MPEGDescriptor
+{
+    public:
+      SubTitleUPCCablecomDescriptor(const unsigned char *data, int len = 300) :
+          MPEGDescriptor(data, len, 0xa7) { }
+     //       Name             bits  loc  expected value
+     // descriptor_tag           8   0.0       0xa7
+     // descriptor_length        8   1.0
+     uint Count(void) const { return DescriptorLength(); }
+
+     // for (i=0; i<N; i++)
+     // {
+     //   country_code           3
+     //   unknown                1
+     //   subtitle              31
+
+     uint UPCCablecomDescriptorSubTitleLength(void) const { return _data[1] - 3; }
+     // for (i=0;i<N;I++) { char 8 }
+     QString SubTitleUPCCablecomCountryCode(void) const
+         { return dvb_decode_text(_data + 2, 3); }
+     QString SubTitleUPCCablecomSubTitle(void) const
+     {
+         return dvb_decode_text(_data + 5, UPCCablecomDescriptorSubTitleLength());
+     }
+     // }
+};
+
 // DVB Bluebook A038 (Sept 2011) p 78 (see also ETSI EN 300 231 PDC)
 class PDCDescriptor : public MPEGDescriptor
 {
-- 
1.9.1

