comparison dec_audio.c @ 4208:c92c23a42e91

libmad memcpy optimization by Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
author arpi
date Thu, 17 Jan 2002 01:11:21 +0000
parents 6ad5da34c463
children ed500b952d2d
comparison
equal deleted inserted replaced
4207:1427d0f1f2d6 4208:c92c23a42e91
99 99
100 100
101 101
102 #ifdef USE_LIBMAD 102 #ifdef USE_LIBMAD
103 #include <mad.h> 103 #include <mad.h>
104
105 #define MAD_SINGLE_BUFFER_SIZE 8192
106 #define MAD_TOTAL_BUFFER_SIZE ((MAD_SINGLE_BUFFER_SIZE)*3)
107
104 static struct mad_stream mad_stream; 108 static struct mad_stream mad_stream;
105 static struct mad_frame mad_frame; 109 static struct mad_frame mad_frame;
106 static struct mad_synth mad_synth; 110 static struct mad_synth mad_synth;
111 static char* mad_in_buffer = 0; /* base pointer of buffer */
107 112
108 // ensure buffer is filled with some data 113 // ensure buffer is filled with some data
109 static void mad_prepare_buffer(sh_audio_t* sh_audio, struct mad_stream* ms, int length) 114 static void mad_prepare_buffer(sh_audio_t* sh_audio, struct mad_stream* ms, int length)
110 { 115 {
111 if(sh_audio->a_in_buffer_len < length) { 116 if(sh_audio->a_in_buffer_len < length) {
115 } 120 }
116 } 121 }
117 122
118 static void mad_postprocess_buffer(sh_audio_t* sh_audio, struct mad_stream* ms) 123 static void mad_postprocess_buffer(sh_audio_t* sh_audio, struct mad_stream* ms)
119 { 124 {
125 /* rotate buffer while possible, in order to reduce the overhead of endless memcpy */
120 int delta = (unsigned char*)ms->next_frame - (unsigned char *)sh_audio->a_in_buffer; 126 int delta = (unsigned char*)ms->next_frame - (unsigned char *)sh_audio->a_in_buffer;
121 if(delta != 0) { 127 if((unsigned long)(sh_audio->a_in_buffer) - (unsigned long)mad_in_buffer <
128 (MAD_TOTAL_BUFFER_SIZE - MAD_SINGLE_BUFFER_SIZE - delta)) {
129 sh_audio->a_in_buffer += delta;
130 sh_audio->a_in_buffer_len -= delta;
131 } else {
132 sh_audio->a_in_buffer = mad_in_buffer;
122 sh_audio->a_in_buffer_len -= delta; 133 sh_audio->a_in_buffer_len -= delta;
123 memcpy(sh_audio->a_in_buffer, ms->next_frame, sh_audio->a_in_buffer_len); 134 memcpy(sh_audio->a_in_buffer, ms->next_frame, sh_audio->a_in_buffer_len);
124 } 135 }
125 } 136 }
126
127 137
128 static inline 138 static inline
129 signed short mad_scale(mad_fixed_t sample) 139 signed short mad_scale(mad_fixed_t sample)
130 { 140 {
131 /* round */ 141 /* round */
447 457
448 #ifdef USE_LIBMAD 458 #ifdef USE_LIBMAD
449 case AFM_MAD: 459 case AFM_MAD:
450 printf(__FILE__ ":%d:mad: setting minimum outputsize\n", __LINE__); 460 printf(__FILE__ ":%d:mad: setting minimum outputsize\n", __LINE__);
451 sh_audio->audio_out_minsize=4608; 461 sh_audio->audio_out_minsize=4608;
452 if(sh_audio->audio_in_minsize<8192) sh_audio->audio_in_minsize=8192; 462 if(sh_audio->audio_in_minsize<MAD_SINGLE_BUFFER_SIZE) sh_audio->audio_in_minsize=MAD_SINGLE_BUFFER_SIZE;
453 sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize; 463 sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize;
454 sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size); 464 mad_in_buffer = sh_audio->a_in_buffer = malloc(MAD_TOTAL_BUFFER_SIZE);
455 sh_audio->a_in_buffer_len=0; 465 sh_audio->a_in_buffer_len=0;
456 break; 466 break;
457 #endif 467 #endif
458 } 468 }
459 469