ff_check_alignment to warn the user about a missaligned stack
Originally committed as revision 7249 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
f95778f80d
commit
6dc7d5da70
@ -3801,11 +3801,31 @@ void dsputil_static_init(void)
|
|||||||
for(i=0; i<64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1;
|
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)
|
void dsputil_init(DSPContext* c, AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
ff_check_alignment();
|
||||||
|
|
||||||
#ifdef CONFIG_ENCODERS
|
#ifdef CONFIG_ENCODERS
|
||||||
if(avctx->dct_algo==FF_DCT_FASTINT) {
|
if(avctx->dct_algo==FF_DCT_FASTINT) {
|
||||||
c->fdct = fdct_ifast;
|
c->fdct = fdct_ifast;
|
||||||
|
@ -410,6 +410,8 @@ typedef struct DSPContext {
|
|||||||
void dsputil_static_init(void);
|
void dsputil_static_init(void);
|
||||||
void dsputil_init(DSPContext* p, AVCodecContext *avctx);
|
void dsputil_init(DSPContext* p, AVCodecContext *avctx);
|
||||||
|
|
||||||
|
int ff_check_alignment(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* permute block according to permuatation.
|
* permute block according to permuatation.
|
||||||
* @param last last non zero element in scantable order
|
* @param last last non zero element in scantable order
|
||||||
|
@ -4838,6 +4838,8 @@ static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
|
|||||||
static int estimate_motion_thread(AVCodecContext *c, void *arg){
|
static int estimate_motion_thread(AVCodecContext *c, void *arg){
|
||||||
MpegEncContext *s= arg;
|
MpegEncContext *s= arg;
|
||||||
|
|
||||||
|
ff_check_alignment();
|
||||||
|
|
||||||
s->me.dia_size= s->avctx->dia_size;
|
s->me.dia_size= s->avctx->dia_size;
|
||||||
s->first_slice_line=1;
|
s->first_slice_line=1;
|
||||||
for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
|
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;
|
MpegEncContext *s= arg;
|
||||||
int mb_x, mb_y;
|
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_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
|
||||||
for(mb_x=0; mb_x < s->mb_width; mb_x++) {
|
for(mb_x=0; mb_x < s->mb_width; mb_x++) {
|
||||||
int xx = mb_x * 16;
|
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];
|
PutBitContext pb[2], pb2[2], tex_pb[2];
|
||||||
//printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
|
//printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
|
||||||
|
|
||||||
|
ff_check_alignment();
|
||||||
|
|
||||||
for(i=0; i<2; i++){
|
for(i=0; i<2; i++){
|
||||||
init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
|
init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
|
||||||
init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
|
init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
|
||||||
|
Loading…
Reference in New Issue
Block a user