1
0
Fork 0
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:
Andree Buschmann 2011-04-16 19:08:50 +00:00
parent e4dd514e6f
commit 19f9fd0f5f
3 changed files with 15 additions and 16 deletions

View file

@ -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);

View file

@ -1108,11 +1108,15 @@ 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);
/* TODO: The mono and stereo functions should be combined. */ /* TODO: The mono and stereo functions should be combined. */
@ -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;
} }

View file

@ -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? */