summaryrefslogtreecommitdiff
path: root/apps/codecs/libm4a/demux.c
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2007-12-01 01:01:35 +0000
committerDave Chapman <dave@dchapman.com>2007-12-01 01:01:35 +0000
commitaaacb7010fc247cfc9f16b2e3aee568f29089a22 (patch)
tree5270f80f3dbad56eba3a408bdc8b36ac7394722d /apps/codecs/libm4a/demux.c
parent95c117cdb8b2db2e3b5520e9181443a7915463e7 (diff)
downloadrockbox-aaacb7010fc247cfc9f16b2e3aee568f29089a22.tar.gz
rockbox-aaacb7010fc247cfc9f16b2e3aee568f29089a22.zip
Remove the mallocs for the codecdata in the m4a parser and assume a maximum size of 64 bytes (see comments in source). Also clean up the alac_set_info() function a little and make it alignment-safe. We still need to remove the seektable related mallocs. Please report if any AAC or ALAC files stop playing in Rockbox after this commit - but it is not expected to cause problems.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15861 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libm4a/demux.c')
-rw-r--r--apps/codecs/libm4a/demux.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/apps/codecs/libm4a/demux.c b/apps/codecs/libm4a/demux.c
index 634bb4ffca..912e7327e7 100644
--- a/apps/codecs/libm4a/demux.c
+++ b/apps/codecs/libm4a/demux.c
@@ -150,14 +150,15 @@ static bool read_chunk_esds(qtmovie_t *qtmovie, size_t chunk_len)
150 150
151 /* read length */ 151 /* read length */
152 qtmovie->res->codecdata_len = mp4ff_read_mp4_descr_length(qtmovie->stream); 152 qtmovie->res->codecdata_len = mp4ff_read_mp4_descr_length(qtmovie->stream);
153 qtmovie->res->codecdata = malloc(qtmovie->res->codecdata_len); 153 if (qtmovie->res->codecdata_len > MAX_CODECDATA_SIZE)
154 if (qtmovie->res->codecdata)
155 { 154 {
156 stream_read(qtmovie->stream, qtmovie->res->codecdata_len, qtmovie->res->codecdata); 155 DEBUGF("codecdata too large (%d) in esds\n",
157 } else { 156 (int)qtmovie->res->codecdata_len);
158 qtmovie->res->codecdata_len = 0; 157 return false;
159 } 158 }
160 159
160 stream_read(qtmovie->stream, qtmovie->res->codecdata_len, qtmovie->res->codecdata);
161
161 /* will skip the remainder of the atom */ 162 /* will skip the remainder of the atom */
162 return true; 163 return true;
163} 164}
@@ -225,19 +226,21 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len)
225 226
226 /* 12 = audio format atom, 8 = padding */ 227 /* 12 = audio format atom, 8 = padding */
227 qtmovie->res->codecdata_len = entry_remaining + 12 + 8; 228 qtmovie->res->codecdata_len = entry_remaining + 12 + 8;
228 qtmovie->res->codecdata = malloc(qtmovie->res->codecdata_len); 229 if (qtmovie->res->codecdata_len > MAX_CODECDATA_SIZE)
229
230 if (!qtmovie->res->codecdata)
231 { 230 {
232 DEBUGF("stsd too large\n"); 231 DEBUGF("codecdata too large (%d) in stsd\n",
233 return false; 232 (int)qtmovie->res->codecdata_len);
234 } 233 }
235 234
236 memset(qtmovie->res->codecdata, 0, qtmovie->res->codecdata_len); 235 memset(qtmovie->res->codecdata, 0, qtmovie->res->codecdata_len);
237 /* audio format atom */ 236 /* audio format atom */
237#if 0
238 /* The ALAC decoder skips these bytes, so there is no need to store them,
239 and this code isn't endian/alignment safe */
238 ((unsigned int*)qtmovie->res->codecdata)[0] = 0x0c000000; 240 ((unsigned int*)qtmovie->res->codecdata)[0] = 0x0c000000;
239 ((unsigned int*)qtmovie->res->codecdata)[1] = MAKEFOURCC('a','m','r','f'); 241 ((unsigned int*)qtmovie->res->codecdata)[1] = MAKEFOURCC('a','m','r','f');
240 ((unsigned int*)qtmovie->res->codecdata)[2] = MAKEFOURCC('c','a','l','a'); 242 ((unsigned int*)qtmovie->res->codecdata)[2] = MAKEFOURCC('c','a','l','a');
243#endif
241 244
242 stream_read(qtmovie->stream, 245 stream_read(qtmovie->stream,
243 entry_remaining, 246 entry_remaining,