diff options
author | Aurelien Jacobs <aurel@gnuage.org> | 2005-01-31 15:57:27 +0000 |
---|---|---|
committer | Aurelien Jacobs <aurel@gnuage.org> | 2005-01-31 15:57:27 +0000 |
commit | 38d5c282cdfa60a18d73412f87beca1ae0d86284 (patch) | |
tree | 6f20f64850d0b62abf90b746974200293c3a33f3 | |
parent | a3a5f4d6c3bf996c727061df2d394aa7bc10f30e (diff) | |
download | ffmpeg-38d5c282cdfa60a18d73412f87beca1ae0d86284.tar.gz |
makes funnyCode pages executable (for CPU with NX bit)
Originally committed as revision 14626 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
-rw-r--r-- | postproc/swscale.c | 22 | ||||
-rw-r--r-- | postproc/swscale_internal.h | 4 |
2 files changed, 24 insertions, 2 deletions
diff --git a/postproc/swscale.c b/postproc/swscale.c index 5da32037e9..3a6766bea3 100644 --- a/postproc/swscale.c +++ b/postproc/swscale.c @@ -61,6 +61,9 @@ untested special converters #else #include <stdlib.h> #endif +#ifdef HAVE_SYS_MMAN_H +#include <sys/mman.h> +#endif #include "swscale.h" #include "swscale_internal.h" #include "../cpudetect.h" @@ -1999,6 +2002,15 @@ SwsContext *sws_getContext(int srcW, int srcH, int origSrcFormat, int dstW, int // can't downscale !!! if(c->canMMX2BeUsed && (flags & SWS_FAST_BILINEAR)) { +#define MAX_FUNNY_CODE_SIZE 10000 +#ifdef HAVE_SYS_MMAN_H + c->funnyYCode = (uint8_t*)mmap(NULL, MAX_FUNNY_CODE_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + c->funnyUVCode = (uint8_t*)mmap(NULL, MAX_FUNNY_CODE_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); +#else + c->funnyYCode = (uint8_t*)memalign(32, MAX_FUNNY_CODE_SIZE); + c->funnyUVCode = (uint8_t*)memalign(32, MAX_FUNNY_CODE_SIZE); +#endif + c->lumMmx2Filter = (int16_t*)memalign(8, (dstW /8+8)*sizeof(int16_t)); c->chrMmx2Filter = (int16_t*)memalign(8, (c->chrDstW /4+8)*sizeof(int16_t)); c->lumMmx2FilterPos= (int32_t*)memalign(8, (dstW /2/8+8)*sizeof(int32_t)); @@ -2556,6 +2568,16 @@ void sws_freeContext(SwsContext *c){ if(c->hChrFilterPos) free(c->hChrFilterPos); c->hChrFilterPos = NULL; +#ifdef HAVE_SYS_MMAN_H + if(c->funnyYCode) munmap(c->funnyYCode, MAX_FUNNY_CODE_SIZE); + if(c->funnyUVCode) munmap(c->funnyUVCode, MAX_FUNNY_CODE_SIZE); +#else + if(c->funnyYCode) free(c->funnyYCode); + if(c->funnyUVCode) free(c->funnyUVCode); +#endif + c->funnyYCode=NULL; + c->funnyUVCode=NULL; + if(c->lumMmx2Filter) free(c->lumMmx2Filter); c->lumMmx2Filter=NULL; if(c->chrMmx2Filter) free(c->chrMmx2Filter); diff --git a/postproc/swscale_internal.h b/postproc/swscale_internal.h index a224446568..d1fae26669 100644 --- a/postproc/swscale_internal.h +++ b/postproc/swscale_internal.h @@ -82,8 +82,8 @@ typedef struct SwsContext{ int vLumBufSize; int vChrBufSize; - uint8_t __attribute__((aligned(32))) funnyYCode[10000]; - uint8_t __attribute__((aligned(32))) funnyUVCode[10000]; + uint8_t *funnyYCode; + uint8_t *funnyUVCode; int32_t *lumMmx2FilterPos; int32_t *chrMmx2FilterPos; int16_t *lumMmx2Filter; |