remove unimplemented method declaration
[enigma2.git] / lib / service / servicedvb.cpp
index e47ae52c7a69cf7ded41de486bec997241a243a7..7f931334944075f1a30ec3933c5a0eae72b85290 100644 (file)
@@ -1111,7 +1111,8 @@ void eDVBServicePlay::serviceEventTimeshift(int event)
                m_event((iPlayableService*)this, evSOF);
                break;
        case eDVBServicePMTHandler::eventEOF:
-               switchToLive();
+               if ((!m_is_paused) && (m_skipmode >= 0))
+                       switchToLive();
                break;
        }
 }
@@ -1151,8 +1152,6 @@ RESULT eDVBServicePlay::start()
                loadCuesheet();
                m_event(this, evStart);
        }
-
-       m_event((iPlayableService*)this, evSeekableStatusChanged);
        return 0;
 }
 
@@ -1161,7 +1160,7 @@ RESULT eDVBServicePlay::stop()
                /* add bookmark for last play position */
        if (m_is_pvr)
        {
-               pts_t play_position;
+               pts_t play_position, length;
                if (!getPlayPosition(play_position))
                {
                                /* remove last position */
@@ -1176,7 +1175,17 @@ RESULT eDVBServicePlay::stop()
                                        ++i;
                        }
                        
-                       m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */
+                       if (getLength(length))
+                               length = 0;
+                       
+                       if (length)
+                       {
+                               int perc = play_position * 100LL / length;
+                       
+                                       /* only store last play position when between 5% and 95% */
+                               if ((5 < perc) && (perc < 95))
+                                       m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */
+                       }
                        m_cuesheet_changed = 1;
                }
        }
@@ -1268,7 +1277,7 @@ RESULT eDVBServicePlay::setFastForward(int ratio)
 
        return m_decoder->setFastForward(ffratio);
 }
-    
+
 RESULT eDVBServicePlay::seek(ePtr<iSeekableService> &ptr)
 {
        if (m_is_pvr || m_timeshift_enabled)
@@ -2188,8 +2197,11 @@ void eDVBServicePlay::switchToTimeshift()
 
        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 */
 
+       eDebug("eDVBServicePlay::switchToTimeshift, in pause mode now.");
+       pause();
+       updateDecoder(); /* mainly to switch off PCR, and to set pause */
+       
        m_event((iPlayableService*)this, evSeekableStatusChanged);
 }
 
@@ -2265,13 +2277,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)
@@ -2336,7 +2353,10 @@ void eDVBServicePlay::updateDecoder()
                if (!m_is_primary)
                        m_decoder->setTrickmode(1);
 
-               m_decoder->start();
+               if (m_is_paused)
+                       m_decoder->preroll();
+               else
+                       m_decoder->start();
 
                if (vpid > 0 && vpid < 0x2000)
                        ;
@@ -2352,7 +2372,7 @@ void eDVBServicePlay::updateDecoder()
 // 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)
                {
@@ -2847,6 +2867,35 @@ void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)
        m_event((iPlayableService*)this, evVideoSizeChanged);
 }
 
+RESULT eDVBServicePlay::stream(ePtr<iStreamableService> &ptr)
+{
+       ptr = this;
+       return 0;
+}
+
+PyObject *eDVBServicePlay::getStreamingData()
+{
+       eDVBServicePMTHandler::program program;
+       if (m_service_handler.getProgramInfo(program))
+       {
+               Py_INCREF(Py_None);
+               return Py_None;
+       }
+
+       PyObject *r = program.createPythonObject();
+       ePtr<iDVBDemux> demux;
+       if (!m_service_handler.getDataDemux(demux))
+       {
+               uint8_t demux_id;
+               demux->getCADemuxID(demux_id);
+               
+               PyDict_SetItemString(r, "demux", PyInt_FromLong(demux_id));
+       }
+
+       return r;
+}
+
+
 DEFINE_REF(eDVBServicePlay)
 
 PyObject *eDVBService::getInfoObject(const eServiceReference &ref, int w)