X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/cd2549143a0eb87a828e03d1ddf67565fd9942c5..65fba71fdcfa303091de1a00120dbb58f8978a69:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 017c31da..5a1b7c5c 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -5,6 +5,9 @@ #include #include #include +#include +#include +#include eDVBServicePMTHandler::eDVBServicePMTHandler(int record) :m_ca_servicePtr(0) @@ -13,7 +16,6 @@ eDVBServicePMTHandler::eDVBServicePMTHandler(int record) eDVBResourceManager::getInstance(m_resourceManager); CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready); CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready); - eDVBCIInterfaces::getInstance()->addPMTHandler(this); eDebug("new PMT handler record: %d", m_record); } @@ -28,8 +30,8 @@ eDVBServicePMTHandler::~eDVBServicePMTHandler() ePtr > ptr; m_PMT.getCurrent(ptr); eDVBCAService::unregister_service(m_reference, demux_num, ptr); + eDVBCIInterfaces::getInstance()->removePMTHandler(this); } - eDVBCIInterfaces::getInstance()->removePMTHandler(this); } void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) @@ -74,13 +76,14 @@ void eDVBServicePMTHandler::PMTready(int error) serviceEvent(eventNewProgramInfo); if (!m_pvr_channel) { - eDVBCIInterfaces::getInstance()->gotPMT(this); 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) { @@ -157,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); }