| @@ -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 |
| 107 | 107 | int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags); |
| 108 | 108 | void mp3dec_ex_close(mp3dec_ex_t *dec); |
| 109 | 109 | 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); |
| 111 | 111 | size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples); |
| 112 | 112 | #ifndef MINIMP3_NO_STDIO |
| 113 | 113 | /* stdio versions of file detect, load, iterate and stream */ |
| @@ -850,9 +850,9 @@ do_exit: · 736 unmodified lines |
| 850 | 850 | return 0; |
| 851 | 851 | } |
| 852 | 852 | |
| 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) |
| 854 | 854 | { |
| 855 | | − if (!dec || !buf) |
| 855 | + if (!dec || !buf || !frame_info) |
| 856 | 856 | { |
| 857 | 857 | if (dec) |
| 858 | 858 | 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 |
| 865 | 865 | *buf = NULL; |
| 866 | 866 | uint64_t end_offset = dec->end_offset ? dec->end_offset : dec->file.size; |
| 867 | 867 | int eof = 0; |
| 868 | | − mp3dec_frame_info_t frame_info; |
| 869 | | − memset(&frame_info, 0, sizeof(frame_info)); |
| 870 | 868 | while (dec->buffer_consumed == dec->buffer_samples) |
| 871 | 869 | { |
| 872 | 870 | 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 |
| 892 | 890 | dec_buf = dec->file.buffer + dec->input_consumed; |
| 893 | 891 | if (!(dec->input_filled - dec->input_consumed)) |
| 894 | 892 | 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; |
| 897 | 895 | } else |
| 898 | 896 | { |
| 899 | 897 | dec_buf = dec->file.buffer + dec->offset; |
| 900 | 898 | uint64_t buf_size = end_offset - dec->offset; |
| 901 | 899 | if (!buf_size) |
| 902 | 900 | 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); |
| 904 | 902 | } |
| 905 | 903 | 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) |
| 907 | 905 | { |
| 908 | 906 | return_e_decode: |
| 909 | 907 | dec->last_error = MP3D_E_DECODE; |
| @@ -911,7 +909,7 @@ return_e_decode: · 1 unmodified line |
| 911 | 909 | } |
| 912 | 910 | if (dec->buffer_samples) |
| 913 | 911 | { |
| 914 | | − dec->buffer_samples *= frame_info.channels; |
| 912 | + dec->buffer_samples *= frame_info->channels; |
| 915 | 913 | if (dec->to_skip) |
| 916 | 914 | { |
| 917 | 915 | size_t skip = MINIMP3_MIN(dec->buffer_samples, dec->to_skip); |
| @@ -922,17 +920,17 @@ return_e_decode: · 4 unmodified lines |
| 922 | 920 | #ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION |
| 923 | 921 | !(dec->flags & MP3D_ALLOW_MONO_STEREO_TRANSITION) && |
| 924 | 922 | #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) |
| 926 | 924 | { |
| 927 | 925 | goto return_e_decode; |
| 928 | 926 | } |
| 929 | 927 | } else if (dec->to_skip) |
| 930 | 928 | { /* In mp3 decoding not always can start decode from any frame because of bit reservoir, |
| 931 | 929 | 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; |
| 933 | 931 | dec->to_skip -= MINIMP3_MIN(frame_samples, dec->to_skip); |
| 934 | 932 | } |
| 935 | | − dec->offset += frame_info.frame_bytes; |
| 933 | + dec->offset += frame_info->frame_bytes; |
| 936 | 934 | } |
| 937 | 935 | size_t out_samples = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), max_samples); |
| 938 | 936 | 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 |
| 954 | 952 | dec->last_error = MP3D_E_PARAM; |
| 955 | 953 | return 0; |
| 956 | 954 | } |
| 955 | + mp3dec_frame_info_t frame_info; |
| 956 | + memset(&frame_info, 0, sizeof(frame_info)); |
| 957 | 957 | size_t samples_requested = samples; |
| 958 | 958 | while (samples) |
| 959 | 959 | { |
| 960 | 960 | 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); |
| 962 | 962 | if (!read_samples) |
| 963 | 963 | { |
| 964 | 964 | break; |