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
5050 mp3dec_t mp3d;
5151 mp3dec_map_info_t file;
5252 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;
5454 mp3dec_frame_info_t info;
5555 mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME];
5656 #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
274274 progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info);
275275 }
276276 } while (frame_bytes);
277− if (detected_samples)
278− info->samples = detected_samples;
277+ if (detected_samples && info->samples > detected_samples)
278+ info->samples = detected_samples; /* cut padding */
279279 /* reallocate to normal buffer size */
280280 if (allocated != info->samples*sizeof(mp3d_sample_t))
281281 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
419419 if (MP3D_SEEK_TO_BYTE == dec->seek_method)
420420 {
421421 dec->offset = position;
422+ dec->cur_sample = 0;
422423 return 0;
423424 }
425+ dec->cur_sample = position;
424426 position += dec->start_delay;
425427 if (0 == position)
426428 { /* 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
499501 size_t samples_requested = samples;
500502 mp3dec_frame_info_t frame_info;
501503 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 */
502506 if (dec->buffer_consumed < dec->buffer_samples)
503507 {
504508 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+ }
505515 memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t));
506516 buf += to_copy;
507517 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
509519 }
510520 while (samples)
511521 {
522+ if (dec->detected_samples && dec->cur_sample >= dec->detected_samples)
523+ break;
512524 const uint8_t *dec_buf = dec->file.buffer + dec->offset;
513525 uint64_t buf_size = end_offset - dec->offset;
514526 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
525537 dec->to_skip -= skip;
526538 }
527539 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+ }
528546 memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t));
529547 buf += to_copy;
530548 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
121121 info.samples = dec.samples;
122122 info.buffer = malloc(dec.samples*sizeof(int16_t));
123123 info.hz = dec.info.hz;
124+ info.layer = dec.info.layer;
124125 info.channels = dec.info.channels;
125126 if (position < 0)
126127 {
@@ -142,6 +143,12 @@ static void decode_file(const char *input_file_name, const unsigned char *buf_re · 15 unmodified lines
142143 printf("error: mp3dec_ex_read() readed less than expected\n");
143144 exit(1);
144145 }
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+ }
145152 mp3dec_ex_close(&dec);
146153 } else
147154 {
@@ -172,7 +179,13 @@ static void decode_file(const char *input_file_name, const unsigned char *buf_re · 24 unmodified lines
172179 total_samples += info.samples;
173180 if (buf_ref)
174181 {
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);
176189 for (i = 0; i < max_samples; i++)
177190 {
178191 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
195208 printf("rate=%d samples=%d max_diff=%d PSNR=%f\n", info.hz, total_samples, maxdiff, psnr);
196209 if (psnr < 96)
197210 {
198− printf("PSNR compliance failed\n");
211+ printf("error: PSNR compliance failed\n");
199212 exit(1);
200213 }
201214 #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