X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fservice%2Fservicedvb.cpp;h=e62d7783e8104b2eb7c49837ebd48d1d58fd8dd7;hp=c8442161e29fe6ec9606148d7990239619fc8e75;hb=02420217841c013a4491cbe6fae91803b74be6d9;hpb=e21cff679bb73bce310e877d5219ec29291dbe10 diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index c844216..e62d778 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -336,6 +336,7 @@ public: int isPlayable(const eServiceReference &ref, const eServiceReference &ignore) { return 1; } int getInfo(const eServiceReference &ref, int w); std::string getInfoString(const eServiceReference &ref,int w); + PyObject *getInfoObject(const eServiceReference &r, int what); }; DEFINE_REF(eStaticServiceDVBPVRInformation); @@ -400,6 +401,8 @@ int eStaticServiceDVBPVRInformation::getInfo(const eServiceReference &ref, int w return iServiceInformation::resIsString; case iServiceInformation::sServiceref: return iServiceInformation::resIsString; + case iServiceInformation::sFileSize: + return m_parser.m_filesize; case iServiceInformation::sTimeCreate: if (m_parser.m_time_create) return m_parser.m_time_create; @@ -425,6 +428,17 @@ std::string eStaticServiceDVBPVRInformation::getInfoString(const eServiceReferen } } +PyObject *eStaticServiceDVBPVRInformation::getInfoObject(const eServiceReference &r, int what) +{ + switch (what) + { + case iServiceInformation::sFileSize: + return PyLong_FromLongLong(m_parser.m_filesize); + default: + Py_RETURN_NONE; + } +} + RESULT eStaticServiceDVBPVRInformation::getEvent(const eServiceReference &ref, ePtr &evt, time_t start_time) { if (!ref.path.empty()) @@ -1223,6 +1237,7 @@ RESULT eDVBServicePlay::setFastForward_internal(int ratio) return m_decoder->setFastForward(ffratio); else return m_decoder->setTrickmode(); + return 0; } RESULT eDVBServicePlay::seek(ePtr &ptr) @@ -1514,7 +1529,7 @@ int eDVBServicePlay::getInfo(int w) int aspect = -1; if (m_decoder) aspect = m_decoder->getVideoAspect(); - if (no_program_info) + if (aspect == -1 && no_program_info) break; else if (aspect == -1 && !program.videoStreams.empty() && program.videoStreams[0].component_tag != -1) { @@ -1737,7 +1752,7 @@ int eDVBServicePlay::selectAudioStream(int i) m_current_audio_pid = apid; - if (m_decoder->setAudioPID(apid, apidtype)) + if (m_is_primary && m_decoder->setAudioPID(apid, apidtype)) { eDebug("set audio pid failed"); return -4; @@ -2209,6 +2224,7 @@ void eDVBServicePlay::switchToLive() m_new_subtitle_page_connection = 0; m_rds_decoder_event_connection = 0; m_video_event_connection = 0; + m_is_paused = m_skipmode = 0; /* not supported in live mode */ /* free the timeshift service handler, we need the resources */ m_service_handler_timeshift.free(); @@ -2307,6 +2323,9 @@ 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); + } + if (m_decode_demux && m_is_primary) + { 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); @@ -2375,9 +2394,11 @@ void eDVBServicePlay::updateDecoder() else m_decoder->setSyncPCR(-1); - m_decoder->setTextPID(tpid); - - m_teletext_parser->start(program.textPid); + if (m_is_primary) + { + m_decoder->setTextPID(tpid); + m_teletext_parser->start(program.textPid); + } if (vpid > 0 && vpid < 0x2000) ; @@ -2817,18 +2838,22 @@ void eDVBServicePlay::checkSubtitleTiming() m_decoder->getPTS(0, pos); eDebug("%lld %lld", pos, show_time); - int diff = show_time - pos; + int diff = show_time - pos; + if (type == TELETEXT && !page.m_have_pts) + { + eDebug("ttx subtitle page without pts... immediate show"); + diff = 0; + } if (diff < 0) { eDebug("[late (%d ms)]", -diff / 90); diff = 0; } -// if (diff > 900000) -// { -// eDebug("[invalid]"); -// diff = 0; -// } - + if (abs(diff) > 1800000) + { + eDebug("[invalid]... immediate show!"); + diff = 0; + } if ((diff/90)<20) { if (type == TELETEXT)