small extensions
[enigma2.git] / lib / dvb / epgcache.cpp
index 975d46ac0cacf94512c742237f37e6bb3e81201f..59c62037dc156e28e2bad06fe1ff85d208ff9b26 100644 (file)
@@ -1532,6 +1532,7 @@ PyObject *eEPGCache::lookupEvent(PyObject *list, PyObject *convertFunc)
                PyObject *item=PyList_GET_ITEM(list, listIt++); // borrowed reference!
                if (PyTuple_Check(item))
                {
+                       bool service_changed=false;
                        int type=0;
                        long event_id=-1;
                        time_t stime=-1;
@@ -1579,6 +1580,24 @@ PyObject *eEPGCache::lookupEvent(PyObject *list, PyObject *convertFunc)
                                eDebug("service reference for epg query is not valid");
                                continue;
                        }
+
+                       // redirect subservice querys to parent service
+                       eServiceReferenceDVB &dvb_ref = (eServiceReferenceDVB&)ref;
+                       if (dvb_ref.getParentTransportStreamID().get()) // linkage subservice
+                       {
+                               eServiceCenterPtr service_center;
+                               if (!eServiceCenter::getPrivInstance(service_center))
+                               {
+                                       dvb_ref.setTransportStreamID( dvb_ref.getParentTransportStreamID() );
+                                       dvb_ref.setServiceID( dvb_ref.getParentServiceID() );
+                                       dvb_ref.setParentTransportStreamID(eTransportStreamID(0));
+                                       dvb_ref.setParentServiceID(eServiceID(0));
+                                       dvb_ref.name="";
+                                       service = PyString_FromString(dvb_ref.toString().c_str());
+                                       service_changed = true;
+                               }
+                       }
+
                        PyObject *service_name=NULL;
                        if (must_get_service_name)
                        {
@@ -1628,6 +1647,8 @@ PyObject *eEPGCache::lookupEvent(PyObject *list, PyObject *convertFunc)
                                if (ret)
                                        return ret;
                        }
+                       if (service_changed)
+                               Py_DECREF(service);
                        if (service_name)
                                Py_DECREF(service_name);
                }
@@ -2097,7 +2118,7 @@ void eEPGCache::PMTready(eDVBServicePMTHandler *pmthandler)
                                if (tmp==3)
                                {
                                        eServiceReferenceDVB ref;
-                                       if (!pmthandler->getService(ref))
+                                       if (!pmthandler->getServiceReference(ref))
                                        {
                                                int pid = (*es)->getPid();
                                                messages.send(Message(Message::got_private_pid, ref, pid));
@@ -2195,6 +2216,14 @@ void eEPGCache::privateSectionRead(const uniqueEPGKey &current_service, const __
                        onid |= data[ptr++];
                        int sid = data[ptr++] << 8;
                        sid |= data[ptr++];
+
+// WORKAROUND for wrong transmitted epg data
+                       if ( onid == 0x85 && tsid == 0x11 && sid == 0xd3 )  // premiere sends wrong tsid here
+                               tsid = 0x1;
+                       else if ( onid == 0x85 && tsid == 0x3 && sid == 0xf5 ) // premiere sends wrong sid here
+                               sid = 0xdc;
+////////////////////////////////////////////
+                               
                        uniqueEPGKey service( sid, onid, tsid );
                        descr_len -= 6;
                        while( descr_len > 0 )