X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/f1dada7c1609b051d29a65a51cc227449350ee16..de02762ebc37c2b1c3f20e10f6160545ab492742:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index b8663f4b..11cda125 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -13,7 +14,7 @@ #include eDVBServicePMTHandler::eDVBServicePMTHandler() - :m_ca_servicePtr(0), m_decode_demux_num(0xFF) + :m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF) { m_use_decode_demux = 0; m_pmt_pid = -1; @@ -159,7 +160,7 @@ PyObject *eDVBServicePMTHandler::getCaIds() { case CA_DESCRIPTOR: { - const CaDescriptor *cadescr = *desc; + const CaDescriptor *cadescr = (const CaDescriptor*)*desc; uint16_t caid = cadescr->getCaSystemId(); int idx=0; while (caids[idx] && caids[idx] != caid) @@ -177,7 +178,7 @@ PyObject *eDVBServicePMTHandler::getCaIds() { case CA_DESCRIPTOR: { - const CaDescriptor *cadescr = *desc; + const CaDescriptor *cadescr = (const CaDescriptor*)*desc; uint16_t caid = cadescr->getCaSystemId(); int idx=0; while (caids[idx] && caids[idx] != caid) @@ -249,9 +250,12 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) video.pid = (*es)->getPid(); audio.pid = (*es)->getPid(); + video.type = videoStream::vtMPEG2; switch ((*es)->getType()) { + case 0x1b: // AVC Video Stream (MPEG4 H264) + video.type = videoStream::vtMPEG4_H264; case 0x01: // MPEG 1 video case 0x02: // MPEG 2 video isvideo = 1; @@ -276,6 +280,13 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) if ( program.textPid == -1 || (*es)->getPid() == cached_tpid ) program.textPid = (*es)->getPid(); break; + case DTS_DESCRIPTOR: + if (!isvideo) + { + isaudio = 1; + audio.type = audioStream::atDTS; + } + break; case AC3_DESCRIPTOR: if (!isvideo) { @@ -353,11 +364,15 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) apid_mpeg = m_service->getCachePID(eDVBService::cAPID), pcrpid = m_service->getCachePID(eDVBService::cPCRPID), tpid = m_service->getCachePID(eDVBService::cTPID), + vpidtype = m_service->getCachePID(eDVBService::cVTYPE), cnt=0; + if ( vpidtype == -1 ) + vpidtype = videoStream::vtMPEG2; if ( vpid != -1 ) { videoStream s; s.pid = vpid; + s.type = vpidtype; program.videoStreams.push_back(s); ++cnt; } @@ -440,6 +455,28 @@ int eDVBServicePMTHandler::getPVRChannel(ePtr &pvr_channel) return -1; } +void eDVBServicePMTHandler::SDTScanEvent(int event) +{ + switch (event) + { + case eDVBScan::evtFinish: + { + ePtr db; + if (m_resourceManager->getChannelList(db) != 0) + eDebug("no channel list"); + else + { + m_dvb_scan->insertInto(db); + eDebug("sdt update done!"); + } + break; + } + + default: + break; + } +} + int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue) { RESULT res; @@ -500,6 +537,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, m_channel->connectEvent( slot(*this, &eDVBServicePMTHandler::channelEvent), m_channelEvent_connection); + + if (ref.path.empty()) + { + delete m_dvb_scan; + m_dvb_scan = new eDVBScan(m_channel); + m_dvb_scan->connectEvent(slot(*this, &eDVBServicePMTHandler::SDTScanEvent), m_scan_event_connection); + } } else { serviceEvent(eventTuneFailed); @@ -517,6 +561,10 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, void eDVBServicePMTHandler::free() { + eDVBScan *tmp = m_dvb_scan; // do a copy on stack (recursive call of free()) !!! + m_dvb_scan = 0; + delete m_dvb_scan; + if (m_ca_servicePtr) { int demuxes[2] = {0,0};