History

minimp3_ex: pass frame_info from mp3dec_ex_read_frame Closes https://github.com/lieff/minimp3/pull/75

lieff committed 6 years ago

Commit d86f4cb1 parent 7bdfc8b2 files · +18 −16Browse files

Unified · Split

2 files
  1. minimp3_ex.h +14 −14
  2. minimp3_test.c +4 −2
minimp3_ex.h+14−14
@@ -107,7 +107,7 @@ int mp3dec_ex_open_buf(mp3dec_ex_t *dec, const uint8_t *buf, size_t buf_size, in · 106 unmodified lines
107107 int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags);
108108 void mp3dec_ex_close(mp3dec_ex_t *dec);
109109 int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position);
110−size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, size_t max_samples);
110+size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples);
111111 size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples);
112112 #ifndef MINIMP3_NO_STDIO
113113 /* stdio versions of file detect, load, iterate and stream */
@@ -850,9 +850,9 @@ do_exit: · 736 unmodified lines
850850 return 0;
851851 }
852852
853−size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, size_t max_samples)
853+size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples)
854854 {
855− if (!dec || !buf)
855+ if (!dec || !buf || !frame_info)
856856 {
857857 if (dec)
858858 dec->last_error = MP3D_E_PARAM;
@@ -865,8 +865,6 @@ size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, size_t max_sa · 6 unmodified lines
865865 *buf = NULL;
866866 uint64_t end_offset = dec->end_offset ? dec->end_offset : dec->file.size;
867867 int eof = 0;
868− mp3dec_frame_info_t frame_info;
869− memset(&frame_info, 0, sizeof(frame_info));
870868 while (dec->buffer_consumed == dec->buffer_samples)
871869 {
872870 const uint8_t *dec_buf;
@@ -892,18 +890,18 @@ size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, size_t max_sa · 19 unmodified lines
892890 dec_buf = dec->file.buffer + dec->input_consumed;
893891 if (!(dec->input_filled - dec->input_consumed))
894892 return 0;
895− dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, dec->input_filled - dec->input_consumed, dec->buffer, &frame_info);
896− dec->input_consumed += frame_info.frame_bytes;
893+ dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, dec->input_filled - dec->input_consumed, dec->buffer, frame_info);
894+ dec->input_consumed += frame_info->frame_bytes;
897895 } else
898896 {
899897 dec_buf = dec->file.buffer + dec->offset;
900898 uint64_t buf_size = end_offset - dec->offset;
901899 if (!buf_size)
902900 return 0;
903− dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, MINIMP3_MIN(buf_size, (uint64_t)INT_MAX), dec->buffer, &frame_info);
901+ dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, MINIMP3_MIN(buf_size, (uint64_t)INT_MAX), dec->buffer, frame_info);
904902 }
905903 dec->buffer_consumed = 0;
906− if (dec->info.hz != frame_info.hz || dec->info.layer != frame_info.layer)
904+ if (dec->info.hz != frame_info->hz || dec->info.layer != frame_info->layer)
907905 {
908906 return_e_decode:
909907 dec->last_error = MP3D_E_DECODE;
@@ -911,7 +909,7 @@ return_e_decode: · 1 unmodified line
911909 }
912910 if (dec->buffer_samples)
913911 {
914− dec->buffer_samples *= frame_info.channels;
912+ dec->buffer_samples *= frame_info->channels;
915913 if (dec->to_skip)
916914 {
917915 size_t skip = MINIMP3_MIN(dec->buffer_samples, dec->to_skip);
@@ -922,17 +920,17 @@ return_e_decode: · 4 unmodified lines
922920 #ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION
923921 !(dec->flags & MP3D_ALLOW_MONO_STEREO_TRANSITION) &&
924922 #endif
925− dec->buffer_consumed != dec->buffer_samples && dec->info.channels != frame_info.channels)
923+ dec->buffer_consumed != dec->buffer_samples && dec->info.channels != frame_info->channels)
926924 {
927925 goto return_e_decode;
928926 }
929927 } else if (dec->to_skip)
930928 { /* In mp3 decoding not always can start decode from any frame because of bit reservoir,
931929 count skip samples for such frames */
932− int frame_samples = hdr_frame_samples(dec_buf)*frame_info.channels;
930+ int frame_samples = hdr_frame_samples(dec_buf)*frame_info->channels;
933931 dec->to_skip -= MINIMP3_MIN(frame_samples, dec->to_skip);
934932 }
935− dec->offset += frame_info.frame_bytes;
933+ dec->offset += frame_info->frame_bytes;
936934 }
937935 size_t out_samples = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), max_samples);
938936 if (dec->detected_samples)
@@ -954,11 +952,13 @@ size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) · 15 unmodified lines
954952 dec->last_error = MP3D_E_PARAM;
955953 return 0;
956954 }
955+ mp3dec_frame_info_t frame_info;
956+ memset(&frame_info, 0, sizeof(frame_info));
957957 size_t samples_requested = samples;
958958 while (samples)
959959 {
960960 mp3d_sample_t *buf_frame = NULL;
961− size_t read_samples = mp3dec_ex_read_frame(dec, &buf_frame, samples);
961+ size_t read_samples = mp3dec_ex_read_frame(dec, &buf_frame, &frame_info, samples);
962962 if (!read_samples)
963963 {
964964 break;
minimp3_test.c+4−2
@@ -534,9 +534,11 @@ static int self_test(const char *input_file_name) · 533 unmodified lines
534534 ASSERT(0 == ret); /* invalid param case, no decoder structure to report an error */
535535 ret = mp3dec_ex_read(&dec, 0, 10);
536536 ASSERT(0 == ret && MP3D_E_PARAM == dec.last_error); /* invalid param case */
537− ret = mp3dec_ex_read_frame(0, (mp3d_sample_t**)buf, 10);
537+ ret = mp3dec_ex_read_frame(0, (mp3d_sample_t**)buf, &frame_info, 10);
538538 ASSERT(0 == ret); /* invalid param case, no decoder structure to report an error */
539− ret = mp3dec_ex_read_frame(&dec, 0, 10);
539+ ret = mp3dec_ex_read_frame(&dec, 0, &frame_info, 10);
540+ ASSERT(0 == ret && MP3D_E_PARAM == dec.last_error); /* invalid param case */
541+ ret = mp3dec_ex_read_frame(&dec, (mp3d_sample_t**)buf, 0, 10);
540542 ASSERT(0 == ret && MP3D_E_PARAM == dec.last_error); /* invalid param case */
541543
542544 ret = mp3dec_load(0, input_file_name, &finfo, 0, 0);

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