X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/2d30f6d03db0b0da0b3677d04180c1ba56709a6c..8c4f4f7e0f535267ddd6761fa148c9e0bd9c4dd4:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 99474a86..89301de4 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -395,6 +396,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 @@ -434,6 +436,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; @@ -826,7 +831,12 @@ RESULT eDVBServicePlay::stop() m_service_handler.free(); if (m_is_pvr && m_cuesheet_changed) - saveCuesheet(); + { + struct stat s; + /* save cuesheet only when main file is accessible. */ + if (!::stat(m_reference.path.c_str(), &s)) + saveCuesheet(); + } return 0; } @@ -1147,7 +1157,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) @@ -1236,7 +1248,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(); } @@ -1254,8 +1267,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()) @@ -1292,8 +1306,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()) @@ -1578,7 +1593,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 { @@ -1630,15 +1647,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(); } @@ -1646,21 +1665,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 */ @@ -1676,7 +1697,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)) @@ -1688,7 +1709,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) @@ -1707,7 +1728,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)) @@ -1741,6 +1762,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) @@ -1800,8 +1823,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); @@ -1971,18 +1993,38 @@ 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; + eDebug("start dvb subtitles on pid %04x", pid); + m_subtitle_parser->start(pid); + } return 0; } @@ -2012,8 +2054,28 @@ PyObject *eDVBServicePlay::getSubtitleList() 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; } @@ -2022,26 +2084,41 @@ void eDVBServicePlay::newSubtitlePage(const eDVBTeletextSubtitlePage &page) if (m_subtitle_widget) { m_subtitle_pages.push_back(page); - checkSubtitleTiming(); } } void eDVBServicePlay::checkSubtitleTiming() { +// eDebug("checkSubtitleTiming"); 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); @@ -2055,16 +2132,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)