X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fpmt.cpp;h=d67338494b1f38674f89fbb840aee464632f8441;hp=5fdd69db52bce738d9bf943f89de97a148be1a89;hb=a600a785717d30f1f9729592e6e8d9d5b3b9bb38;hpb=5138dce8cfa3d4987ebc8899d5fd990883d1a1dc diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 5fdd69d..d673384 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -131,6 +131,8 @@ void eDVBServicePMTHandler::PATready(int) ePtr > ptr; if (!m_PAT.getCurrent(ptr)) { + int service_id_single = -1; + int pmtpid_single = -1; int pmtpid = -1; std::vector::const_iterator i; for (i = ptr->getSections().begin(); pmtpid == -1 && i != ptr->getSections().end(); ++i) @@ -138,8 +140,22 @@ void eDVBServicePMTHandler::PATready(int) const ProgramAssociationSection &pat = **i; ProgramAssociationConstIterator program; for (program = pat.getPrograms()->begin(); pmtpid == -1 && program != pat.getPrograms()->end(); ++program) + { if (eServiceID((*program)->getProgramNumber()) == m_reference.getServiceID()) pmtpid = (*program)->getProgramMapPid(); + if (pmtpid_single == -1 && pmtpid == -1) + { + pmtpid_single = (*program)->getProgramMapPid(); + service_id_single = (*program)->getProgramNumber(); + } + else + pmtpid_single = service_id_single = -1; + } + } + if (pmtpid_single != -1) // only one PAT entry .. so we use this one + { + m_reference.setServiceID(eServiceID(service_id_single)); + pmtpid = pmtpid_single; } if (pmtpid == -1) serviceEvent(eventNoPATEntry); @@ -157,13 +173,13 @@ PyObject *eDVBServicePMTHandler::getCaIds(bool pair) if ( !getProgramInfo(prog) ) { - int cnt=prog.caids.size(); - if (cnt) + if (pair) { - ret=PyList_New(cnt); - std::set::iterator it(prog.caids.begin()); - if (pair) + int cnt=prog.caids.size(); + if (cnt) { + ret=PyList_New(cnt); + std::list::iterator it(prog.caids.begin()); while(cnt--) { ePyObject tuple = PyTuple_New(2); @@ -172,11 +188,15 @@ PyObject *eDVBServicePMTHandler::getCaIds(bool pair) PyList_SET_ITEM(ret, cnt, tuple); } } - else - { - while(cnt--) - PyList_SET_ITEM(ret, cnt, PyInt_FromLong((it++)->caid)); - } + } + else + { + std::set set(prog.caids.begin(), prog.caids.end()); + std::set::iterator it(set.begin()); + int cnt=set.size(); + ret=PyList_New(cnt); + while(cnt--) + PyList_SET_ITEM(ret, cnt, PyInt_FromLong((it++)->caid)); } } @@ -226,8 +246,29 @@ int eDVBServicePMTHandler::getProgramInfo(program &program) for (i = ptr->getSections().begin(); i != ptr->getSections().end(); ++i) { const ProgramMapSection &pmt = **i; + int is_hdmv = 0; + program.pcrPid = pmt.getPcrPid(); + for (DescriptorConstIterator desc = pmt.getDescriptors()->begin(); + desc != pmt.getDescriptors()->end(); ++desc) + { + if ((*desc)->getTag() == CA_DESCRIPTOR) + { + CaDescriptor *descr = (CaDescriptor*)(*desc); + program::capid_pair pair; + pair.caid = descr->getCaSystemId(); + pair.capid = descr->getCaPid(); + program.caids.push_back(pair); + } + else if ((*desc)->getTag() == REGISTRATION_DESCRIPTOR) + { + RegistrationDescriptor *d = (RegistrationDescriptor*)(*desc); + if (d->getFormatIdentifier() == 0x48444d56) // HDMV + is_hdmv = 1; + } + } + ElementaryStreamInfoConstIterator es; for (es = pmt.getEsInfo()->begin(); es != pmt.getEsInfo()->end(); ++es) { @@ -283,25 +324,34 @@ int eDVBServicePMTHandler::getProgramInfo(program &program) audio.type = audioStream::atAACHE; forced_audio = 1; } - case 0x80: // user private ... but blueray LPCM - if (!isvideo && !isaudio) + case 0x80: // user private ... but bluray LPCM + case 0xA0: // bluray secondary LPCM + if (!isvideo && !isaudio && is_hdmv) { isaudio = 1; audio.type = audioStream::atLPCM; } - case 0x81: // user private ... but blueray AC3 - if (!isvideo && !isaudio) + case 0x81: // user private ... but bluray AC3 + case 0xA1: // bluray secondary AC3 + if (!isvideo && !isaudio && is_hdmv) { isaudio = 1; audio.type = audioStream::atAC3; } - case 0x82: // Blueray DTS (dvb user private...) - case 0xA2: // Blueray secondary DTS - if (!isvideo && !isaudio) + case 0x82: // bluray DTS (dvb user private...) + case 0xA2: // bluray secondary DTS + if (!isvideo && !isaudio && is_hdmv) { isaudio = 1; audio.type = audioStream::atDTS; } + case 0x86: // bluray DTS-HD (dvb user private...) + case 0xA6: // bluray secondary DTS-HD + if (!isvideo && !isaudio && is_hdmv) + { + isaudio = 1; + audio.type = audioStream::atDTSHD; + } case 0x06: // PES Private case 0xEA: // TS_PSI_ST_SMPTE_VC1 { @@ -476,7 +526,7 @@ int eDVBServicePMTHandler::getProgramInfo(program &program) program::capid_pair pair; pair.caid = descr->getCaSystemId(); pair.capid = descr->getCaPid(); - program.caids.insert(pair); + program.caids.push_back(pair); break; } default: @@ -493,9 +543,9 @@ int eDVBServicePMTHandler::getProgramInfo(program &program) default: break; } - if (isteletext && (isaudio || isvideo)) + if (isteletext && (isaudio || isvideo)) { - eDebug("ambiguous streamtype for PID %04x detected.. forced as teletext!", (*es)->getPid()); + eDebug("ambiguous streamtype for PID %04x detected.. forced as teletext!", (*es)->getPid()); continue; // continue with next PID } else if (issubtitle && (isaudio || isvideo)) @@ -533,18 +583,6 @@ int eDVBServicePMTHandler::getProgramInfo(program &program) else continue; } - for (DescriptorConstIterator desc = pmt.getDescriptors()->begin(); - desc != pmt.getDescriptors()->end(); ++desc) - { - if ((*desc)->getTag() == CA_DESCRIPTOR) - { - CaDescriptor *descr = (CaDescriptor*)(*desc); - program::capid_pair pair; - pair.caid = descr->getCaSystemId(); - pair.capid = descr->getCaPid(); - program.caids.insert(pair); - } - } } ret = 0; @@ -612,7 +650,7 @@ int eDVBServicePMTHandler::getProgramInfo(program &program) program::capid_pair pair; pair.caid = *it; pair.capid = -1; // not known yet - program.caids.insert(pair); + program.caids.push_back(pair); } if ( cnt ) ret = 0; @@ -698,11 +736,11 @@ void eDVBServicePMTHandler::SDTScanEvent(int event) int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue, bool simulate, eDVBService *service) { - ePtr s; + ePtr s; return tuneExt(ref, use_decode_demux, s, NULL, cue, simulate, service); } -int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr &source, const char *streaminfo_file, eCueSheet *cue, bool simulate, eDVBService *service) +int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr &source, const char *streaminfo_file, eCueSheet *cue, bool simulate, eDVBService *service) { RESULT res=0; m_reference = ref; @@ -731,13 +769,12 @@ int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_dem { if (!ref.getServiceID().get() /* incorrect sid in meta file or recordings.epl*/ ) { - eWarning("no .meta file found, trying to find PMT pid"); eDVBTSTools tstools; + bool b = source || !tstools.openFile(ref.path.c_str(), 1); + eWarning("no .meta file found, trying to find PMT pid"); if (source) - tstools.setSource(source, streaminfo_file ? streaminfo_file : ref.path.c_str()); - else if (tstools.openFile(ref.path.c_str())) - eWarning("failed to open file"); - else + tstools.setSource(source, NULL); + if (b) { int service_id, pmt_pid; if (!tstools.findPMT(pmt_pid, service_id)) @@ -747,6 +784,8 @@ int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_dem m_pmt_pid = pmt_pid; } } + else + eWarning("no valid source to find PMT pid!"); } eDebug("alloc PVR"); /* allocate PVR */