diff --git a/modules/demux/adaptive/playlist/SegmentTimeline.cpp b/modules/demux/adaptive/playlist/SegmentTimeline.cpp
index 862725b31d876608e6581ef7543c15dde578a062..f9f99cadbf46f438a029bd429cc0f9705198ddda 100644
--- a/modules/demux/adaptive/playlist/SegmentTimeline.cpp
+++ b/modules/demux/adaptive/playlist/SegmentTimeline.cpp
@@ -89,72 +89,58 @@ stime_t SegmentTimeline::getMinAheadScaledTime(uint64_t number) const
 
 uint64_t SegmentTimeline::getElementNumberByScaledPlaybackTime(stime_t scaled) const
 {
-    uint64_t prevnumber = 0;
+    const Element *prevel = NULL;
     std::list<Element *>::const_iterator it;
+
+    if(!elements.size())
+        return 0;
+
     for(it = elements.begin(); it != elements.end(); ++it)
     {
         const Element *el = *it;
-        if(it == elements.begin())
+        if(scaled >= el->t)
         {
-            scaled -= el->t;
-            prevnumber = el->number;
+            if((uint64_t)scaled < el->t + (el->d * el->r))
+                return el->number + (scaled - el->t) / el->d;
         }
-
-        for(uint64_t repeat = 1 + el->r; repeat; repeat--)
+        /* might have been discontinuity */
+        else
         {
-            if(el->d >= scaled)
-                return prevnumber;
-
-            scaled -= el->d;
-            prevnumber++;
+            if(prevel) /* > prev but < current */
+                return prevel->number + prevel->r;
+            else /* << first of the list */
+                return el->number;
         }
-
-        /* might have been discontinuity */
-        prevnumber = el->number;
+        prevel = el;
     }
 
-    return prevnumber;
+    /* time is >> any of the list */
+    return prevel->number + prevel->r;
 }
 
 bool SegmentTimeline::getScaledPlaybackTimeDurationBySegmentNumber(uint64_t number,
                                                                    stime_t *time, stime_t *duration) const
 {
-    stime_t totalscaledtime = 0;
-    stime_t lastduration = 0;
-
     std::list<Element *>::const_iterator it;
     for(it = elements.begin(); it != elements.end(); ++it)
     {
         const Element *el = *it;
-
-        /* set start time, or from discontinuity */
-        if(it == elements.begin() || el->t)
+        if(number >= el->number)
         {
-            totalscaledtime = el->t;
+            if(number <= el->number + el->r)
+            {
+                *time = el->t + el->d * (number - el->number);
+                *duration = el->d;
+                return true;
+            }
         }
-
-        lastduration = el->d;
-
-        if(number <= el->number)
-            break;
-
-        if(number <= el->number + el->r)
-        {
-            totalscaledtime += el->d * (number - el->number);
-            break;
-        }
-
-        totalscaledtime += (el->d * (el->r + 1));
     }
-
-    *time = totalscaledtime;
-    *duration = lastduration;
-    return true;
+    return false;
 }
 
 stime_t SegmentTimeline::getScaledPlaybackTimeByElementNumber(uint64_t number) const
 {
-    stime_t time, duration;
+    stime_t time = 0, duration = 0;
     (void) getScaledPlaybackTimeDurationBySegmentNumber(number, &time, &duration);
     return time;
 }