X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/f0b5b5c0d6a4320b318f0a700492b6046a39e18a..20fdb2a2af40da98427a702a03a79b1fbec3d7af:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 834a2905..5a1b7c5c 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -3,7 +3,11 @@ #include #include #include +#include #include +#include +#include +#include eDVBServicePMTHandler::eDVBServicePMTHandler(int record) :m_ca_servicePtr(0) @@ -25,7 +29,8 @@ eDVBServicePMTHandler::~eDVBServicePMTHandler() m_demux->getCADemuxID(demux_num); ePtr > ptr; m_PMT.getCurrent(ptr); - eDVBCAService::unregister_demux(m_reference, demux_num, ptr); + eDVBCAService::unregister_service(m_reference, demux_num, ptr); + eDVBCIInterfaces::getInstance()->removePMTHandler(this); } } @@ -69,11 +74,16 @@ void eDVBServicePMTHandler::PMTready(int error) else { serviceEvent(eventNewProgramInfo); - if (!m_pvr_channel && !m_ca_servicePtr) // don't send campmt to camd.socket for playbacked services + if (!m_pvr_channel) { - uint8_t demux_num; - m_demux->getCADemuxID(demux_num); - eDVBCAService::register_demux(m_reference, demux_num, m_ca_servicePtr); + if(!m_ca_servicePtr) // don't send campmt to camd.socket for playbacked services + { + uint8_t demux_num; + m_demux->getCADemuxID(demux_num); + eDVBCAService::register_service(m_reference, demux_num, m_ca_servicePtr); + eDVBCIInterfaces::getInstance()->addPMTHandler(this); + } + eDVBCIInterfaces::getInstance()->gotPMT(this); } if (m_ca_servicePtr) { @@ -150,9 +160,47 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) isaudio = 1; audio.type = audioStream::atMPEG; break; + case 0x06: // PES Private + /* PES private can contain AC-3, DTS or lots of other stuff. + check descriptors to get the exact type. */ + for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); + desc != (*es)->getDescriptors()->end(); ++desc) + { + switch ((*desc)->getTag()) + { + case AC3_DESCRIPTOR: + isaudio = 1; + audio.type = audioStream::atAC3; + break; + } + } + break; } if (isaudio) + { + for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); + desc != (*es)->getDescriptors()->end(); ++desc) + { + switch ((*desc)->getTag()) + { + case ISO_639_LANGUAGE_DESCRIPTOR: + { + const Iso639LanguageList *languages = ((Iso639LanguageDescriptor*)*desc)->getIso639Languages(); + + /* use last language code */ + for (Iso639LanguageConstIterator i(languages->begin()); i != languages->end(); ++i) + audio.language_code = (*i)->getIso639LanguageCode(); + + break; + } + case COMPONENT_DESCRIPTOR: + audio.component_tag = ((ComponentDescriptor*)*desc)->getComponentTag(); + break; + } + } + program.audioStreams.push_back(audio); + } if (isvideo) program.videoStreams.push_back(video); } @@ -200,6 +248,15 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) return -1; } +int eDVBServicePMTHandler::getChannel(eUsePtr &channel) +{ + channel = m_channel; + if (channel) + return 0; + else + return -1; +} + int eDVBServicePMTHandler::getDemux(ePtr &demux) { demux = m_demux; @@ -286,7 +343,7 @@ eDVBCAService::~eDVBCAService() ::close(m_sock); } -RESULT eDVBCAService::register_demux( const eServiceReferenceDVB &ref, int demux_num, eDVBCAService *&caservice ) +RESULT eDVBCAService::register_service( const eServiceReferenceDVB &ref, int demux_num, eDVBCAService *&caservice ) { CAServiceMap::iterator it = exist.find(ref); if ( it != exist.end() ) @@ -316,7 +373,7 @@ RESULT eDVBCAService::register_demux( const eServiceReferenceDVB &ref, int demux return 0; } -RESULT eDVBCAService::unregister_demux( const eServiceReferenceDVB &ref, int demux_num, eTable *ptr ) +RESULT eDVBCAService::unregister_service( const eServiceReferenceDVB &ref, int demux_num, eTable *ptr ) { CAServiceMap::iterator it = exist.find(ref); if ( it == exist.end() ) @@ -394,6 +451,7 @@ void eDVBCAService::buildCAPMT(eTable *ptr) uint8_t demux_mask = 0; uint8_t first_demux_num = 0xFF; +#if 1 int iter=0, max_demux_slots = sizeof(m_used_demux); while ( iter < max_demux_slots ) { @@ -405,6 +463,10 @@ void eDVBCAService::buildCAPMT(eTable *ptr) } ++iter; } +#else + demux_mask = 3; + first_demux_num = 0; +#endif if ( first_demux_num == 0xFF ) { @@ -424,7 +486,7 @@ void eDVBCAService::buildCAPMT(eTable *ptr) return; } - const std::vector::const_iterator i=ptr->getSections().begin(); + std::vector::const_iterator i=ptr->getSections().begin(); if ( i != ptr->getSections().end() ) { CaProgramMapSection capmt(*i++, m_prev_build_hash ? 0x05 /*update*/ : 0x03 /*only*/, 0x01 ); @@ -446,8 +508,8 @@ void eDVBCAService::buildCAPMT(eTable *ptr) tmp[0] = 0x82; // demux tmp[1] = 0x02; - tmp[3] = first_demux_num; // read section data from demux number tmp[2] = demux_mask; // descramble bitmask + tmp[3] = first_demux_num; // read section data from demux number capmt.injectDescriptor(tmp, false); tmp[0] = 0x81; // dvbnamespace @@ -486,7 +548,7 @@ void eDVBCAService::sendCAPMT() int i=0; int lenbytes = m_capmt[3] & ~0x80; while(i < lenbytes) - wp |= (m_capmt[4+i] << (8 * i++)); + wp = (wp << 8) | m_capmt[4 + i++]; wp+=4; wp+=lenbytes; }