From: Michael Niedermayer Date: Thu, 7 Dec 2006 18:33:00 +0000 (+0000) Subject: ff_check_alignment to warn the user about a missaligned stack X-Git-Tag: v0.5~10828 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6dc7d5da70292edcd7c9b17706caa938f79b853b;p=platform%2Fupstream%2Flibav.git ff_check_alignment to warn the user about a missaligned stack Originally committed as revision 7249 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index 51eddbc..0f5416f 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -3801,11 +3801,31 @@ void dsputil_static_init(void) for(i=0; i<64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1; } +int ff_check_alignment(void){ + static int did_fail=0; + DECLARE_ALIGNED_16(int, aligned); + + if((int)&aligned & 15){ + if(!did_fail){ +#if defined(HAVE_MMX) || defined(HAVE_ALTIVEC) + av_log(NULL, AV_LOG_ERROR, + "Compiler did not align stack variables, your code has been misscompiled\n" + "and may crash, this is not a bug in the application but in the compiler\n" + "so reporting it anywhere but to the compiler maintainers is senseless!\n"); +#endif + did_fail=1; + } + return -1; + } + return 0; +} void dsputil_init(DSPContext* c, AVCodecContext *avctx) { int i; + ff_check_alignment(); + #ifdef CONFIG_ENCODERS if(avctx->dct_algo==FF_DCT_FASTINT) { c->fdct = fdct_ifast; diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index c728c1b..7a401cd 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -410,6 +410,8 @@ typedef struct DSPContext { void dsputil_static_init(void); void dsputil_init(DSPContext* p, AVCodecContext *avctx); +int ff_check_alignment(void); + /** * permute block according to permuatation. * @param last last non zero element in scantable order diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index af34bff..4f286fb 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -4838,6 +4838,8 @@ static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){ static int estimate_motion_thread(AVCodecContext *c, void *arg){ MpegEncContext *s= arg; + ff_check_alignment(); + s->me.dia_size= s->avctx->dia_size; s->first_slice_line=1; for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) { @@ -4864,6 +4866,8 @@ static int mb_var_thread(AVCodecContext *c, void *arg){ MpegEncContext *s= arg; int mb_x, mb_y; + ff_check_alignment(); + for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) { for(mb_x=0; mb_x < s->mb_width; mb_x++) { int xx = mb_x * 16; @@ -4911,6 +4915,8 @@ static int encode_thread(AVCodecContext *c, void *arg){ PutBitContext pb[2], pb2[2], tex_pb[2]; //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y); + ff_check_alignment(); + for(i=0; i<2; i++){ init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES); init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);