History

mp3dec_ex: handle padding for mp3dec_ex_read + test decoded length

lieff committed 6 years ago

Commit 97195971 parent 0ae65c42 files · +36 −5Browse files

Unified · Split

2 files
  1. minimp3_ex.h +21 −3
  2. minimp3_test.c +15 −2
minimp3_ex.h+21−3
@@ -50,7 +50,7 @@ typedef struct · 49 unmodified lines
50 mp3dec_t mp3d;50 mp3dec_t mp3d;
51 mp3dec_map_info_t file;51 mp3dec_map_info_t file;
52 mp3dec_index_t index;52 mp3dec_index_t index;
53 uint64_t offset, samples, detected_samples, start_offset, end_offset;53 uint64_t offset, samples, detected_samples, cur_sample, start_offset, end_offset;
54 mp3dec_frame_info_t info;54 mp3dec_frame_info_t info;
55 mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME];55 mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME];
56#ifndef MINIMP3_NO_STDIO56#ifndef MINIMP3_NO_STDIO
@@ -274,8 +274,8 @@ void mp3dec_load_buf(mp3dec_t *dec, const uint8_t *buf, size_t buf_size, mp3dec_ · 217 unmodified lines
274 progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info);274 progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info);
275 }275 }
276 } while (frame_bytes);276 } while (frame_bytes);
277 if (detected_samples)277 if (detected_samples && info->samples > detected_samples)
278 info->samples = detected_samples;278 info->samples = detected_samples; /* cut padding */
279 /* reallocate to normal buffer size */279 /* reallocate to normal buffer size */
280 if (allocated != info->samples*sizeof(mp3d_sample_t))280 if (allocated != info->samples*sizeof(mp3d_sample_t))
281 info->buffer = (mp3d_sample_t*)realloc(info->buffer, info->samples*sizeof(mp3d_sample_t));281 info->buffer = (mp3d_sample_t*)realloc(info->buffer, info->samples*sizeof(mp3d_sample_t));
@@ -419,8 +419,10 @@ int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position) · 137 unmodified lines
419 if (MP3D_SEEK_TO_BYTE == dec->seek_method)419 if (MP3D_SEEK_TO_BYTE == dec->seek_method)
420 {420 {
421 dec->offset = position;421 dec->offset = position;
422 dec->cur_sample = 0;
422 return 0;423 return 0;
423 }424 }
425 dec->cur_sample = position;
424 position += dec->start_delay;426 position += dec->start_delay;
425 if (0 == position)427 if (0 == position)
426 { /* optimize seek to zero, no index needed */428 { /* optimize seek to zero, no index needed */
@@ -499,9 +501,17 @@ size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) · 72 unmodified lines
499 size_t samples_requested = samples;501 size_t samples_requested = samples;
500 mp3dec_frame_info_t frame_info;502 mp3dec_frame_info_t frame_info;
501 memset(&frame_info, 0, sizeof(frame_info));503 memset(&frame_info, 0, sizeof(frame_info));
504 if (dec->detected_samples && dec->cur_sample >= dec->detected_samples)
505 return 0; /* at end of stream */
502 if (dec->buffer_consumed < dec->buffer_samples)506 if (dec->buffer_consumed < dec->buffer_samples)
503 {507 {
504 size_t to_copy = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), samples);508 size_t to_copy = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), samples);
509 if (dec->detected_samples)
510 { /* count decoded samples to properly cut padding */
511 if (dec->cur_sample + to_copy >= dec->detected_samples)
512 to_copy = dec->detected_samples - dec->cur_sample;
513 dec->cur_sample += to_copy;
514 }
505 memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t));515 memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t));
506 buf += to_copy;516 buf += to_copy;
507 dec->buffer_consumed += to_copy;517 dec->buffer_consumed += to_copy;
@@ -509,6 +519,8 @@ size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) · 1 unmodified line
509 }519 }
510 while (samples)520 while (samples)
511 {521 {
522 if (dec->detected_samples && dec->cur_sample >= dec->detected_samples)
523 break;
512 const uint8_t *dec_buf = dec->file.buffer + dec->offset;524 const uint8_t *dec_buf = dec->file.buffer + dec->offset;
513 uint64_t buf_size = end_offset - dec->offset;525 uint64_t buf_size = end_offset - dec->offset;
514 if (!buf_size)526 if (!buf_size)
@@ -525,6 +537,12 @@ size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) · 10 unmodified lines
525 dec->to_skip -= skip;537 dec->to_skip -= skip;
526 }538 }
527 size_t to_copy = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), samples);539 size_t to_copy = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), samples);
540 if (dec->detected_samples)
541 { /* ^ handle padding */
542 if (dec->cur_sample + to_copy >= dec->detected_samples)
543 to_copy = dec->detected_samples - dec->cur_sample;
544 dec->cur_sample += to_copy;
545 }
528 memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t));546 memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t));
529 buf += to_copy;547 buf += to_copy;
530 dec->buffer_consumed += to_copy;548 dec->buffer_consumed += to_copy;
minimp3_test.c+15−2
@@ -121,6 +121,7 @@ static void decode_file(const char *input_file_name, const unsigned char *buf_re · 120 unmodified lines
121 info.samples = dec.samples;121 info.samples = dec.samples;
122 info.buffer = malloc(dec.samples*sizeof(int16_t));122 info.buffer = malloc(dec.samples*sizeof(int16_t));
123 info.hz = dec.info.hz;123 info.hz = dec.info.hz;
124 info.layer = dec.info.layer;
124 info.channels = dec.info.channels;125 info.channels = dec.info.channels;
125 if (position < 0)126 if (position < 0)
126 {127 {
@@ -142,6 +143,12 @@ static void decode_file(const char *input_file_name, const unsigned char *buf_re · 15 unmodified lines
142 printf("error: mp3dec_ex_read() readed less than expected\n");143 printf("error: mp3dec_ex_read() readed less than expected\n");
143 exit(1);144 exit(1);
144 }145 }
146 readed = mp3dec_ex_read(&dec, info.buffer, 1);
147 if (readed)
148 {
149 printf("error: mp3dec_ex_read() readed more than expected\n");
150 exit(1);
151 }
145 mp3dec_ex_close(&dec);152 mp3dec_ex_close(&dec);
146 } else153 } else
147 {154 {
@@ -172,7 +179,13 @@ static void decode_file(const char *input_file_name, const unsigned char *buf_re · 24 unmodified lines
172 total_samples += info.samples;179 total_samples += info.samples;
173 if (buf_ref)180 if (buf_ref)
174 {181 {
175 int max_samples = MINIMP3_MIN((size_t)ref_size/2, info.samples);182 size_t ref_samples = ref_size/2;
183 if (ref_samples != info.samples && (ref_samples + 1152) != info.samples && (ref_samples + 2304) != info.samples && 3 == info.layer)
184 { /* some standard vectors are for some reason a little shorter */
185 printf("error: reference and produced number of samples do not match (%d/%d)\n", (int)ref_samples, (int)info.samples);
186 exit(1);
187 }
188 int max_samples = MINIMP3_MIN(ref_samples, info.samples);
176 for (i = 0; i < max_samples; i++)189 for (i = 0; i < max_samples; i++)
177 {190 {
178 int MSEtemp = abs((int)buffer[i] - (int)(int16_t)read16le(&buf_ref[i*sizeof(int16_t)]));191 int MSEtemp = abs((int)buffer[i] - (int)(int16_t)read16le(&buf_ref[i*sizeof(int16_t)]));
@@ -195,7 +208,7 @@ static void decode_file(const char *input_file_name, const unsigned char *buf_re · 16 unmodified lines
195 printf("rate=%d samples=%d max_diff=%d PSNR=%f\n", info.hz, total_samples, maxdiff, psnr);208 printf("rate=%d samples=%d max_diff=%d PSNR=%f\n", info.hz, total_samples, maxdiff, psnr);
196 if (psnr < 96)209 if (psnr < 96)
197 {210 {
198 printf("PSNR compliance failed\n");211 printf("error: PSNR compliance failed\n");
199 exit(1);212 exit(1);
200 }213 }
201#endif214#endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t