Mercurial > mplayer.hg
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 |