makes funnyCode pages executable (for CPU with NX bit)
authorAurelien Jacobs <aurel@gnuage.org>
Mon, 31 Jan 2005 15:57:27 +0000 (15:57 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Mon, 31 Jan 2005 15:57:27 +0000 (15:57 +0000)
Originally committed as revision 14626 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc

postproc/swscale.c
postproc/swscale_internal.h

index 5da3203..3a6766b 100644 (file)
@@ -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);
index a224446..d1fae26 100644 (file)
@@ -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;