diff options
Diffstat (limited to 'lib/rbcodec/codecs/libasf')
-rw-r--r-- | lib/rbcodec/codecs/libasf/asf.c | 14 | ||||
-rw-r--r-- | lib/rbcodec/codecs/libasf/asf.h | 2 |
2 files changed, 11 insertions, 5 deletions
diff --git a/lib/rbcodec/codecs/libasf/asf.c b/lib/rbcodec/codecs/libasf/asf.c index 4e3235a422..5f6456a2cb 100644 --- a/lib/rbcodec/codecs/libasf/asf.c +++ b/lib/rbcodec/codecs/libasf/asf.c | |||
@@ -386,11 +386,17 @@ int asf_get_timestamp(int *duration) | |||
386 | int asf_seek(int ms, asf_waveformatex_t* wfx) | 386 | int asf_seek(int ms, asf_waveformatex_t* wfx) |
387 | { | 387 | { |
388 | int time, duration, delta, temp, count=0; | 388 | int time, duration, delta, temp, count=0; |
389 | int bitrate = ci->id3->bitrate*1000/8; | ||
389 | 390 | ||
390 | /*estimate packet number from bitrate*/ | 391 | /*estimate packet number from bitrate*/ |
391 | int initial_packet = ci->curpos/wfx->packet_size; | 392 | int initial_packet = ci->curpos/wfx->packet_size; |
392 | int packet_num = (((int64_t)ms)*(wfx->bitrate>>3))/wfx->packet_size/1000; | 393 | int packet_num = (((int64_t)ms)*(bitrate))/wfx->packet_size/1000; |
393 | int last_packet = ci->id3->filesize / wfx->packet_size; | 394 | /*subtract header size in case theres a lot of metadata*/ |
395 | int last_packet = (ci->id3->filesize-ci->id3->first_frame_offset) / wfx->packet_size; | ||
396 | |||
397 | /* | ||
398 | DEBUGF("bitrate: %d\n", bitrate); | ||
399 | DEBUGF("attempting seek to: %d ms, initialp: %d, lastp: %d, estimating packet: %d, packet size: %d\n", ms, initial_packet, last_packet, packet_num, wfx->packet_size);*/ | ||
394 | 400 | ||
395 | if (packet_num > last_packet) { | 401 | if (packet_num > last_packet) { |
396 | packet_num = last_packet; | 402 | packet_num = last_packet; |
@@ -409,7 +415,7 @@ int asf_seek(int ms, asf_waveformatex_t* wfx) | |||
409 | 415 | ||
410 | /*check the time stamp of our packet*/ | 416 | /*check the time stamp of our packet*/ |
411 | time = asf_get_timestamp(&duration); | 417 | time = asf_get_timestamp(&duration); |
412 | /*DEBUGF("seeked to %d ms with duration %d\n", time, duration);*/ | 418 | /*DEBUGF("seeked to %d ms (%d) with duration %d\n", time,packet_num, duration);*/ |
413 | 419 | ||
414 | if (time < 0) { | 420 | if (time < 0) { |
415 | /*unknown error, try to recover*/ | 421 | /*unknown error, try to recover*/ |
@@ -427,7 +433,7 @@ int asf_seek(int ms, asf_waveformatex_t* wfx) | |||
427 | delta = ms-time; | 433 | delta = ms-time; |
428 | /*estimate new packet number from bitrate and our current position*/ | 434 | /*estimate new packet number from bitrate and our current position*/ |
429 | temp += delta; | 435 | temp += delta; |
430 | packet_num = ((temp/1000)*(wfx->bitrate>>3) - (wfx->packet_size>>1))/wfx->packet_size; //round down! | 436 | packet_num = ((temp/1000)*(bitrate) - (wfx->packet_size<<1))/wfx->packet_size; //round down! |
431 | packet_offset = packet_num*wfx->packet_size; | 437 | packet_offset = packet_num*wfx->packet_size; |
432 | ci->seek_buffer(ci->id3->first_frame_offset+packet_offset); | 438 | ci->seek_buffer(ci->id3->first_frame_offset+packet_offset); |
433 | } | 439 | } |
diff --git a/lib/rbcodec/codecs/libasf/asf.h b/lib/rbcodec/codecs/libasf/asf.h index a7d384cf3d..2398a44eab 100644 --- a/lib/rbcodec/codecs/libasf/asf.h +++ b/lib/rbcodec/codecs/libasf/asf.h | |||
@@ -33,7 +33,7 @@ struct asf_waveformatex_s { | |||
33 | uint16_t blockalign; | 33 | uint16_t blockalign; |
34 | uint16_t bitspersample; | 34 | uint16_t bitspersample; |
35 | uint16_t datalen; | 35 | uint16_t datalen; |
36 | uint16_t numpackets; | 36 | uint64_t numpackets; |
37 | uint8_t data[46]; | 37 | uint8_t data[46]; |
38 | }; | 38 | }; |
39 | typedef struct asf_waveformatex_s asf_waveformatex_t; | 39 | typedef struct asf_waveformatex_s asf_waveformatex_t; |