m_use_decode_demux = 0;
m_pmt_pid = -1;
m_dsmcc_pid = -1;
- m_isstreamclient = false;
+ m_service_type = livetv;
+ m_descramble = true;
+ m_ca_disabled = false;
+ m_pmt_ready = false;
eDVBResourceManager::getInstance(m_resourceManager);
CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready);
CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready);
case iDVBChannel::evtSOF:
serviceEvent(eventSOF);
break;
+ case iDVBChannel::evtFailed+3:
+ serviceEvent(eventNoDiskSpace);
+ break;
default:
break;
}
}
+void eDVBServicePMTHandler::registerCAService()
+{
+ int demuxes[2] = {0,0};
+ uint8_t demuxid;
+ m_demux->getCADemuxID(demuxid);
+ demuxes[0]=demuxid;
+ if (m_decode_demux_num != 0xFF)
+ demuxes[1]=m_decode_demux_num;
+ else
+ demuxes[1]=demuxes[0];
+ eDVBCAService::register_service(m_reference, demuxes, m_ca_servicePtr);
+}
+
void eDVBServicePMTHandler::PMTready(int error)
{
if (error)
serviceEvent(eventNoPMT);
else
{
+ m_pmt_ready = true;
m_have_cached_program = false;
serviceEvent(eventNewProgramInfo);
+
mDemuxId = m_decode_demux_num;
- if (!m_pvr_channel) // don't send campmt to camd.socket for playbacked services
+ if (!m_pvr_channel)
{
eEPGCache::getInstance()->PMTready(this);
- if(!m_ca_servicePtr && !m_isstreamclient)
+ }
+
+ if (m_descramble)
+ {
+ if(!m_ca_servicePtr)
+ {
+ registerCAService();
+ }
+ if (!m_ca_disabled)
{
- int demuxes[2] = {0,0};
- uint8_t tmp;
- m_demux->getCADemuxID(tmp);
- demuxes[0]=tmp;
- if (m_decode_demux_num != 0xFF)
- demuxes[1]=m_decode_demux_num;
- else
- demuxes[1]=demuxes[0];
- eDVBCAService::register_service(m_reference, demuxes, m_ca_servicePtr);
eDVBCIInterfaces::getInstance()->recheckPMTHandlers();
+ eDVBCIInterfaces::getInstance()->gotPMT(this);
}
- eDVBCIInterfaces::getInstance()->gotPMT(this);
}
if (m_ca_servicePtr)
{
else
eDebug("eDVBServicePMTHandler cannot call buildCAPMT");
}
+
+ if (m_service_type == pvrDescramble)
+ serviceEvent(eventStartPvrDescramble);
}
}
program.pmtPid = -1;
program.textPid = -1;
program.aitPid = -1;
+ program.isCached = false;
+ program.pmtVersion = -1;
int first_ac3 = -1;
program.defaultAudioStream = 0;
eDVBTableSpec table_spec;
ptr->getSpec(table_spec);
program.pmtPid = table_spec.pid < 0x1fff ? table_spec.pid : -1;
+ program.pmtVersion = table_spec.version;
std::vector<ProgramMapSection*>::const_iterator i;
for (i = ptr->getSections().begin(); i != ptr->getSections().end(); ++i)
{
int cached_pcrpid = m_service->getCacheEntry(eDVBService::cPCRPID),
vpidtype = m_service->getCacheEntry(eDVBService::cVTYPE),
cnt=0;
+
+ program.isCached = true;
+
if ( vpidtype == -1 )
vpidtype = videoStream::vtMPEG2;
if ( cached_vpid != -1 )
}
}
-int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue, bool simulate, eDVBService *service)
+int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue, bool simulate, eDVBService *service, serviceType type, bool descramble)
{
ePtr<iTsSource> s;
- return tuneExt(ref, use_decode_demux, s, NULL, cue, simulate, service);
+ return tuneExt(ref, use_decode_demux, s, NULL, cue, simulate, service, type, descramble);
}
-int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr<iTsSource> &source, const char *streaminfo_file, eCueSheet *cue, bool simulate, eDVBService *service, bool isstreamclient)
+int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr<iTsSource> &source, const char *streaminfo_file, eCueSheet *cue, bool simulate, eDVBService *service, serviceType type, bool descramble)
{
RESULT res=0;
m_reference = ref;
m_use_decode_demux = use_decode_demux;
m_no_pat_entry_delay->stop();
- m_isstreamclient = isstreamclient;
+ m_service_type = type;
+ m_descramble = descramble;
/* use given service as backup. This is used for timeshift where we want to clone the live stream using the cache, but in fact have a PVR channel */
m_service = service;
if (!simulate)
eDebug("allocate Channel: res %d", res);
+ if (!res)
+ serviceEvent(eventChannelAllocated);
+
ePtr<iDVBChannelList> db;
if (!m_resourceManager->getChannelList(db))
db->getService((eServiceReferenceDVB&)m_reference, m_service);
- if (!res && !simulate)
+ if (!res && !simulate && m_descramble && !m_ca_disabled)
eDVBCIInterfaces::getInstance()->addPMTHandler(this);
} else if (!simulate) // no simulation of playback services
{
eDebug("alloc PVR");
/* allocate PVR */
eDVBChannelID chid;
- if (m_isstreamclient) ref.getChannelID(chid);
+ if (m_service_type == streamclient) ref.getChannelID(chid);
res = m_resourceManager->allocatePVRChannel(chid, m_pvr_channel);
if (res)
+ {
eDebug("allocatePVRChannel failed!\n");
+ }
+ else if (descramble)
+ {
+ eDVBCIInterfaces::getInstance()->addPMTHandler(this);
+ }
m_channel = m_pvr_channel;
}
m_pvr_channel->setCueSheet(cue);
if (m_pvr_channel->getDemux(m_pvr_demux_tmp, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode))
- {
- if (m_isstreamclient)
- {
- eDebug("Allocating %s-decoding a demux for http channel failed.", m_use_decode_demux ? "" : "non-");
- return -2;
- }
- else
- eDebug("Allocating %s-decoding a demux for PVR channel failed.", m_use_decode_demux ? "" : "non-");
- }
+ eDebug("[eDVBServicePMTHandler] Allocating %s-decoding a demux for PVR channel failed.", m_use_decode_demux ? "" : "non-");
else if (source)
m_pvr_channel->playSource(source, streaminfo_file);
else
m_demux = 0;
}
+void eDVBServicePMTHandler::addCaHandler()
+{
+ m_ca_disabled = false;
+ if (m_channel)
+ {
+ eDVBCIInterfaces::getInstance()->addPMTHandler(this);
+ if (m_pmt_ready)
+ {
+ eDVBCIInterfaces::getInstance()->recheckPMTHandlers();
+ eDVBCIInterfaces::getInstance()->gotPMT(this);
+ }
+ }
+}
+
+void eDVBServicePMTHandler::removeCaHandler()
+{
+ m_ca_disabled = true;
+ if (m_channel)
+ eDVBCIInterfaces::getInstance()->removePMTHandler(this);
+}
+
+bool eDVBServicePMTHandler::isCiConnected()
+{
+ eDVBCIInterfaces::getInstance()->isCiConnected(this);
+}
+
CAServiceMap eDVBCAService::exist;
ChannelMap eDVBCAService::exist_channels;
ePtr<eConnection> eDVBCAService::m_chanAddedConn;