X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/11191e49b6c976338265d026ae33477a1d97fb9b..80058dea34aae48ed729986a65112f0096f5b2d5:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 75b55215..6c980c76 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include // access to python config @@ -211,6 +212,8 @@ std::string eStaticServiceDVBPVRInformation::getInfoString(const eServiceReferen return m_parser.m_description; case iServiceInformation::sServiceref: return m_parser.m_ref.toString(); + case iServiceInformation::sTags: + return m_parser.m_tags; default: return ""; } @@ -396,6 +399,7 @@ RESULT eDVBServiceList::getContent(std::list &list, bool sort // useable format options are // R = Service Reference (as swig object .. this is very slow) // S = Service Reference (as python string object .. same as ref.toString()) +// C = Service Reference (as python string object .. same as ref.toCompareString()) // N = Service Name (as python string object) // when exactly one return value per service is selected in the format string, // then each value is directly a list entry @@ -435,6 +439,9 @@ PyObject *eDVBServiceList::getContent(const char* format, bool sorted) case 'R': // service reference (swig)object tmp = New_eServiceReference(ref); break; + case 'C': // service reference compare string + tmp = PyString_FromString(ref.toCompareString().c_str()); + break; case 'S': // service reference string tmp = PyString_FromString(ref.toString().c_str()); break; @@ -1153,7 +1160,9 @@ int eDVBServicePlay::getInfo(int w) if (w == sCAIDs) return resIsPyObject; - if (m_service_handler.getProgramInfo(program)) + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + + if (h.getProgramInfo(program)) return -1; switch (w) @@ -1242,7 +1251,8 @@ PyObject *eDVBServicePlay::getInfoObject(int w) int eDVBServicePlay::getNumberOfTracks() { eDVBServicePMTHandler::program program; - if (m_service_handler.getProgramInfo(program)) + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + if (h.getProgramInfo(program)) return 0; return program.audioStreams.size(); } @@ -1260,8 +1270,9 @@ RESULT eDVBServicePlay::selectTrack(unsigned int i) RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i) { eDVBServicePMTHandler::program program; + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; - if (m_service_handler.getProgramInfo(program)) + if (h.getProgramInfo(program)) return -1; if (i >= program.audioStreams.size()) @@ -1298,8 +1309,9 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int int eDVBServicePlay::selectAudioStream(int i) { eDVBServicePMTHandler::program program; + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; - if (m_service_handler.getProgramInfo(program)) + if (h.getProgramInfo(program)) return -1; if ((unsigned int)i >= program.audioStreams.size()) @@ -1328,6 +1340,8 @@ int eDVBServicePlay::selectAudioStream(int i) } } + h.resetCachedProgram(); + return 0; } @@ -1353,7 +1367,7 @@ std::string eDVBServicePlay::getRadioText(int x) switch(x) { case 0: - return m_radiotext_parser->getCurrentText(); + return convertLatin1UTF8(m_radiotext_parser->getCurrentText()); } return ""; } @@ -1584,7 +1598,9 @@ void eDVBServicePlay::updateTimeshiftPids() return; eDVBServicePMTHandler::program program; - if (m_service_handler.getProgramInfo(program)) + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + + if (h.getProgramInfo(program)) return; else { @@ -1636,15 +1652,17 @@ void eDVBServicePlay::switchToLive() m_decode_demux = 0; m_teletext_parser = 0; m_radiotext_parser = 0; + m_subtitle_parser = 0; + m_new_dvb_subtitle_page_connection = 0; m_new_subtitle_page_connection = 0; m_radiotext_updated_connection = 0; - + /* free the timeshift service handler, we need the resources */ m_service_handler_timeshift.free(); m_timeshift_active = 0; - + m_event((iPlayableService*)this, evSeekableStatusChanged); - + updateDecoder(); } @@ -1652,21 +1670,23 @@ void eDVBServicePlay::switchToTimeshift() { if (m_timeshift_active) return; - + m_decode_demux = 0; m_decoder = 0; m_teletext_parser = 0; m_radiotext_parser = 0; + m_subtitle_parser = 0; m_new_subtitle_page_connection = 0; + m_new_dvb_subtitle_page_connection = 0; m_radiotext_updated_connection = 0; m_timeshift_active = 1; m_event((iPlayableService*)this, evSeekableStatusChanged); - + eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference; r.path = m_timeshift_file; - + m_cue = new eCueSheet(); m_service_handler_timeshift.tune(r, 1, m_cue); /* use the decoder demux for everything */ updateDecoder(); /* mainly to switch off PCR */ @@ -1682,7 +1702,7 @@ void eDVBServicePlay::updateDecoder() std::string default_ac3; if (!ePythonConfigQuery::getConfigValue("config.av.defaultac3", default_ac3)) - defaultac3 = default_ac3 == "enable"; + defaultac3 = default_ac3 == "True"; eDVBServicePMTHandler::program program; if (h.getProgramInfo(program)) @@ -1694,7 +1714,7 @@ void eDVBServicePlay::updateDecoder() { eDebugNoNewLine(" ("); for (std::vector::const_iterator - i(program.videoStreams.begin()); + i(program.videoStreams.begin()); i != program.videoStreams.end(); ++i) { if (vpid == -1) @@ -1713,7 +1733,7 @@ void eDVBServicePlay::updateDecoder() { eDebugNoNewLine(" ("); for (std::vector::const_iterator - i(program.audioStreams.begin()); + i(program.audioStreams.begin()); i != program.audioStreams.end(); ++i) { if (apid == -1 || (apidtype == eDVBAudio::aMPEG && defaultac3)) @@ -1747,6 +1767,8 @@ void eDVBServicePlay::updateDecoder() m_teletext_parser = new eDVBTeletextParser(m_decode_demux); m_teletext_parser->connectNewPage(slot(*this, &eDVBServicePlay::newSubtitlePage), m_new_subtitle_page_connection); #endif + 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) @@ -1806,8 +1828,7 @@ void eDVBServicePlay::updateDecoder() m_decoder->setTextPID(tpid); - if (m_teletext_parser) - m_teletext_parser->start(tpid); + m_teletext_parser->start(program.textPid); if (!m_is_primary) m_decoder->setTrickmode(1); @@ -1977,18 +1998,37 @@ RESULT eDVBServicePlay::enableSubtitles(eWidget *parent, PyObject *entry) if (m_subtitle_widget) disableSubtitles(parent); - if (!m_teletext_parser) - return -1; - if (!PyInt_Check(entry)) return -1; - + + int page = PyInt_AsLong(entry); + + if (page > 0 && !m_teletext_parser) + return -1; + if (page < 0 && !m_subtitle_parser) + return -1; + m_subtitle_widget = new eSubtitleWidget(parent); m_subtitle_widget->resize(parent->size()); /* full size */ - - int page = PyInt_AsLong(entry); - - m_teletext_parser->setPage(page); + + if (page > 0) + { +/* eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + eDVBServicePMTHandler::program program; + if (h.getProgramInfo(program)) + eDebug("getting program info failed."); + else + { + eDebug("start teletext on pid %04x, page %d", program.textPid, page); + m_teletext_parser->start(program.textPid);*/ + m_teletext_parser->setPage(page); +// } + } + else + { + int pid = -page; + m_subtitle_parser->start(pid); + } return 0; } @@ -1997,6 +2037,16 @@ RESULT eDVBServicePlay::disableSubtitles(eWidget *parent) { delete m_subtitle_widget; m_subtitle_widget = 0; + if (m_subtitle_parser) + { + m_subtitle_parser->stop(); + m_dvb_subtitle_pages.clear(); + } + if (m_teletext_parser) + { + m_teletext_parser->setPage(-1); + m_subtitle_pages.clear(); + } return 0; } @@ -2014,12 +2064,32 @@ PyObject *eDVBServicePlay::getSubtitleList() { PyObject *tuple = PyTuple_New(2); char desc[20]; - sprintf(desc, "Page %x", *i); + sprintf(desc, "Page %d", *i); PyTuple_SetItem(tuple, 0, PyString_FromString(desc)); PyTuple_SetItem(tuple, 1, PyInt_FromLong(*i)); PyList_Append(l, tuple); + Py_DECREF(tuple); } - + + eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + eDVBServicePMTHandler::program program; + if (h.getProgramInfo(program)) + eDebug("getting program info failed."); + else + { + for (std::vector::iterator it(program.subtitleStreams.begin()); + it != program.subtitleStreams.end(); ++it) + { + PyObject *tuple = PyTuple_New(2); + char desc[20]; + sprintf(desc, "DVB %s", it->language_code.c_str()); + PyTuple_SetItem(tuple, 0, PyString_FromString(desc)); + PyTuple_SetItem(tuple, 1, PyInt_FromLong(-it->pid)); + PyList_Append(l, tuple); + Py_DECREF(tuple); + } + } + return l; } @@ -2028,26 +2098,43 @@ void eDVBServicePlay::newSubtitlePage(const eDVBTeletextSubtitlePage &page) if (m_subtitle_widget) { m_subtitle_pages.push_back(page); - checkSubtitleTiming(); } } void eDVBServicePlay::checkSubtitleTiming() { +// eDebug("checkSubtitleTiming"); + if (!m_subtitle_widget) + return; while (1) { - if (m_subtitle_pages.empty()) + enum { TELETEXT, DVB } type; + eDVBTeletextSubtitlePage page; + eDVBSubtitlePage dvb_page; + pts_t show_time; + if (!m_subtitle_pages.empty()) + { + page = m_subtitle_pages.front(); + type = TELETEXT; + show_time = page.m_pts; + } + else if (!m_dvb_subtitle_pages.empty()) + { + dvb_page = m_dvb_subtitle_pages.front(); + type = DVB; + show_time = dvb_page.m_show_time; + } + else return; - eDVBTeletextSubtitlePage p = m_subtitle_pages.front(); - pts_t pos = 0; if (m_decoder) m_decoder->getPTS(0, pos); - - int diff = p.m_pts - pos; + +// eDebug("%lld %lld", pos, show_time); + int diff = show_time - pos; if (diff < 0) { eDebug("[late (%d ms)]", -diff / 90); @@ -2061,16 +2148,36 @@ void eDVBServicePlay::checkSubtitleTiming() if (!diff) { - m_subtitle_widget->setPage(p); - m_subtitle_pages.pop_front(); + if (type == TELETEXT) + { + eDebug("display teletext subtitle page"); + m_subtitle_widget->setPage(page); + m_subtitle_pages.pop_front(); + } + else + { + eDebug("display dvb subtitle Page"); + m_subtitle_widget->setPage(dvb_page); + m_dvb_subtitle_pages.pop_front(); + } } else { + eDebug("start subtitle delay %d", diff / 90); m_subtitle_sync_timer.start(diff / 90, 1); break; } } } +void eDVBServicePlay::newDVBSubtitlePage(const eDVBSubtitlePage &p) +{ + if (m_subtitle_widget) + { + m_dvb_subtitle_pages.push_back(p); + checkSubtitleTiming(); + } +} + int eDVBServicePlay::getAC3Delay() { if (m_dvb_service)