aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRamiro Polla <ramiro.polla@gmail.com>2007-08-13 15:28:29 +0000
committerRamiro Polla <ramiro.polla@gmail.com>2007-08-13 15:28:29 +0000
commit5e4c7ca224417902dd714f4f50500b36b8c89148 (patch)
treec9fdb0713c75ea36467a645f9cafc67549e1b754
parent345bb2ad90f845e004ccef49dec8fa183576eeaa (diff)
downloadffmpeg-5e4c7ca224417902dd714f4f50500b36b8c89148.tar.gz
Add attribute that forces alignment of stack to functions that need it.
Necessary for systems that don't align by default to 16 bytes, required by some SSE instructions. Requires GCC >= 4.2. Based on patch by Gaƫl Chardon. Originally committed as revision 10106 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/dsputil.c3
-rw-r--r--libavcodec/pthread.c2
-rw-r--r--libavcodec/utils.c10
-rw-r--r--libavcodec/w32thread.c2
-rw-r--r--libavutil/internal.h8
5 files changed, 17 insertions, 8 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index 93417823d9..e1a81a3fea 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -3833,7 +3833,8 @@ int ff_check_alignment(void){
av_log(NULL, AV_LOG_ERROR,
"Compiler did not align stack variables. Libavcodec has been miscompiled\n"
"and may be very slow or crash. This is not a bug in libavcodec,\n"
- "but in the compiler. Do not report crashes to FFmpeg developers.\n");
+ "but in the compiler. You may try recompiling using gcc >= 4.2.\n"
+ "Do not report crashes to FFmpeg developers.\n");
#endif
did_fail=1;
}
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
index 244bb520dd..702adb533d 100644
--- a/libavcodec/pthread.c
+++ b/libavcodec/pthread.c
@@ -42,7 +42,7 @@ typedef struct ThreadContext {
int done;
} ThreadContext;
-static void* worker(void *v)
+static void* attribute_align_arg worker(void *v)
{
AVCodecContext *avctx = v;
ThreadContext *c = avctx->thread_opaque;
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index c381f03f20..e494baf965 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -829,7 +829,7 @@ AVFrame *avcodec_alloc_frame(void){
return pic;
}
-int avcodec_open(AVCodecContext *avctx, AVCodec *codec)
+int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
{
int ret= -1;
@@ -880,7 +880,7 @@ end:
return ret;
}
-int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size,
const short *samples)
{
if(buf_size < FF_MIN_BUFFER_SIZE && 0){
@@ -895,7 +895,7 @@ int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size,
return 0;
}
-int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+int attribute_align_arg avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
const AVFrame *pict)
{
if(buf_size < FF_MIN_BUFFER_SIZE){
@@ -923,7 +923,7 @@ int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
return ret;
}
-int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
+int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
int *got_picture_ptr,
uint8_t *buf, int buf_size)
{
@@ -946,7 +946,7 @@ int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
return ret;
}
-int avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
+int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
int *frame_size_ptr,
uint8_t *buf, int buf_size)
{
diff --git a/libavcodec/w32thread.c b/libavcodec/w32thread.c
index 12c9212945..fbc0a581e2 100644
--- a/libavcodec/w32thread.c
+++ b/libavcodec/w32thread.c
@@ -36,7 +36,7 @@ typedef struct ThreadContext{
}ThreadContext;
-static unsigned __stdcall thread_func(void *v){
+static unsigned __stdcall attribute_align_arg thread_func(void *v){
ThreadContext *c= v;
for(;;){
diff --git a/libavutil/internal.h b/libavutil/internal.h
index e8dc72ef85..337f297083 100644
--- a/libavutil/internal.h
+++ b/libavutil/internal.h
@@ -34,6 +34,14 @@
#include <stddef.h>
#include <assert.h>
+#ifndef attribute_align_arg
+#if defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__>1)
+# define attribute_align_arg __attribute__((force_align_arg_pointer))
+#else
+# define attribute_align_arg
+#endif
+#endif
+
#ifndef attribute_used
#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
# define attribute_used __attribute__((used))