comparison src/madplug/decoder.c @ 2415:4fb714073ae4

fix for bug #150: - avoid use of memcpy in these cases since memory area may overlap. - do not perform memmove if it is not necessary.
author Yoshiki Yazawa <yaz@cc.rim.or.jp>
date Wed, 20 Feb 2008 02:57:59 +0900
parents bd9673d8b7d5
children b419d8924c0b
comparison
equal deleted inserted replaced
2414:7c0cee3d74d9 2415:4fb714073ae4
113 AUDDBG("f: scan_file\n"); 113 AUDDBG("f: scan_file\n");
114 AUDDBG("scan_file frames = %d\n", info->frames); 114 AUDDBG("scan_file frames = %d\n", info->frames);
115 115
116 while (1) { 116 while (1) {
117 remainder = stream.bufend - stream.next_frame; 117 remainder = stream.bufend - stream.next_frame;
118 118
119 /* 119 if(buffer != stream.this_frame && remainder)
120 if (remainder >= BUFFER_SIZE) 120 memmove(buffer, stream.this_frame, remainder);
121 { 121
122 printf("oh dear.. remainder = %d\n", remainder);
123 }
124 */
125
126 memcpy(buffer, stream.this_frame, remainder);
127 len = input_get_data(info, buffer + remainder, 122 len = input_get_data(info, buffer + remainder,
128 BUFFER_SIZE - remainder); 123 BUFFER_SIZE - remainder);
129 124
130 if (len <= 0) { 125 if (len <= 0) {
131 AUDDBG("scan_file: len <= 0 len = %d\n", len); 126 AUDDBG("scan_file: len <= 0 len = %d\n", len);
132 break; 127 break;
133 } 128 }
134 129
135 mad_stream_buffer(&stream, buffer, len + remainder); 130 mad_stream_buffer(&stream, buffer, remainder + len);
136 131
137 while (!fast || (fast && info->frames < N_AVERAGE_FRAMES)) { 132 while (!fast || (fast && info->frames < N_AVERAGE_FRAMES)) {
138 if (mad_header_decode(&header, &stream) == -1) { 133 if (mad_header_decode(&header, &stream) == -1) {
139 if (stream.error == MAD_ERROR_BUFLEN) { 134 if (stream.error == MAD_ERROR_BUFLEN) {
140 break; 135 break;
391 do { 386 do {
392 if (!info->playback->playing) { 387 if (!info->playback->playing) {
393 AUDDBG("decode: stop signaled\n"); 388 AUDDBG("decode: stop signaled\n");
394 break; 389 break;
395 } 390 }
391
396 if (seek_skip) 392 if (seek_skip)
397 remainder = 0; 393 remainder = 0;
398 else { 394 else {
399 remainder = stream.bufend - stream.next_frame; 395 remainder = stream.bufend - stream.next_frame;
400 memcpy(buffer, stream.this_frame, remainder); 396 if(buffer != stream.this_frame && remainder)
401 } 397 memmove(buffer, stream.this_frame, remainder);
398 }
399
402 len = input_get_data(info, buffer + remainder, 400 len = input_get_data(info, buffer + remainder,
403 BUFFER_SIZE - remainder); 401 BUFFER_SIZE - remainder);
404 402
405 input_process_remote_metadata(info); 403 input_process_remote_metadata(info);
406 404