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