Mercurial > audlegacy-plugins
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 |
