X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/cf5341701c32afc934b3ff0dc75a28c7e9f264ee..80f0ae4f5b0e4b8d5b8170512b2f9c5071edfcb2:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 613dc9be..c66b3da1 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -6,7 +6,6 @@ #include #include #include -#include // access to python config #include #include #include @@ -17,6 +16,7 @@ #include #include #include +#include // access to python config /* for subtitles */ #include @@ -486,7 +486,15 @@ eStaticServiceDVBPVRInformation::eStaticServiceDVBPVRInformation(const eServiceR RESULT eStaticServiceDVBPVRInformation::getName(const eServiceReference &ref, std::string &name) { ASSERT(ref == m_ref); - name = m_parser.m_name.size() ? m_parser.m_name : ref.path; + if (m_parser.m_name.size()) + name = m_parser.m_name; + else + { + name = ref.path; + size_t n = name.rfind('/'); + if (n != std::string::npos) + name = name.substr(n + 1); + } return 0; } @@ -1017,7 +1025,7 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv m_subtitle_widget = 0; m_tune_state = -1; - + CONNECT(m_subtitle_sync_timer.timeout, eDVBServicePlay::checkSubtitleTiming); } @@ -1337,6 +1345,9 @@ RESULT eDVBServicePlay::seekTo(pts_t to) return -1; m_cue->seekTo(0, to); + m_dvb_subtitle_pages.clear(); + m_subtitle_pages.clear(); + return 0; } @@ -1364,6 +1375,8 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to) return 0; m_cue->seekTo(mode, to); + m_dvb_subtitle_pages.clear(); + m_subtitle_pages.clear(); return 0; } @@ -1648,6 +1661,23 @@ int eDVBServicePlay::getNumberOfTracks() return program.audioStreams.size(); } +int eDVBServicePlay::getCurrentTrack() +{ + eDVBServicePMTHandler::program program; + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + if (h.getProgramInfo(program)) + return 0; + + int max = program.audioStreams.size(); + int i; + + for (i = 0; i < max; ++i) + if (program.audioStreams[i].pid == m_current_audio_pid) + return i; + + return 0; +} + RESULT eDVBServicePlay::selectTrack(unsigned int i) { int ret = selectAudioStream(i); @@ -1669,6 +1699,8 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int if (i >= program.audioStreams.size()) return -2; + info.m_pid = program.audioStreams[i].pid; + if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG) info.m_description = "MPEG"; else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3) @@ -1704,30 +1736,68 @@ int eDVBServicePlay::selectAudioStream(int i) if (h.getProgramInfo(program)) return -1; - - if ((unsigned int)i >= program.audioStreams.size()) + + if ((i != -1) && ((unsigned int)i >= program.audioStreams.size())) return -2; - + if (!m_decoder) return -3; - - if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type)) - return -4; - if (m_rds_decoder) - m_rds_decoder->start(program.audioStreams[i].pid); + int stream = i; + if (stream == -1) + stream = program.defaultAudioStream; + + int apid = -1, apidtype = -1; - if (m_dvb_service && !m_is_pvr) + if (((unsigned int)stream) < program.audioStreams.size()) { - if (program.audioStreams[i].type == eDVBAudio::aMPEG) + apid = program.audioStreams[stream].pid; + apidtype = program.audioStreams[stream].type; + } + + m_current_audio_pid = apid; + + if (m_decoder->setAudioPID(apid, apidtype)) + { + eDebug("set audio pid failed"); + return -4; + } + + /* if we are not in PVR mode, timeshift is not active and we are not in pip mode, check if we need to enable the rds reader */ + if (!(m_is_pvr || m_timeshift_active || !m_is_primary)) + if (!m_rds_decoder) { - m_dvb_service->setCacheEntry(eDVBService::cAPID, program.audioStreams[i].pid); + ePtr data_demux; + if (!h.getDataDemux(data_demux)) + { + m_rds_decoder = new eDVBRdsDecoder(data_demux); + m_rds_decoder->connectEvent(slot(*this, &eDVBServicePlay::rdsDecoderEvent), m_rds_decoder_event_connection); + } + } + + /* if we decided that we need one, update the pid */ + if (m_rds_decoder) + m_rds_decoder->start(apid); + + /* store new pid as default only when: + a.) we have an entry in the service db for the current service, + b.) we are not playing back something, + c.) we are not selecting the default entry. (we wouldn't change + anything in the best case, or destroy the default setting in + case the real default is not yet available.) + */ + if (m_dvb_service && !m_is_pvr && ((i != -1) + || ((m_dvb_service->getCacheEntry(eDVBService::cAPID) == -1) && (m_dvb_service->getCacheEntry(eDVBService::cAC3PID)==-1)))) + { + if (apidtype == eDVBAudio::aMPEG) + { + m_dvb_service->setCacheEntry(eDVBService::cAPID, apid); m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1); } else { m_dvb_service->setCacheEntry(eDVBService::cAPID, -1); - m_dvb_service->setCacheEntry(eDVBService::cAC3PID, program.audioStreams[i].pid); + m_dvb_service->setCacheEntry(eDVBService::cAC3PID, apid); } } @@ -2207,16 +2277,10 @@ void eDVBServicePlay::switchToTimeshift() void eDVBServicePlay::updateDecoder() { - int vpid = -1, vpidtype = -1, apid = -1, apidtype = -1, pcrpid = -1, tpid = -1, achannel = -1, ac3_delay=-1, pcm_delay=-1; + int vpid = -1, vpidtype = -1, pcrpid = -1, tpid = -1, achannel = -1, ac3_delay=-1, pcm_delay=-1; eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; - bool defaultac3=false; - std::string default_ac3; - - if (!ePythonConfigQuery::getConfigValue("config.av.defaultac3", default_ac3)) - defaultac3 = default_ac3 == "True"; - eDVBServicePMTHandler::program program; if (h.getProgramInfo(program)) eDebug("getting program info failed."); @@ -2249,14 +2313,6 @@ void eDVBServicePlay::updateDecoder() i(program.audioStreams.begin()); i != program.audioStreams.end(); ++i) { - if (apid == -1 || (apidtype == eDVBAudio::aMPEG && defaultac3)) - { - if ( apid == -1 || (i->type != eDVBAudio::aMPEG) ) - { - apid = i->pid; - apidtype = i->type; - } - } if (i != program.audioStreams.begin()) eDebugNoNewLine(", "); eDebugNoNewLine("%04x", i->pid); @@ -2277,13 +2333,18 @@ void eDVBServicePlay::updateDecoder() m_decode_demux->getMPEGDecoder(m_decoder, m_is_primary); if (m_decoder) m_decoder->connectVideoEvent(slot(*this, &eDVBServicePlay::video_event), m_video_event_connection); + m_teletext_parser = new eDVBTeletextParser(m_decode_demux); + m_teletext_parser->connectNewPage(slot(*this, &eDVBServicePlay::newSubtitlePage), m_new_subtitle_page_connection); + m_subtitle_parser = new eDVBSubtitleParser(m_decode_demux); + m_subtitle_parser->connectNewPage(slot(*this, &eDVBServicePlay::newDVBSubtitlePage), m_new_dvb_subtitle_page_connection); + } else + { + m_teletext_parser = 0; + m_subtitle_parser = 0; } + if (m_cue) m_cue->setDecodingDemux(m_decode_demux, m_decoder); - m_teletext_parser = new eDVBTeletextParser(m_decode_demux); - m_teletext_parser->connectNewPage(slot(*this, &eDVBServicePlay::newSubtitlePage), m_new_subtitle_page_connection); - m_subtitle_parser = new eDVBSubtitleParser(m_decode_demux); - m_subtitle_parser->connectNewPage(slot(*this, &eDVBServicePlay::newDVBSubtitlePage), m_new_dvb_subtitle_page_connection); } if (m_decoder) @@ -2323,21 +2384,10 @@ void eDVBServicePlay::updateDecoder() m_decoder->setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay); m_decoder->setVideoPID(vpid, vpidtype); - m_decoder->setAudioPID(apid, apidtype); + selectAudioStream(); + if (!(m_is_pvr || m_timeshift_active || !m_is_primary)) - { m_decoder->setSyncPCR(pcrpid); - if (apid != -1) - { - ePtr data_demux; - if (!h.getDataDemux(data_demux)) - { - m_rds_decoder = new eDVBRdsDecoder(data_demux); - m_rds_decoder->connectEvent(slot(*this, &eDVBServicePlay::rdsDecoderEvent), m_rds_decoder_event_connection); - m_rds_decoder->start(apid); - } - } - } else m_decoder->setSyncPCR(-1); @@ -2364,23 +2414,10 @@ void eDVBServicePlay::updateDecoder() m_decoder->setAudioChannel(achannel); -// how we can do this better? -// update cache pid when the user changed the audio track or video track -// TODO handling of difference audio types.. default audio types.. - /* don't worry about non-existing services, nor pvr services */ if (m_dvb_service && !m_is_pvr) { - if (apidtype == eDVBAudio::aMPEG) - { - m_dvb_service->setCacheEntry(eDVBService::cAPID, apid); - m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1); - } - else - { - m_dvb_service->setCacheEntry(eDVBService::cAPID, -1); - m_dvb_service->setCacheEntry(eDVBService::cAC3PID, apid); - } + /* (audio pid will be set in selectAudioTrack */ m_dvb_service->setCacheEntry(eDVBService::cVPID, vpid); m_dvb_service->setCacheEntry(eDVBService::cVTYPE, vpidtype == eDVBVideo::MPEG2 ? -1 : vpidtype); m_dvb_service->setCacheEntry(eDVBService::cPCRPID, pcrpid); @@ -2739,6 +2776,10 @@ void eDVBServicePlay::newSubtitlePage(const eDVBTeletextSubtitlePage &page) { if (m_subtitle_widget) { + pts_t pos = 0; + if (m_decoder) + m_decoder->getPTS(0, pos); + eDebug("got new subtitle page %lld %lld %d", pos, page.m_pts, page.m_have_pts); m_subtitle_pages.push_back(page); checkSubtitleTiming(); } @@ -2746,7 +2787,7 @@ void eDVBServicePlay::newSubtitlePage(const eDVBTeletextSubtitlePage &page) void eDVBServicePlay::checkSubtitleTiming() { -// eDebug("checkSubtitleTiming"); + eDebug("checkSubtitleTiming"); if (!m_subtitle_widget) return; while (1) @@ -2775,36 +2816,36 @@ void eDVBServicePlay::checkSubtitleTiming() if (m_decoder) m_decoder->getPTS(0, pos); -// eDebug("%lld %lld", pos, show_time); + eDebug("%lld %lld", pos, show_time); int diff = show_time - pos; if (diff < 0) { eDebug("[late (%d ms)]", -diff / 90); diff = 0; } - if (diff > 900000) - { - eDebug("[invalid]"); - diff = 0; - } +// if (diff > 900000) +// { +// eDebug("[invalid]"); +// diff = 0; +// } - if (!diff) + if ((diff/90)<20) { if (type == TELETEXT) { - eDebug("display teletext subtitle page"); + eDebug("display teletext subtitle page %lld", show_time); m_subtitle_widget->setPage(page); m_subtitle_pages.pop_front(); } else { - eDebug("display dvb subtitle Page"); + eDebug("display dvb subtitle Page %lld", show_time); m_subtitle_widget->setPage(dvb_page); m_dvb_subtitle_pages.pop_front(); } } else { -// eDebug("start subtitle delay %d", diff / 90); + eDebug("start subtitle delay %d", diff / 90); m_subtitle_sync_timer.start(diff / 90, 1); break; } @@ -2815,6 +2856,10 @@ void eDVBServicePlay::newDVBSubtitlePage(const eDVBSubtitlePage &p) { if (m_subtitle_widget) { + pts_t pos = 0; + if (m_decoder) + m_decoder->getPTS(0, pos); + eDebug("got new subtitle page %lld %lld", pos, p.m_show_time); m_dvb_subtitle_pages.push_back(p); checkSubtitleTiming(); }