makes funnyCode pages executable (for CPU with NX bit)

Originally committed as revision 14626 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
This commit is contained in:
Aurelien Jacobs 2005-01-31 15:57:27 +00:00
parent a3a5f4d6c3
commit 38d5c282cd
2 changed files with 24 additions and 2 deletions

View File

@ -61,6 +61,9 @@ untested special converters
#else #else
#include <stdlib.h> #include <stdlib.h>
#endif #endif
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif
#include "swscale.h" #include "swscale.h"
#include "swscale_internal.h" #include "swscale_internal.h"
#include "../cpudetect.h" #include "../cpudetect.h"
@ -1999,6 +2002,15 @@ SwsContext *sws_getContext(int srcW, int srcH, int origSrcFormat, int dstW, int
// can't downscale !!! // can't downscale !!!
if(c->canMMX2BeUsed && (flags & SWS_FAST_BILINEAR)) 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->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->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)); 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); if(c->hChrFilterPos) free(c->hChrFilterPos);
c->hChrFilterPos = NULL; 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); if(c->lumMmx2Filter) free(c->lumMmx2Filter);
c->lumMmx2Filter=NULL; c->lumMmx2Filter=NULL;
if(c->chrMmx2Filter) free(c->chrMmx2Filter); if(c->chrMmx2Filter) free(c->chrMmx2Filter);

View File

@ -82,8 +82,8 @@ typedef struct SwsContext{
int vLumBufSize; int vLumBufSize;
int vChrBufSize; int vChrBufSize;
uint8_t __attribute__((aligned(32))) funnyYCode[10000]; uint8_t *funnyYCode;
uint8_t __attribute__((aligned(32))) funnyUVCode[10000]; uint8_t *funnyUVCode;
int32_t *lumMmx2FilterPos; int32_t *lumMmx2FilterPos;
int32_t *chrMmx2FilterPos; int32_t *chrMmx2FilterPos;
int16_t *lumMmx2Filter; int16_t *lumMmx2Filter;