diff options
-rw-r--r-- | lib/rbcodec/codecs/mpa.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/rbcodec/codecs/mpa.c b/lib/rbcodec/codecs/mpa.c index bafed3970c..c5d47a6791 100644 --- a/lib/rbcodec/codecs/mpa.c +++ b/lib/rbcodec/codecs/mpa.c | |||
@@ -192,12 +192,20 @@ static int get_file_pos(int newtime) | |||
192 | pos = cur_toc * toc_sizestep; | 192 | pos = cur_toc * toc_sizestep; |
193 | 193 | ||
194 | /* Interpolate between this TOC mark and the next TOC mark */ | 194 | /* Interpolate between this TOC mark and the next TOC mark */ |
195 | newtime -= percent * pct_timestep; | 195 | int newtime_toc = newtime - percent * pct_timestep; |
196 | pos += (uint64_t)plength * newtime / pct_timestep; | 196 | pos += (uint64_t)plength * newtime_toc / pct_timestep; |
197 | } else { | 197 | } else { |
198 | /* No TOC exists, estimate the new position */ | 198 | /* No TOC exists, estimate the new position */ |
199 | pos = (uint64_t)newtime * id3->filesize / id3->length; | 199 | pos = (uint64_t)newtime * id3->filesize / id3->length; |
200 | } | 200 | } |
201 | // VBR seek might be very inaccurate in long files | ||
202 | // So make sure that seeking actually happened in the intended direction | ||
203 | // Fix jumps in the wrong direction by seeking relative to the current position | ||
204 | long delta = id3->elapsed - newtime; | ||
205 | if ((delta >= 0 && pos > ci->curpos) || (delta < 0 && pos < ci->curpos)) | ||
206 | { | ||
207 | pos = ci->curpos - delta * id3->filesize / id3->length; | ||
208 | } | ||
201 | } else if (id3->bitrate) { | 209 | } else if (id3->bitrate) { |
202 | pos = newtime * (id3->bitrate / 8); | 210 | pos = newtime * (id3->bitrate / 8); |
203 | } else { | 211 | } else { |