X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/8acc9a009ec9412ab25acef4e02a27d4e9f905d9..06ca56e60c8d3e13d161b481b7716303bd3aa9f2:/lib/dvb/epgcache.cpp diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp index 975d46ac..59c62037 100644 --- a/lib/dvb/epgcache.cpp +++ b/lib/dvb/epgcache.cpp @@ -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 ¤t_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 )