summaryrefslogtreecommitdiff
path: root/lib/rbcodec
diff options
context:
space:
mode:
authorFrederik M.J. Vestre <freqmod@gmail.com>2012-09-25 19:17:00 +0200
committerFrederik Vestre <freqmod@gmail.com>2012-10-14 11:26:00 +0200
commit7a7d7a2f4ca1d2474df768e2698dc9e158ba1bb0 (patch)
treeb1e81774f237ec22ecb905bed91fe7d598f1ebca /lib/rbcodec
parentab5879c5ea3508380a6ef43a01bbd465f816db00 (diff)
downloadrockbox-7a7d7a2f4ca1d2474df768e2698dc9e158ba1bb0.tar.gz
rockbox-7a7d7a2f4ca1d2474df768e2698dc9e158ba1bb0.zip
Improve seeking in opus, tested on Sansa; not tested
on a target with a disk. Change-Id: I37c875c9cd014eb61fe5232dab0f4b8f15f057dd Reviewed-on: http://gerrit.rockbox.org/319 Tested-by: Thiago Okada <thiago.mast3r@gmail.com> Reviewed-by: Frederik Vestre <freqmod@gmail.com> Tested-by: Frederik Vestre <freqmod@gmail.com>
Diffstat (limited to 'lib/rbcodec')
-rw-r--r--lib/rbcodec/codecs/opus.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/rbcodec/codecs/opus.c b/lib/rbcodec/codecs/opus.c
index cf2d69738f..3eb316de68 100644
--- a/lib/rbcodec/codecs/opus.c
+++ b/lib/rbcodec/codecs/opus.c
@@ -188,8 +188,7 @@ static int64_t seek_backwards(ogg_sync_state *oy, ogg_page *og,
188} 188}
189 189
190static int speex_seek_page_granule(int64_t pos, int64_t curpos, 190static int speex_seek_page_granule(int64_t pos, int64_t curpos,
191 ogg_sync_state *oy, 191 ogg_sync_state *oy)
192 int64_t headerssize)
193{ 192{
194 /* TODO: Someone may want to try to implement seek to packet, 193 /* TODO: Someone may want to try to implement seek to packet,
195 instead of just to page (should be more accurate, not be any 194 instead of just to page (should be more accurate, not be any
@@ -204,7 +203,7 @@ static int speex_seek_page_granule(int64_t pos, int64_t curpos,
204 ogg_page og = {0,0,0,0}; 203 ogg_page og = {0,0,0,0};
205 int64_t avgpagelen = -1; 204 int64_t avgpagelen = -1;
206 int64_t lastgranule = -1; 205 int64_t lastgranule = -1;
207 206#if 0
208 if(abs(pos-curpos)>10000 && headerssize>0 && curoffset-headerssize>10000) { 207 if(abs(pos-curpos)>10000 && headerssize>0 && curoffset-headerssize>10000) {
209 /* if seeking for more that 10sec, 208 /* if seeking for more that 10sec,
210 headersize is known & more than 10kb is played, 209 headersize is known & more than 10kb is played,
@@ -252,10 +251,14 @@ static int speex_seek_page_granule(int64_t pos, int64_t curpos,
252 } 251 }
253 } 252 }
254 } 253 }
255 254#endif
256 /* which way do we want to seek? */ 255 /* which way do we want to seek? */
257 256 if (pos == 0) { /* start */
258 if (curpos > pos) { /* backwards */ 257 *curbyteoffset = 0;
258 ci->seek_buffer(*curbyteoffset);
259 ogg_sync_reset(oy);
260 return 0;
261 } else if (curpos > pos) { /* backwards */
259 offset = seek_backwards(oy,&og,pos); 262 offset = seek_backwards(oy,&og,pos);
260 263
261 if (offset > 0) { 264 if (offset > 0) {
@@ -364,7 +367,7 @@ enum codec_status codec_run(void)
364 367
365 LOGF("Opus seek page:%lld,%lld,%ld\n", 368 LOGF("Opus seek page:%lld,%lld,%ld\n",
366 seek_target, page_granule, (long)param); 369 seek_target, page_granule, (long)param);
367 speex_seek_page_granule(seek_target, page_granule, &oy, 0); 370 speex_seek_page_granule(seek_target, page_granule, &oy);
368 } 371 }
369 372
370 ci->set_elapsed(param); 373 ci->set_elapsed(param);