fix ratio calculation for slow reverse skipping
[enigma2.git] / lib / dvb / dvb.cpp
index 4a3adf55a22adce81407c6c0ef506e9253b09784..f8f5a3785d567e97df50a3a6ddb7bcd860301b95 100644 (file)
@@ -685,13 +685,16 @@ void eDVBChannel::cueSheetEvent(int event)
                                eDebug("skipmode ratio is %lld:90000, bitrate is %d bit/s", m_cue->m_skipmode_ratio, bitrate);
                                                /* i agree that this might look a bit like black magic. */
                                m_skipmode_n = 512*1024; /* must be 1 iframe at least. */
-                               m_skipmode_m = bitrate / 8 / 90000 * m_cue->m_skipmode_ratio;
+                               m_skipmode_m = bitrate / 8 / 90000 * m_cue->m_skipmode_ratio / 8;
+                               
+                               if (m_cue->m_skipmode_ratio < 0)
+                                       m_skipmode_m -= m_skipmode_n;
        
                                eDebug("resolved to: %d %d", m_skipmode_m, m_skipmode_n);
                                
                                if (abs(m_skipmode_m) < abs(m_skipmode_n))
                                {
-                                       eFatal("damn, something is wrong with this calculation");
+                                       eWarning("something is wrong with this calculation");
                                        m_skipmode_n = m_skipmode_m = 0;
                                }
                                
@@ -766,8 +769,16 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                if (relative)
                {
                        pts_t now;
-                                       /* we're using the decoder's timestamp here. this 
-                                          won't work for radio (ouch). */
+                       if (!m_cue->m_decoder)
+                       {
+                               eDebug("no decoder - can't seek relative");
+                               continue;
+                       }
+                       if (m_cue->m_decoder->getPTS(0, now))
+                       {
+                               eDebug("decoder getPTS failed, can't seek relative");
+                               continue;
+                       }
                        if (getCurrentPosition(m_cue->m_decoding_demux, now, 1))
                        {
                                eDebug("seekTo: getCurrentPosition failed!");
@@ -1092,9 +1103,10 @@ void eCueSheet::setSkipmode(const pts_t &ratio)
        m_event(evtSkipmode);
 }
 
-void eCueSheet::setDecodingDemux(iDVBDemux *demux)
+void eCueSheet::setDecodingDemux(iDVBDemux *demux, iTSMPEGDecoder *decoder)
 {
        m_decoding_demux = demux;
+       m_decoder = decoder;
 }
 
 RESULT eCueSheet::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection)