diff options
author | Max Kellermann <max@duempel.org> | 2015-10-19 13:12:04 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2015-10-19 13:12:36 +0200 |
commit | 62bfb1a2731ba6c7ee27009316109ef03a60d950 (patch) | |
tree | 197342b118e6c1c78ebe595328a3f9464b04ecd3 /src | |
parent | 38e86af75c02cf75e8dc372ef71cc8c3010d0313 (diff) | |
download | mpd-62bfb1a2731ba6c7ee27009316109ef03a60d950.tar.gz mpd-62bfb1a2731ba6c7ee27009316109ef03a60d950.tar.xz mpd-62bfb1a2731ba6c7ee27009316109ef03a60d950.zip |
decoder/mad: reduce memory usage while scanning tags
Allocate the frame pointers only when actually decoding the file.
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder/plugins/MadDecoderPlugin.cxx | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/decoder/plugins/MadDecoderPlugin.cxx b/src/decoder/plugins/MadDecoderPlugin.cxx index ea2c9ac6c..9baa6fb9c 100644 --- a/src/decoder/plugins/MadDecoderPlugin.cxx +++ b/src/decoder/plugins/MadDecoderPlugin.cxx @@ -167,6 +167,15 @@ struct MadDecoder { bool DecodeFirstFrame(Tag **tag); + void AllocateBuffers() { + assert(max_frames > 0); + assert(frame_offsets == nullptr); + assert(times == nullptr); + + frame_offsets = new long[max_frames]; + times = new mad_timer_t[max_frames]; + } + gcc_pure long TimeToFrame(SongTime t) const; @@ -819,9 +828,6 @@ MadDecoder::DecodeFirstFrame(Tag **tag) return false; } - frame_offsets = new long[max_frames]; - times = new mad_timer_t[max_frames]; - return true; } @@ -1049,6 +1055,8 @@ mp3_decode(Decoder &decoder, InputStream &input_stream) return; } + data.AllocateBuffers(); + Error error; AudioFormat audio_format; if (!audio_format_init_checked(audio_format, |