forked from len0rd/rockbox
Refactor alac decoder as preparation for upcoming m4a changes. The alac decoder does not need to use get_sample_info() to gather frame size or the number of consumed bytes.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29724 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
e4dd514e6f
commit
19f9fd0f5f
3 changed files with 15 additions and 16 deletions
|
@ -35,8 +35,6 @@ enum codec_status codec_main(void)
|
||||||
stream_t input_stream;
|
stream_t input_stream;
|
||||||
uint32_t samplesdone;
|
uint32_t samplesdone;
|
||||||
uint32_t elapsedtime;
|
uint32_t elapsedtime;
|
||||||
uint32_t sample_duration;
|
|
||||||
uint32_t sample_byte_size;
|
|
||||||
int samplesdecoded;
|
int samplesdecoded;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned char* buffer;
|
unsigned char* buffer;
|
||||||
|
@ -112,18 +110,9 @@ enum codec_status codec_main(void)
|
||||||
ci->seek_complete();
|
ci->seek_complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lookup the length (in samples and bytes) of block i */
|
|
||||||
if (!get_sample_info(&demux_res, i, &sample_duration,
|
|
||||||
&sample_byte_size)) {
|
|
||||||
LOGF("ALAC: Error in get_sample_info\n");
|
|
||||||
retval = CODEC_ERROR;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Request the required number of bytes from the input buffer */
|
/* Request the required number of bytes from the input buffer */
|
||||||
|
buffer=ci->request_buffer(&n, demux_res.sample_byte_size[i]);
|
||||||
buffer=ci->request_buffer(&n,sample_byte_size);
|
if (n!=demux_res.sample_byte_size[i]) {
|
||||||
if (n!=sample_byte_size) {
|
|
||||||
retval = CODEC_ERROR;
|
retval = CODEC_ERROR;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
@ -132,15 +121,15 @@ enum codec_status codec_main(void)
|
||||||
ci->yield();
|
ci->yield();
|
||||||
samplesdecoded=alac_decode_frame(&alac, buffer, outputbuffer, ci->yield);
|
samplesdecoded=alac_decode_frame(&alac, buffer, outputbuffer, ci->yield);
|
||||||
|
|
||||||
/* Advance codec buffer n bytes */
|
/* Advance codec buffer by amount of consumed bytes */
|
||||||
ci->advance_buffer(n);
|
ci->advance_buffer(alac.bytes_consumed);
|
||||||
|
|
||||||
/* Output the audio */
|
/* Output the audio */
|
||||||
ci->yield();
|
ci->yield();
|
||||||
ci->pcmbuf_insert(outputbuffer[0], outputbuffer[1], samplesdecoded);
|
ci->pcmbuf_insert(outputbuffer[0], outputbuffer[1], samplesdecoded);
|
||||||
|
|
||||||
/* Update the elapsed-time indicator */
|
/* Update the elapsed-time indicator */
|
||||||
samplesdone+=sample_duration;
|
samplesdone+=samplesdecoded;
|
||||||
elapsedtime=(samplesdone*10)/(ci->id3->frequency/100);
|
elapsedtime=(samplesdone*10)/(ci->id3->frequency/100);
|
||||||
ci->set_elapsed(elapsedtime);
|
ci->set_elapsed(elapsedtime);
|
||||||
|
|
||||||
|
|
|
@ -1108,10 +1108,14 @@ int alac_decode_frame(alac_file *alac,
|
||||||
{
|
{
|
||||||
int channels;
|
int channels;
|
||||||
int outputsamples;
|
int outputsamples;
|
||||||
|
int input_buffer_start;
|
||||||
|
|
||||||
/* setup the stream */
|
/* setup the stream */
|
||||||
alac->input_buffer = inbuffer;
|
alac->input_buffer = inbuffer;
|
||||||
alac->input_buffer_bitaccumulator = 0;
|
alac->input_buffer_bitaccumulator = 0;
|
||||||
|
|
||||||
|
/* save to gather byte consumption */
|
||||||
|
input_buffer_start = (int)alac->input_buffer;
|
||||||
|
|
||||||
channels = readbits(alac, 3);
|
channels = readbits(alac, 3);
|
||||||
|
|
||||||
|
@ -1127,6 +1131,11 @@ int alac_decode_frame(alac_file *alac,
|
||||||
default: /* Unsupported */
|
default: /* Unsupported */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* calculate consumed bytes */
|
||||||
|
alac->bytes_consumed = (int)alac->input_buffer - input_buffer_start;
|
||||||
|
alac->bytes_consumed += (alac->input_buffer_bitaccumulator>5) ? 2 : 1;
|
||||||
|
|
||||||
return outputsamples;
|
return outputsamples;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ typedef struct
|
||||||
int samplesize;
|
int samplesize;
|
||||||
int numchannels;
|
int numchannels;
|
||||||
int bytespersample;
|
int bytespersample;
|
||||||
|
int bytes_consumed;
|
||||||
|
|
||||||
/* stuff from setinfo */
|
/* stuff from setinfo */
|
||||||
uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */
|
uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue