mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 18:17:39 -04:00
codecs: Fix elapsed time calculation for large files
In particular, this solves seeking glitches seen in ~6 hr mp3 files. (Patch taken from Igor Poretsky's tree) Change-Id: Id65b6726146b6d2d1a223e90b88e401d1b2d597a
This commit is contained in:
parent
0120ecd651
commit
20b91a83d3
7 changed files with 15 additions and 17 deletions
|
@ -141,8 +141,7 @@ enum codec_status codec_run(void)
|
||||||
sound_samples_done = 0;
|
sound_samples_done = 0;
|
||||||
}
|
}
|
||||||
NeAACDecPostSeekReset(decoder, i);
|
NeAACDecPostSeekReset(decoder, i);
|
||||||
elapsed_time = (sound_samples_done * 10) /
|
elapsed_time = sound_samples_done * 1000LL / ci->id3->frequency;
|
||||||
(ci->id3->frequency / 100);
|
|
||||||
} else if (param) {
|
} else if (param) {
|
||||||
elapsed_time = param;
|
elapsed_time = param;
|
||||||
action = CODEC_ACTION_SEEK_TIME;
|
action = CODEC_ACTION_SEEK_TIME;
|
||||||
|
@ -176,7 +175,7 @@ enum codec_status codec_run(void)
|
||||||
(param/10/sbr_fac)*(ci->id3->frequency/100),
|
(param/10/sbr_fac)*(ci->id3->frequency/100),
|
||||||
&sound_samples_done, (int*) &i)) {
|
&sound_samples_done, (int*) &i)) {
|
||||||
sound_samples_done *= sbr_fac;
|
sound_samples_done *= sbr_fac;
|
||||||
elapsed_time = (sound_samples_done * 10) / (ci->id3->frequency / 100);
|
elapsed_time = sound_samples_done * 1000LL / ci->id3->frequency;
|
||||||
ci->set_elapsed(elapsed_time);
|
ci->set_elapsed(elapsed_time);
|
||||||
seek_idx = 0;
|
seek_idx = 0;
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ enum codec_status codec_run(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
elapsedtime = (samplesdone*10)/(ci->id3->frequency/100);
|
elapsedtime = samplesdone * 1000LL / ci->id3->frequency;
|
||||||
ci->set_elapsed(elapsedtime);
|
ci->set_elapsed(elapsedtime);
|
||||||
|
|
||||||
/* The main decoding loop */
|
/* The main decoding loop */
|
||||||
|
@ -119,7 +119,7 @@ enum codec_status codec_run(void)
|
||||||
if (m4a_seek(&demux_res, &input_stream,
|
if (m4a_seek(&demux_res, &input_stream,
|
||||||
(param/10) * (ci->id3->frequency/100),
|
(param/10) * (ci->id3->frequency/100),
|
||||||
&samplesdone, (int *)&i)) {
|
&samplesdone, (int *)&i)) {
|
||||||
elapsedtime=(samplesdone*10)/(ci->id3->frequency/100);
|
elapsedtime=samplesdone*1000LL/ci->id3->frequency;
|
||||||
}
|
}
|
||||||
ci->set_elapsed(elapsedtime);
|
ci->set_elapsed(elapsedtime);
|
||||||
ci->seek_complete();
|
ci->seek_complete();
|
||||||
|
@ -140,7 +140,7 @@ enum codec_status codec_run(void)
|
||||||
|
|
||||||
/* Update the elapsed-time indicator */
|
/* Update the elapsed-time indicator */
|
||||||
samplesdone+=samplesdecoded;
|
samplesdone+=samplesdecoded;
|
||||||
elapsedtime=(samplesdone*10)/(ci->id3->frequency/100);
|
elapsedtime=samplesdone*1000LL/ci->id3->frequency;
|
||||||
ci->set_elapsed(elapsedtime);
|
ci->set_elapsed(elapsedtime);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
|
|
|
@ -218,7 +218,7 @@ enum codec_status codec_run(void)
|
||||||
|
|
||||||
ape_resume(&ape_ctx, resume_offset,
|
ape_resume(&ape_ctx, resume_offset,
|
||||||
¤tframe, &samplesdone, &samplestoskip, &firstbyte);
|
¤tframe, &samplesdone, &samplestoskip, &firstbyte);
|
||||||
elapsedtime = (samplesdone*10)/(ape_ctx.samplerate/100);
|
elapsedtime = samplesdone*1000LL/ape_ctx.samplerate;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
currentframe = 0;
|
currentframe = 0;
|
||||||
|
@ -285,8 +285,7 @@ frame_start:
|
||||||
inbuffer = ci->request_buffer(&bytesleft,
|
inbuffer = ci->request_buffer(&bytesleft,
|
||||||
INPUT_CHUNKSIZE);
|
INPUT_CHUNKSIZE);
|
||||||
|
|
||||||
elapsedtime = (samplesdone*10)/
|
elapsedtime = samplesdone*1000LL/ape_ctx.samplerate;
|
||||||
(ape_ctx.samplerate/100);
|
|
||||||
ci->set_elapsed(elapsedtime);
|
ci->set_elapsed(elapsedtime);
|
||||||
ci->seek_complete();
|
ci->seek_complete();
|
||||||
action = CODEC_ACTION_NULL;
|
action = CODEC_ACTION_NULL;
|
||||||
|
@ -330,7 +329,7 @@ frame_start:
|
||||||
|
|
||||||
if (!samplestoskip) {
|
if (!samplestoskip) {
|
||||||
/* Update the elapsed-time indicator */
|
/* Update the elapsed-time indicator */
|
||||||
elapsedtime = (samplesdone*10)/(ape_ctx.samplerate/100);
|
elapsedtime = samplesdone*1000LL/ape_ctx.samplerate;
|
||||||
ci->set_elapsed(elapsedtime);
|
ci->set_elapsed(elapsedtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -420,7 +420,7 @@ enum codec_status codec_run(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ci->set_elapsed((samplesdone * 1000) / current_frequency);
|
ci->set_elapsed((samplesdone * 1000LL) / current_frequency);
|
||||||
ci->seek_complete();
|
ci->seek_complete();
|
||||||
init_mad();
|
init_mad();
|
||||||
framelength = 0;
|
framelength = 0;
|
||||||
|
@ -508,7 +508,7 @@ enum codec_status codec_run(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
samplesdone += framelength;
|
samplesdone += framelength;
|
||||||
ci->set_elapsed((samplesdone * 1000) / current_frequency);
|
ci->set_elapsed((samplesdone * 1000LL) / current_frequency);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* wait for synth idle - MT only*/
|
/* wait for synth idle - MT only*/
|
||||||
|
|
|
@ -140,7 +140,7 @@ enum codec_status codec_run(void)
|
||||||
samplesdone = 0;
|
samplesdone = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
elapsed_time = (samplesdone*10)/frequency;
|
elapsed_time = (samplesdone*10LL)/frequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
ci->set_elapsed(elapsed_time);
|
ci->set_elapsed(elapsed_time);
|
||||||
|
@ -162,7 +162,7 @@ enum codec_status codec_run(void)
|
||||||
samplesdone = new_offset;
|
samplesdone = new_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
elapsed_time = (samplesdone*10)/frequency;
|
elapsed_time = (samplesdone*10LL)/frequency;
|
||||||
ci->set_elapsed(elapsed_time);
|
ci->set_elapsed(elapsed_time);
|
||||||
ci->seek_complete();
|
ci->seek_complete();
|
||||||
}
|
}
|
||||||
|
@ -182,7 +182,7 @@ enum codec_status codec_run(void)
|
||||||
frame.buffer + MPC_FRAME_LENGTH,
|
frame.buffer + MPC_FRAME_LENGTH,
|
||||||
frame.samples);
|
frame.samples);
|
||||||
samplesdone += frame.samples;
|
samplesdone += frame.samples;
|
||||||
elapsed_time = (samplesdone*10)/frequency;
|
elapsed_time = (samplesdone*10LL)/frequency;
|
||||||
ci->set_elapsed(elapsed_time);
|
ci->set_elapsed(elapsed_time);
|
||||||
/* Remark: rockbox offset is the file offset in bytes. So estimate
|
/* Remark: rockbox offset is the file offset in bytes. So estimate
|
||||||
* this offset from the samples, sampling frequency and bitrate */
|
* this offset from the samples, sampling frequency and bitrate */
|
||||||
|
|
|
@ -145,7 +145,7 @@ seek_start:
|
||||||
|
|
||||||
/* Update the elapsed-time indicator */
|
/* Update the elapsed-time indicator */
|
||||||
samplesdone += nsamples;
|
samplesdone += nsamples;
|
||||||
elapsedtime = (samplesdone*10) / (sc.sample_rate/100);
|
elapsedtime = samplesdone*1000LL/sc.sample_rate;
|
||||||
ci->set_elapsed(elapsedtime);
|
ci->set_elapsed(elapsedtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -570,7 +570,7 @@ next_page:
|
||||||
ci->set_offset((long) ci->curpos);
|
ci->set_offset((long) ci->curpos);
|
||||||
|
|
||||||
ci->set_elapsed((samplerate == 0) ? 0 :
|
ci->set_elapsed((samplerate == 0) ? 0 :
|
||||||
cur_granule * 1000 / samplerate);
|
cur_granule * 1000LL / samplerate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue