From 2cac3fcde42af0f198144dc5f413dc9e6faae4cc Mon Sep 17 00:00:00 2001 From: Jens Gulin Date: Mon, 10 Sep 2012 15:54:40 +0200 Subject: Memory leak solved in MPEG4Extractor::parseChunk for cover art Repeated leaks detected in mediaserver context. Most chunks small but some bigger. Adding up it was not uncommon to see 200Mb footprint. libc memdebug allocation call stack showed the root cause in "covr" parsing - that explains why content often was empty but sometimes big. Change-Id: I0de6c1eeef174d2529973ff9c6a020ec3dd44c75 --- media/libstagefright/MPEG4Extractor.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'media/libstagefright/MPEG4Extractor.cpp') diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index dc8e4a3..6929765 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -1426,18 +1427,15 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { if (mFileMetaData != NULL) { ALOGV("chunk_data_size = %lld and data_offset = %lld", chunk_data_size, data_offset); - uint8_t *buffer = new uint8_t[chunk_data_size + 1]; + sp buffer = new ABuffer(chunk_data_size + 1); if (mDataSource->readAt( - data_offset, buffer, chunk_data_size) != (ssize_t)chunk_data_size) { - delete[] buffer; - buffer = NULL; - + data_offset, buffer->data(), chunk_data_size) != (ssize_t)chunk_data_size) { return ERROR_IO; } const int kSkipBytesOfDataBox = 16; mFileMetaData->setData( kKeyAlbumArt, MetaData::TYPE_NONE, - buffer + kSkipBytesOfDataBox, chunk_data_size - kSkipBytesOfDataBox); + buffer->data() + kSkipBytesOfDataBox, chunk_data_size - kSkipBytesOfDataBox); } *offset += chunk_size; -- cgit v1.1