[MPlayer-dev-eng] [PATCH] use av_malloc/av_free instead of malloc where missing memalign

Gianluigi Tiesi mplayer at netfarm.it
Sun Oct 12 01:30:23 CEST 2008


Hi,

currently mplayer uses malloc instead of memalign when memalign is not
supported.

while often align(64) is used for perfomarnce reasons

align(16) is needed for sse code


The attached patch fixes it in dec_audio.c that avoids
crash while decoding an ogg vorbis

I've seen a similar patch in liba52 that checks for mingw+sse
but I think it's better to check for missing memalign

there are also other places to be fixed, but it's a bit
dangerous, since free() needs to be mapped to av_free __only__
if the buffer is allocated with av_malloc
(audio_dec -> a_buffer is ok to av_malloc/av_free,
a_in_buffer leads to stack corruptions, free-ed somewhere else?)

Regards

-- 
Gianluigi Tiesi <sherpya at netfarm.it>
EDP Project Leader
Netfarm S.r.l. - http://www.netfarm.it/
Free Software: http://oss.netfarm.it/
-------------- next part --------------
diff -NpuBr -Xexclude.txt main/libmpcodecs/dec_audio.c sherpya/libmpcodecs/dec_audio.c
--- main/libmpcodecs/dec_audio.c	2008-08-08 23:41:45.250000000 +0200
+++ sherpya/libmpcodecs/dec_audio.c	2008-10-12 01:15:10.312500000 +0200
@@ -84,7 +84,11 @@ static int init_audio_codec(sh_audio_t *
     mp_msg(MSGT_DECAUDIO, MSGL_V, MSGTR_AllocatingBytesForOutputBuffer,
 	   sh_audio->audio_out_minsize, MAX_OUTBURST, sh_audio->a_buffer_size);
 
+#ifdef HAVE_MEMALIGN
     sh_audio->a_buffer = memalign(16, sh_audio->a_buffer_size);
+#else
+    sh_audio->a_buffer = av_malloc(sh_audio->a_buffer_size);
+#endif
     if (!sh_audio->a_buffer) {
 	mp_msg(MSGT_DECAUDIO, MSGL_ERR, MSGTR_CantAllocAudioBuf);
 	return 0;
@@ -307,7 +311,11 @@ void uninit_audio(sh_audio_t *sh_audio)
     sh_audio->a_out_buffer = NULL;
     sh_audio->a_out_buffer_size = 0;
     if (sh_audio->a_buffer)
+#ifdef HAVE_MEMALIGN
 	free(sh_audio->a_buffer);
+#else
+    av_free(sh_audio->a_buffer);
+#endif
     sh_audio->a_buffer = NULL;
     if (sh_audio->a_in_buffer)
 	free(sh_audio->a_in_buffer);


More information about the MPlayer-dev-eng mailing list