# HG changeset patch # User nenolod # Date 1172579392 28800 # Node ID 6ae04ca57bc1a35a0ebef40127a17c660b0ea1b7 # Parent 9480fdc511f1bce7138c996d97bb6dfd11c9b990 [svn] - some ringbuffering issues could cause crashing. a final review has resulted in this fix. diff -r 9480fdc511f1 -r 6ae04ca57bc1 ChangeLog --- a/ChangeLog Tue Feb 27 04:19:56 2007 -0800 +++ b/ChangeLog Tue Feb 27 04:29:52 2007 -0800 @@ -1,3 +1,12 @@ +2007-02-27 12:19:56 +0000 William Pitcock + revision [1576] + - do not pass a buffered FD to the decoding thread, just use it for + determining whether or not the stream is ADTS. + + trunk/src/aac/src/libmp4.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + + 2007-02-27 12:17:49 +0000 Yoshiki Yazawa revision [1574] - add read/write support for TLEN frame. diff -r 9480fdc511f1 -r 6ae04ca57bc1 src/aac/src/libmp4.c --- a/src/aac/src/libmp4.c Tue Feb 27 04:19:56 2007 -0800 +++ b/src/aac/src/libmp4.c Tue Feb 27 04:29:52 2007 -0800 @@ -646,10 +646,10 @@ return TRUE; } -static void my_decode_aac( InputPlayback *playback, char *filename, VFSFile *file ) +void my_decode_aac( InputPlayback *playback, char *filename, VFSFile *file ) { faacDecHandle decoder = 0; - guchar buffer[BUFFER_SIZE]; + guchar streambuffer[BUFFER_SIZE]; gulong bufferconsumed = 0; gulong samplerate = 0; guchar channels; @@ -671,7 +671,7 @@ g_static_mutex_unlock(&mutex); g_thread_exit(NULL); } - if((buffervalid = vfs_fread(buffer, 1, BUFFER_SIZE, file))==0){ + if((buffervalid = vfs_fread(streambuffer, 1, BUFFER_SIZE, file))==0){ g_print("AAC: Error reading file\n"); vfs_fclose(file); buffer_playing = FALSE; @@ -679,14 +679,15 @@ g_static_mutex_unlock(&mutex); g_thread_exit(NULL); } - if(!strncmp((char*)buffer, "ID3", 3)){ + if(!strncmp((char*)streambuffer, "ID3", 3)){ gint size = 0; vfs_fseek(file, 0, SEEK_SET); - size = (buffer[6]<<21) | (buffer[7]<<14) | (buffer[8]<<7) | buffer[9]; + size = (streambuffer[6]<<21) | (streambuffer[7]<<14) | + (streambuffer[8]<<7) | streambuffer[9]; size+=10; - vfs_fread(buffer, 1, size, file); - buffervalid = vfs_fread(buffer, 1, BUFFER_SIZE, file); + vfs_fread(streambuffer, 1, size, file); + buffervalid = vfs_fread(streambuffer, 1, BUFFER_SIZE, file); } ttemp = vfs_get_metadata(file, "stream-name"); @@ -699,17 +700,17 @@ else xmmstitle = g_strdup(g_basename(temp)); - bufferconsumed = aac_probe(buffer, buffervalid); + bufferconsumed = aac_probe(streambuffer, buffervalid); if(bufferconsumed) { - memmove(buffer, &buffer[bufferconsumed], buffervalid); buffervalid -= bufferconsumed; - buffervalid += vfs_fread(&buffer[buffervalid], 1, + memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid); + buffervalid += vfs_fread(&streambuffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file); bufferconsumed = 0; } bufferconsumed = faacDecInit(decoder, - buffer, + streambuffer, buffervalid, &samplerate, &channels); @@ -730,7 +731,7 @@ mp4_ip.set_info(xmmstitle, -1, -1, samplerate, channels); playback->output->flush(0); - while(buffer_playing && buffervalid > 0 && buffer != NULL) + while(buffer_playing && buffervalid > 0 && streambuffer != NULL) { faacDecFrameInfo finfo; unsigned long samplesdecoded; @@ -738,9 +739,9 @@ if(bufferconsumed > 0) { - memmove(buffer, &buffer[bufferconsumed], buffervalid); buffervalid -= bufferconsumed; - buffervalid += vfs_fread(&buffer[buffervalid], 1, + memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid); + buffervalid += vfs_fread(&streambuffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file); bufferconsumed = 0; @@ -773,22 +774,22 @@ ttemp = NULL; } - sample_buffer = faacDecDecode(decoder, &finfo, buffer, buffervalid); + sample_buffer = faacDecDecode(decoder, &finfo, streambuffer, buffervalid); bufferconsumed += finfo.bytesconsumed; samplesdecoded = finfo.samples; if(finfo.error > 0 && remote != FALSE) { - memmove(buffer, &buffer[1], buffervalid); + memmove(streambuffer, &streambuffer[1], buffervalid); if(buffervalid < BUFFER_SIZE) { buffervalid += - vfs_fread(&buffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file); + vfs_fread(&streambuffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file); } - bufferconsumed = aac_probe(buffer, buffervalid); + bufferconsumed = aac_probe(streambuffer, buffervalid); if(bufferconsumed) { buffervalid -= bufferconsumed; - memmove(buffer, &buffer[bufferconsumed], buffervalid); + memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid); bufferconsumed = 0; } continue;