X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ed30a988dddec12985a44e7bc10fcae91a29a751..ad88a7130bd75fa1f932d4ae45a8ebee78df4fc3:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index f7767541..5ea47467 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -15,6 +15,7 @@ eDVBServicePMTHandler::eDVBServicePMTHandler() :m_ca_servicePtr(0), m_decode_demux_num(0xFF) { m_use_decode_demux = 0; + m_pmt_pid = -1; eDVBResourceManager::getInstance(m_resourceManager); CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready); CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready); @@ -22,22 +23,7 @@ eDVBServicePMTHandler::eDVBServicePMTHandler() eDVBServicePMTHandler::~eDVBServicePMTHandler() { - if (m_ca_servicePtr) - { - eDebug("unregister caservice"); - 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]; - ePtr > ptr; - m_PMT.getCurrent(ptr); - eDVBCAService::unregister_service(m_reference, demuxes, ptr); - eDVBCIInterfaces::getInstance()->removePMTHandler(this); - } + free(); } void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) @@ -50,7 +36,7 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) { if (m_channel) if (m_channel->getDemux(m_demux, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode)) - eDebug("Allocating a demux for now tuned-in channel failed."); + eDebug("Allocating %s-decoding a demux for now tuned-in channel failed.", m_use_decode_demux ? "" : "non-"); serviceEvent(eventTuned); @@ -58,7 +44,10 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) { eDebug("ok ... now we start!!"); - m_PAT.begin(eApp, eDVBPATSpec(), m_demux); + if (m_pmt_pid == -1) + m_PAT.begin(eApp, eDVBPATSpec(), m_demux); + else + m_PMT.begin(eApp, eDVBPMTSpec(m_pmt_pid, m_reference.getServiceID().get()), m_demux); if ( m_service && !m_service->cacheEmpty() ) serviceEvent(eventNewProgramInfo); @@ -78,6 +67,9 @@ void eDVBServicePMTHandler::channelEvent(iDVBChannel *channel, int event) case iDVBChannel::evtEOF: serviceEvent(eventEOF); break; + case iDVBChannel::evtSOF: + serviceEvent(eventSOF); + break; default: break; } @@ -153,7 +145,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) program.pmtPid = -1; program.textPid = -1; - if (!m_PMT.getCurrent(ptr)) + if ( ((m_service && m_service->usePMT()) || !m_service) && !m_PMT.getCurrent(ptr)) { int cached_apid_ac3 = -1; int cached_apid_mpeg = -1; @@ -358,6 +350,8 @@ int eDVBServicePMTHandler::getDecodeDemux(ePtr &demux) demux = m_demux; return ret; } + + ASSERT(m_channel); /* calling without a previous ::tune is certainly bad. */ ret = m_channel->getDemux(demux, iDVBChannel::capDecode); if (!ret) @@ -375,7 +369,7 @@ int eDVBServicePMTHandler::getPVRChannel(ePtr &pvr_channel) return -1; } -int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux) +int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue) { RESULT res; m_reference = ref; @@ -394,8 +388,22 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux) eDVBMetaParser parser; if (parser.parseFile(ref.path)) - eWarning("no .meta file found, trying original service ref."); - else + { + eWarning("no .meta file found, trying to find PMT pid"); + eDVBTSTools tstools; + if (tstools.openFile(ref.path.c_str())) + eWarning("failed to open file"); + else + { + int service_id, pmt_pid; + if (!tstools.findPMT(pmt_pid, service_id)) + { + eDebug("PMT pid found on pid %04x, service id %d", pmt_pid, service_id); + m_reference.setServiceID(service_id); + m_pmt_pid = pmt_pid; + } + } + } else m_reference = parser.m_ref; eDebug("alloc PVR"); @@ -405,7 +413,11 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux) eDebug("allocatePVRChannel failed!\n"); m_channel = m_pvr_channel; } - + + ePtr db; + if (!m_resourceManager->getChannelList(db)) + db->getService((eServiceReferenceDVB&)m_reference, m_service); + if (m_channel) { m_channel->connectStateChange( @@ -424,17 +436,38 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux) } if (m_pvr_channel) + { + m_pvr_channel->setCueSheet(cue); m_pvr_channel->playFile(ref.path.c_str()); - - ePtr db; - if (!m_resourceManager->getChannelList(db)) - db->getService((eServiceReferenceDVB&)m_reference, m_service); + } return res; } void eDVBServicePMTHandler::free() { + if (m_ca_servicePtr) + { + 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]; + ePtr > ptr; + m_PMT.getCurrent(ptr); + eDVBCAService::unregister_service(m_reference, demuxes, ptr); + eDVBCIInterfaces::getInstance()->removePMTHandler(this); + m_ca_servicePtr = 0; + } + + if (m_pvr_channel) + { + m_pvr_channel->stopFile(); + m_pvr_channel->setCueSheet(0); + } m_PMT.stop(); m_PAT.stop(); m_service = 0;