X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/089df6a2a17ec560a9c525857b4bbe43442b5ca8..55f6a93959c05873d204af92f7a381b624de2860:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index a4e10e16..a5e9be46 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -4,24 +4,24 @@ #include #include #include +#include #include +#include #include #include #include -eDVBServicePMTHandler::eDVBServicePMTHandler(int record) +eDVBServicePMTHandler::eDVBServicePMTHandler() :m_ca_servicePtr(0) { - m_record = record; + m_use_decode_demux = 0; eDVBResourceManager::getInstance(m_resourceManager); CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready); CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready); - eDebug("new PMT handler record: %d", m_record); } eDVBServicePMTHandler::~eDVBServicePMTHandler() { - eDebug("delete PMT handler record: %d", m_record); if (m_ca_servicePtr) { eDebug("unregister caservice"); @@ -43,7 +43,7 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) && (state == iDVBChannel::state_ok) && (!m_demux)) { if (m_channel) - if (m_channel->getDemux(m_demux, m_record ? 0 : iDVBChannel::capDecode)) + if (m_channel->getDemux(m_demux, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode)) eDebug("Allocating a demux for now tuned-in channel failed."); serviceEvent(eventTuned); @@ -65,6 +65,18 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) } } +void eDVBServicePMTHandler::channelEvent(iDVBChannel *channel, int event) +{ + switch (event) + { + case iDVBChannel::evtEOF: + serviceEvent(eventEOF); + break; + default: + break; + } +} + void eDVBServicePMTHandler::PMTready(int error) { if (error) @@ -72,6 +84,7 @@ void eDVBServicePMTHandler::PMTready(int error) else { serviceEvent(eventNewProgramInfo); + eEPGCache::getInstance()->PMTready(this); if (!m_pvr_channel) { if(!m_ca_servicePtr) // don't send campmt to camd.socket for playbacked services @@ -96,7 +109,6 @@ void eDVBServicePMTHandler::PMTready(int error) void eDVBServicePMTHandler::PATready(int) { - eDebug("got PAT"); ePtr > ptr; if (!m_PAT.getCurrent(ptr)) { @@ -126,17 +138,21 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) program.audioStreams.clear(); program.pcrPid = -1; program.isCrypted = false; + program.pmtPid = -1; + program.textPid = -1; if (!m_PMT.getCurrent(ptr)) { int cached_apid_ac3 = -1; int cached_apid_mpeg = -1; int cached_vpid = -1; + int cached_tpid = -1; if ( m_service && !m_service->cacheEmpty() ) { cached_vpid = m_service->getCachePID(eDVBService::cVPID); cached_apid_mpeg = m_service->getCachePID(eDVBService::cAC3PID); cached_apid_ac3 = m_service->getCachePID(eDVBService::cAPID); + cached_tpid = m_service->getCachePID(eDVBService::cTPID); } eDVBTableSpec table_spec; ptr->getSpec(table_spec); @@ -181,6 +197,10 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) { switch ((*desc)->getTag()) { + case TELETEXT_DESCRIPTOR: + if ( program.textPid == -1 || (*es)->getPid() == cached_tpid ) + program.textPid = (*es)->getPid(); + break; case AC3_DESCRIPTOR: if (!isvideo) { @@ -251,13 +271,13 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) } } return 0; - } - else if ( m_service && !m_service->cacheEmpty() ) + } else if ( m_service && !m_service->cacheEmpty() ) { int vpid = m_service->getCachePID(eDVBService::cVPID), apid_ac3 = m_service->getCachePID(eDVBService::cAC3PID), apid_mpeg = m_service->getCachePID(eDVBService::cAPID), pcrpid = m_service->getCachePID(eDVBService::cPCRPID), + tpid = m_service->getCachePID(eDVBService::cTPID), cnt=0; if ( vpid != -1 ) { @@ -287,6 +307,11 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) ++cnt; program.pcrPid = pcrpid; } + if ( tpid != -1 ) + { + ++cnt; + program.textPid = tpid; + } if ( cnt ) return 0; } @@ -302,7 +327,7 @@ int eDVBServicePMTHandler::getChannel(eUsePtr &channel) return -1; } -int eDVBServicePMTHandler::getDemux(ePtr &demux) +int eDVBServicePMTHandler::getDataDemux(ePtr &demux) { demux = m_demux; if (demux) @@ -311,6 +336,19 @@ int eDVBServicePMTHandler::getDemux(ePtr &demux) return -1; } +int eDVBServicePMTHandler::getDecodeDemux(ePtr &demux) +{ + /* if we're using the decoding demux as data source + (for example in pvr playbacks), return that one. */ + if (m_use_decode_demux) + { + demux = m_demux; + return 0; + } + + return m_channel->getDemux(demux, iDVBChannel::capDecode); +} + int eDVBServicePMTHandler::getPVRChannel(ePtr &pvr_channel) { pvr_channel = m_pvr_channel; @@ -320,11 +358,13 @@ int eDVBServicePMTHandler::getPVRChannel(ePtr &pvr_channel) return -1; } -int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) +int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux) { RESULT res; m_reference = ref; + m_use_decode_demux = use_decode_demux; + /* is this a normal (non PVR) channel? */ if (ref.path.empty()) { @@ -356,6 +396,10 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) m_channelStateChanged_connection); m_last_channel_state = -1; channelStateChanged(m_channel); + + m_channel->connectEvent( + slot(*this, &eDVBServicePMTHandler::channelEvent), + m_channelEvent_connection); } else { serviceEvent(eventTuneFailed); @@ -372,6 +416,16 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) return res; } +void eDVBServicePMTHandler::free() +{ + m_PMT.stop(); + m_PAT.stop(); + m_service = 0; + m_channel = 0; + m_pvr_channel = 0; + m_demux = 0; +} + std::map eDVBCAService::exist; eDVBCAService::eDVBCAService()