diff options
| author | Dan Everton <dan@iocaine.org> | 2007-03-12 11:54:07 +0000 |
|---|---|---|
| committer | Dan Everton <dan@iocaine.org> | 2007-03-12 11:54:07 +0000 |
| commit | 879070f89e004be03cef53ad7f61610e02e7aa00 (patch) | |
| tree | eccbcce2722da50eb473c78cf9ce16fad6602c00 /apps/codecs/speex.c | |
| parent | 19bba742e789e669d4cfc15ed3a5cef4aa64199d (diff) | |
| download | rockbox-879070f89e004be03cef53ad7f61610e02e7aa00.zip rockbox-879070f89e004be03cef53ad7f61610e02e7aa00.tar.gz rockbox-879070f89e004be03cef53ad7f61610e02e7aa00.tar.bz2 rockbox-879070f89e004be03cef53ad7f61610e02e7aa00.tar.xz | |
* Clean up speex.c a little.
* Sync to Speex SVN 12735 which includes some of our warnings fixes.
* Move decoder output to IRAM. Not much perfomance gain though.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12735 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/speex.c')
| -rw-r--r-- | apps/codecs/speex.c | 188 |
1 files changed, 88 insertions, 100 deletions
diff --git a/apps/codecs/speex.c b/apps/codecs/speex.c index a9b333b..8dd9f01 100644 --- a/apps/codecs/speex.c +++ b/apps/codecs/speex.c @@ -30,20 +30,18 @@ #define CHUNKSIZE 10000 /*2kb*/ #define SEEK_CHUNKSIZE 7*CHUNKSIZE -//#define LOGF(...) - CODEC_HEADER -struct codec_api *rb; +spx_int16_t output[MAX_FRAME_SIZE] IBSS_ATTR; -int get_more_data(spx_ogg_sync_state *oy,struct codec_api *rb) +int get_more_data(spx_ogg_sync_state *oy) { int bytes; char *buffer; buffer = (char *)spx_ogg_sync_buffer(oy,CHUNKSIZE); - bytes = rb->read_filebuf(buffer, sizeof(char)*CHUNKSIZE); + bytes = ci->read_filebuf(buffer, sizeof(char)*CHUNKSIZE); spx_ogg_sync_wrote(oy,bytes); @@ -53,14 +51,14 @@ int get_more_data(spx_ogg_sync_state *oy,struct codec_api *rb) /* The read/seek functions track absolute position within the stream */ static spx_int64_t get_next_page(spx_ogg_sync_state *oy,spx_ogg_page *og, - spx_int64_t boundary,struct codec_api *rb) + spx_int64_t boundary) { - spx_int64_t localoffset = rb->curpos; + spx_int64_t localoffset = ci->curpos; long more; long ret; if (boundary > 0) - boundary += rb->curpos; + boundary += ci->curpos; while (1) { more = spx_ogg_sync_pageseek(oy,og); @@ -73,7 +71,7 @@ static spx_int64_t get_next_page(spx_ogg_sync_state *oy,spx_ogg_page *og, /* send more paramedics */ if(!boundary)return(-1); { - ret = get_more_data(oy,rb); + ret = get_more_data(oy); if (ret == 0) return(-2); @@ -93,12 +91,11 @@ static spx_int64_t get_next_page(spx_ogg_sync_state *oy,spx_ogg_page *og, } static spx_int64_t seek_backwards(spx_ogg_sync_state *oy, spx_ogg_page *og, - spx_int64_t wantedpos, - struct codec_api *rb) + spx_int64_t wantedpos) { spx_int64_t crofs; spx_int64_t *curoffset=&crofs; - *curoffset=rb->curpos; + *curoffset=ci->curpos; spx_int64_t begin=*curoffset; spx_int64_t end=begin; spx_int64_t ret; @@ -124,14 +121,14 @@ static spx_int64_t seek_backwards(spx_ogg_sync_state *oy, spx_ogg_page *og, *curoffset = begin; - rb->seek_buffer(*curoffset); + ci->seek_buffer(*curoffset); spx_ogg_sync_reset(oy); lastgranule = -1; while (*curoffset < end) { - ret = get_next_page(oy,og,end-*curoffset,rb); + ret = get_next_page(oy,og,end-*curoffset); if (ret > 0) { if (lastgranule != -1) { @@ -184,8 +181,7 @@ static spx_int64_t seek_backwards(spx_ogg_sync_state *oy, spx_ogg_page *og, int speex_seek_page_granule(spx_int64_t pos, spx_int64_t curpos, spx_ogg_sync_state *oy, - spx_int64_t headerssize, - struct codec_api *rb) + spx_int64_t headerssize) { /* TODO: Someone may want to try to implement seek to packet, instead of just to page (should be more accurate, not be any @@ -193,7 +189,7 @@ int speex_seek_page_granule(spx_int64_t pos, spx_int64_t curpos, spx_int64_t crofs; spx_int64_t *curbyteoffset = &crofs; - *curbyteoffset = rb->curpos; + *curbyteoffset = ci->curpos; spx_int64_t curoffset; curoffset = *curbyteoffset; spx_int64_t offset = 0; @@ -217,31 +213,31 @@ int speex_seek_page_granule(spx_int64_t pos, spx_int64_t curpos, //spx_int64_t toffset=curoffset; - rb->seek_buffer(curoffset); + ci->seek_buffer(curoffset); spx_ogg_sync_reset(oy); - offset = get_next_page(oy,&og,-1,rb); + offset = get_next_page(oy,&og,-1); if (offset < 0) { /* could not find new page,use old offset */ LOGF("Seek/guess/fault:%d->-<-%d,%d:%d,%d,%d\n", curpos,0,pos,offset,0, - rb->curpos,/*stream_length*/0); + ci->curpos,/*stream_length*/0); curoffset = *curbyteoffset; - rb->seek_buffer(curoffset); + ci->seek_buffer(curoffset); spx_ogg_sync_reset(oy); } else { if (spx_ogg_page_granulepos(&og) == 0 && pos > 5000) { LOGF("SEEK/guess/fault:%d->-<-%d,%d:%d,%d,%d\n", curpos,spx_ogg_page_granulepos(&og),pos, - offset,0,rb->curpos,/*stream_length*/0); + offset,0,ci->curpos,/*stream_length*/0); curoffset = *curbyteoffset; - rb->seek_buffer(curoffset); + ci->seek_buffer(curoffset); spx_ogg_sync_reset(oy); } else { @@ -254,7 +250,7 @@ int speex_seek_page_granule(spx_int64_t pos, spx_int64_t curpos, /* which way do we want to seek? */ if (curpos > pos) { /* backwards */ - offset = seek_backwards(oy,&og,pos,rb); + offset = seek_backwards(oy,&og,pos); if (offset > 0) { *curbyteoffset = curoffset; @@ -262,7 +258,7 @@ int speex_seek_page_granule(spx_int64_t pos, spx_int64_t curpos, } } else { /* forwards */ - while ( (offset = get_next_page(oy,&og,-1,rb)) > 0) { + while ( (offset = get_next_page(oy,&og,-1)) > 0) { if (lastgranule != -1) { if (avgpagelen < 0) avgpagelen = (spx_ogg_page_granulepos(&og) - lastgranule); @@ -286,13 +282,13 @@ int speex_seek_page_granule(spx_int64_t pos, spx_int64_t curpos, } } - rb->seek_buffer(*curbyteoffset); + ci->seek_buffer(*curbyteoffset); spx_ogg_sync_reset(oy); LOGF("Seek failed:%d\n", offset); - rb->splash(HZ*2, true, "Seek failed"); + ci->splash(HZ*2, true, "Seek failed"); return -1; } @@ -327,7 +323,7 @@ static void *process_header(spx_ogg_packet *op, modeID = header->mode; - mode = speex_lib_get_mode (modeID); + mode = speex_lib_get_mode(modeID); if (header->speex_version_id > 1) { DEBUGF("Undecodeable bitstream"); @@ -352,9 +348,6 @@ static void *process_header(spx_ogg_packet *op, speex_decoder_ctl(st, SPEEX_SET_ENH, &enh_enabled); speex_decoder_ctl(st, SPEEX_GET_FRAME_SIZE, frame_size); - if (*channels==-1) - *channels = header->nb_channels; - if (!(*channels==1)){ callback.callback_id = SPEEX_INBAND_STEREO; callback.func = speex_std_stereo_request_handler; @@ -368,11 +361,8 @@ static void *process_header(spx_ogg_packet *op, *nframes = header->frames_per_packet; - if (*channels == 2) { - rb->configure(DSP_SET_STEREO_MODE, STEREO_INTERLEAVED); - } else if (*channels == 1) { - rb->configure(DSP_SET_STEREO_MODE, STEREO_MONO); - } + if (*channels == -1) + *channels = header->nb_channels; *extra_headers = header->extra_headers; @@ -383,35 +373,28 @@ static void *process_header(spx_ogg_packet *op, /* this is the codec entry point */ enum codec_status codec_main(void) { - SpeexBits vf; - int error; - int eof; + SpeexBits bits; + int error = 0; + int eof = 0; spx_ogg_sync_state oy; spx_ogg_page og; spx_ogg_packet op; spx_ogg_stream_state os; - spx_int64_t page_granule=0, cur_granule=0; - int enh_enabled; - int nframes=2; - int eos=0; + spx_int64_t page_granule = 0, cur_granule = 0; + int enh_enabled = 1; + int nframes = 2; + int eos = 0; SpeexStereoState stereo = SPEEX_STEREO_STATE_INIT; - int channels=-1; - int rate=0,samplerate=0; - int extra_headers; - int stream_init=0; - int page_nb_packets,frame_size,packet_count=0; - int lookahead; - int headerssize=-1; - unsigned long strtoffset; - short output[MAX_FRAME_SIZE]; - enh_enabled = 1; - void *st=0; - int j; - rb = ci; - - //rb->configure(CODEC_SET_FILEBUF_CHUNKSIZE, CHUNKSIZE*128); - //rb->configure(DSP_DITHER, false); - rb->configure(DSP_SET_SAMPLE_DEPTH, 16); + int channels = -1; + int rate = 0, samplerate = 0; + int extra_headers = 0; + int stream_init = 0; + int page_nb_packets, frame_size, packet_count = 0; + int lookahead = 0; + int headerssize = -1; + unsigned long strtoffset = 0; + void *st = NULL; + int j = 0; /* We need to flush reserver memory every track load. */ next_track: @@ -421,44 +404,44 @@ next_track: goto exit; } - strtoffset=rb->id3->offset; + strtoffset = ci->id3->offset; - while (!*rb->taginfo_ready && !rb->stop_codec) - rb->sleep(1); + while (!*ci->taginfo_ready && !ci->stop_codec) + ci->sleep(1); spx_ogg_sync_init(&oy); spx_ogg_alloc_buffer(&oy,2*CHUNKSIZE); - samplerate = rb->id3->frequency; - codec_set_replaygain(rb->id3); + samplerate = ci->id3->frequency; + codec_set_replaygain(ci->id3); - speex_bits_init(&vf); + speex_bits_init(&bits); eof = 0; while (!eof) { - rb->yield(); - if (rb->stop_codec || rb->new_track) + ci->yield(); + if (ci->stop_codec || ci->new_track) break; /*seek (seeks to the page before the position) */ - if (rb->seek_time) { + if (ci->seek_time) { if(samplerate!=0&&packet_count>1){ LOGF("Speex seek page:%d,%d,%d,%d\n", - ((spx_int64_t)rb->seek_time/1000) * + ((spx_int64_t)ci->seek_time/1000) * (spx_int64_t)samplerate, - page_granule, rb->seek_time, + page_granule, ci->seek_time, (page_granule/samplerate)*1000, samplerate); - speex_seek_page_granule(((spx_int64_t)rb->seek_time/1000) * + speex_seek_page_granule(((spx_int64_t)ci->seek_time/1000) * (spx_int64_t)samplerate, - page_granule, &oy, headerssize, rb); - rb->seek_complete(); + page_granule, &oy, headerssize); + ci->seek_complete(); } } next_page: /*Get the ogg buffer for writing*/ - if(get_more_data(&oy,rb)<1){/*read error*/ + if(get_more_data(&oy)<1){/*read error*/ error=CODEC_ERROR; goto done; } @@ -467,7 +450,7 @@ next_page: while (spx_ogg_sync_pageout(&oy, &og) == 1) { int packet_no; if (stream_init == 0) { - spx_ogg_stream_init(&os,spx_ogg_page_serialno(&og)); + spx_ogg_stream_init(&os, spx_ogg_page_serialno(&og)); stream_init = 1; } @@ -486,7 +469,7 @@ next_page: /* If first packet, process as Speex header */ if (packet_count==0){ st = process_header(&op, enh_enabled, &frame_size, - &samplerate,&nframes, &channels, + &samplerate, &nframes, &channels, &stereo, &extra_headers); speex_decoder_ctl(st, SPEEX_GET_LOOKAHEAD, &lookahead); @@ -499,13 +482,19 @@ next_page: goto exit; } - rb->id3->vbr = true; - rb->id3->frequency = samplerate; - rb->configure(DSP_SET_FREQUENCY, rb->id3->frequency); + ci->id3->vbr = true; + ci->id3->frequency = samplerate; + ci->configure(DSP_SET_FREQUENCY, ci->id3->frequency); + ci->configure(DSP_SET_SAMPLE_DEPTH, 16); + if (channels == 2) { + ci->configure(DSP_SET_STEREO_MODE, STEREO_INTERLEAVED); + } else if (channels == 1) { + ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO); + } /* Speex header in its own page, add the whole page headersize */ - headerssize+=og.header_len+og.body_len; + headerssize += og.header_len+og.body_len; } else if (packet_count<=1+extra_headers){ /* add packet to headersize */ @@ -515,7 +504,7 @@ next_page: } else { if (packet_count <= 2+extra_headers) { if (strtoffset) { - rb->seek_buffer(strtoffset); + ci->seek_buffer(strtoffset); spx_ogg_sync_reset(&oy); packet_count++; goto next_page; @@ -528,21 +517,21 @@ next_page: /* Copy Ogg packet to Speex bitstream */ - speex_bits_read_from(&vf, (char*)op.packet, op.bytes); + speex_bits_read_from(&bits, (char*)op.packet, op.bytes); for (j = 0; j != nframes; j++){ int ret; /* Decode frame */ - ret = speex_decode_int(st, &vf, output); + ret = speex_decode_int(st, &bits, output); - if (ret==-1) + if (ret == -1) break; - if (ret==-2) + if (ret == -2) break; - if (speex_bits_remaining(&vf) < 0) + if (speex_bits_remaining(&bits) < 0) break; if (channels == 2) @@ -550,17 +539,16 @@ next_page: int new_frame_size = frame_size; - if (new_frame_size>0){ - rb->pcmbuf_insert((const char*)output, NULL, - new_frame_size); + if (new_frame_size > 0) { + ci->pcmbuf_insert(output, NULL, new_frame_size); /* 2 bytes/sample */ cur_granule += new_frame_size / 2; - rb->set_offset((long)rb->curpos); + ci->set_offset((long) ci->curpos); - rb->set_elapsed( (samplerate==0) ? 0 : - cur_granule*1000/samplerate); + ci->set_elapsed((samplerate == 0) ? 0 : + cur_granule * 1000 / samplerate); } } } @@ -570,24 +558,24 @@ next_page: } done: - if (rb->request_next_track()) { + if (ci->request_next_track()) { /* Clean things up for the next track */ speex_decoder_destroy(st); - speex_bits_reset(&vf); + speex_bits_reset(&bits); - if (stream_init==1) + if (stream_init == 1) spx_ogg_stream_reset(&os); spx_ogg_sync_reset(&oy); cur_granule = stream_init = rate = samplerate = headerssize - = packet_count = eos = 0; + = packet_count = eos = 0; - stereo.balance =stereo.smooth_left = stereo.smooth_right = 1; + stereo.balance = stereo.smooth_left = stereo.smooth_right = 1; stereo.e_ratio = .5; - stereo.reserved1=stereo.reserved2= 0; + stereo.reserved1 = stereo.reserved2 = 0; goto next_track; } @@ -595,7 +583,7 @@ done: error = CODEC_OK; exit: - speex_bits_destroy(&vf); + speex_bits_destroy(&bits); if (stream_init) spx_ogg_stream_destroy(&os); |