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
107int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags);107int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags);
108void mp3dec_ex_close(mp3dec_ex_t *dec);108void mp3dec_ex_close(mp3dec_ex_t *dec);
109int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position);109int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position);
110size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, size_t max_samples);110size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples);
111size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples);111size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples);
112#ifndef MINIMP3_NO_STDIO112#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
853size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, size_t max_samples)853size_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 } else895 } 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 {
908return_e_decode:906return_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_TRANSITION920#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION
923 !(dec->flags & MP3D_ALLOW_MONO_STEREO_TRANSITION) &&921 !(dec->flags & MP3D_ALLOW_MONO_STEREO_TRANSITION) &&
924#endif922#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;
minimp3_test.c+4−2
@@ -534,9 +534,11 @@ static int self_test(const char *input_file_name) · 533 unmodified lines
534 ASSERT(0 == ret); /* invalid param case, no decoder structure to report an error */534 ASSERT(0 == ret); /* invalid param case, no decoder structure to report an error */
535 ret = mp3dec_ex_read(&dec, 0, 10);535 ret = mp3dec_ex_read(&dec, 0, 10);
536 ASSERT(0 == ret && MP3D_E_PARAM == dec.last_error); /* invalid param case */536 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);
538 ASSERT(0 == ret); /* invalid param case, no decoder structure to report an error */538 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);
540 ASSERT(0 == ret && MP3D_E_PARAM == dec.last_error); /* invalid param case */542 ASSERT(0 == ret && MP3D_E_PARAM == dec.last_error); /* invalid param case */
541 543
542 ret = mp3dec_load(0, input_file_name, &finfo, 0, 0);544 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