|
|
@@ -2279,6 +2279,38 @@ static inline void RENAME(rgb15ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1 |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline void RENAME(palToY)(uint8_t *dst, uint8_t *src, int width, uint32_t *pal) |
|
|
|
|
|
{ |
|
|
|
|
|
int i; |
|
|
|
|
|
for(i=0; i<width; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
int d= src[i]; |
|
|
|
|
|
int b= pal[d] &0xFF; |
|
|
|
|
|
int g=(pal[d]>>8 )&0xFF; |
|
|
|
|
|
int r= pal[d]>>16; |
|
|
|
|
|
|
|
|
|
|
|
dst[i]= ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline void RENAME(palToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width, uint32_t *pal) |
|
|
|
|
|
{ |
|
|
|
|
|
int i; |
|
|
|
|
|
assert(src1 == src2); |
|
|
|
|
|
for(i=0; i<width; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
int d0= src1[2*i ]; |
|
|
|
|
|
int d1= src1[2*i+1]; |
|
|
|
|
|
int p = (pal[d0]&0xFF00FF) + (pal[d1]&0xFF00FF); |
|
|
|
|
|
int g = (pal[d0]+pal[d1]-p)>>8; |
|
|
|
|
|
int b= p&0x1FF; |
|
|
|
|
|
int r= p>>16; |
|
|
|
|
|
|
|
|
|
|
|
dstU[i]= ((RU*r + GU*g + BU*b)>>(RGB2YUV_SHIFT+1)) + 128; |
|
|
|
|
|
dstV[i]= ((RV*r + GV*g + BV*b)>>(RGB2YUV_SHIFT+1)) + 128; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// Bilinear / Bicubic scaling |
|
|
// Bilinear / Bicubic scaling |
|
|
static inline void RENAME(hScale)(int16_t *dst, int dstW, uint8_t *src, int srcW, int xInc, |
|
|
static inline void RENAME(hScale)(int16_t *dst, int dstW, uint8_t *src, int srcW, int xInc, |
|
|
int16_t *filter, int16_t *filterPos, long filterSize) |
|
|
int16_t *filter, int16_t *filterPos, long filterSize) |
|
|
@@ -2467,7 +2499,7 @@ static inline void RENAME(hyscale)(uint16_t *dst, long dstWidth, uint8_t *src, i |
|
|
int flags, int canMMX2BeUsed, int16_t *hLumFilter, |
|
|
int flags, int canMMX2BeUsed, int16_t *hLumFilter, |
|
|
int16_t *hLumFilterPos, int hLumFilterSize, void *funnyYCode, |
|
|
int16_t *hLumFilterPos, int hLumFilterSize, void *funnyYCode, |
|
|
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter, |
|
|
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter, |
|
|
int32_t *mmx2FilterPos) |
|
|
|
|
|
|
|
|
int32_t *mmx2FilterPos, uint8_t *pal) |
|
|
{ |
|
|
{ |
|
|
if(srcFormat==PIX_FMT_YUYV422 || srcFormat==PIX_FMT_GRAY16BE) |
|
|
if(srcFormat==PIX_FMT_YUYV422 || srcFormat==PIX_FMT_GRAY16BE) |
|
|
{ |
|
|
{ |
|
|
@@ -2519,6 +2551,11 @@ static inline void RENAME(hyscale)(uint16_t *dst, long dstWidth, uint8_t *src, i |
|
|
RENAME(rgb15ToY)(formatConvBuffer, src, srcW); |
|
|
RENAME(rgb15ToY)(formatConvBuffer, src, srcW); |
|
|
src= formatConvBuffer; |
|
|
src= formatConvBuffer; |
|
|
} |
|
|
} |
|
|
|
|
|
else if(srcFormat==PIX_FMT_RGB8 || srcFormat==PIX_FMT_BGR8 || srcFormat==PIX_FMT_PAL8) |
|
|
|
|
|
{ |
|
|
|
|
|
RENAME(palToY)(formatConvBuffer, src, srcW, pal); |
|
|
|
|
|
src= formatConvBuffer; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#ifdef HAVE_MMX |
|
|
#ifdef HAVE_MMX |
|
|
// use the new MMX scaler if the mmx2 can't be used (its faster than the x86asm one) |
|
|
// use the new MMX scaler if the mmx2 can't be used (its faster than the x86asm one) |
|
|
@@ -2664,7 +2701,7 @@ inline static void RENAME(hcscale)(uint16_t *dst, long dstWidth, uint8_t *src1, |
|
|
int srcW, int xInc, int flags, int canMMX2BeUsed, int16_t *hChrFilter, |
|
|
int srcW, int xInc, int flags, int canMMX2BeUsed, int16_t *hChrFilter, |
|
|
int16_t *hChrFilterPos, int hChrFilterSize, void *funnyUVCode, |
|
|
int16_t *hChrFilterPos, int hChrFilterSize, void *funnyUVCode, |
|
|
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter, |
|
|
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter, |
|
|
int32_t *mmx2FilterPos) |
|
|
|
|
|
|
|
|
int32_t *mmx2FilterPos, uint8_t *pal) |
|
|
{ |
|
|
{ |
|
|
if(srcFormat==PIX_FMT_YUYV422) |
|
|
if(srcFormat==PIX_FMT_YUYV422) |
|
|
{ |
|
|
{ |
|
|
@@ -2730,6 +2767,12 @@ inline static void RENAME(hcscale)(uint16_t *dst, long dstWidth, uint8_t *src1, |
|
|
{ |
|
|
{ |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
else if(srcFormat==PIX_FMT_RGB8 || srcFormat==PIX_FMT_BGR8 || srcFormat==PIX_FMT_PAL8) |
|
|
|
|
|
{ |
|
|
|
|
|
RENAME(palToUV)(formatConvBuffer, formatConvBuffer+2048, src1, src2, srcW, pal); |
|
|
|
|
|
src1= formatConvBuffer; |
|
|
|
|
|
src2= formatConvBuffer+2048; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#ifdef HAVE_MMX |
|
|
#ifdef HAVE_MMX |
|
|
// use the new MMX scaler if the mmx2 can't be used (its faster than the x86asm one) |
|
|
// use the new MMX scaler if the mmx2 can't be used (its faster than the x86asm one) |
|
|
@@ -2932,6 +2975,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s |
|
|
const int chrSrcSliceY= srcSliceY >> c->chrSrcVSubSample; |
|
|
const int chrSrcSliceY= srcSliceY >> c->chrSrcVSubSample; |
|
|
const int chrSrcSliceH= -((-srcSliceH) >> c->chrSrcVSubSample); |
|
|
const int chrSrcSliceH= -((-srcSliceH) >> c->chrSrcVSubSample); |
|
|
int lastDstY; |
|
|
int lastDstY; |
|
|
|
|
|
uint8_t *pal=NULL; |
|
|
|
|
|
|
|
|
/* vars whch will change and which we need to storw back in the context */ |
|
|
/* vars whch will change and which we need to storw back in the context */ |
|
|
int dstY= c->dstY; |
|
|
int dstY= c->dstY; |
|
|
@@ -2941,6 +2985,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s |
|
|
int lastInChrBuf= c->lastInChrBuf; |
|
|
int lastInChrBuf= c->lastInChrBuf; |
|
|
|
|
|
|
|
|
if(isPacked(c->srcFormat)){ |
|
|
if(isPacked(c->srcFormat)){ |
|
|
|
|
|
pal= src[1]; |
|
|
src[0]= |
|
|
src[0]= |
|
|
src[1]= |
|
|
src[1]= |
|
|
src[2]= src[0]; |
|
|
src[2]= src[0]; |
|
|
@@ -3026,7 +3071,7 @@ i--; |
|
|
RENAME(hyscale)(lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc, |
|
|
RENAME(hyscale)(lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc, |
|
|
flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize, |
|
|
flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize, |
|
|
funnyYCode, c->srcFormat, formatConvBuffer, |
|
|
funnyYCode, c->srcFormat, formatConvBuffer, |
|
|
c->lumMmx2Filter, c->lumMmx2FilterPos); |
|
|
|
|
|
|
|
|
c->lumMmx2Filter, c->lumMmx2FilterPos, pal); |
|
|
lastInLumBuf++; |
|
|
lastInLumBuf++; |
|
|
} |
|
|
} |
|
|
while(lastInChrBuf < lastChrSrcY) |
|
|
while(lastInChrBuf < lastChrSrcY) |
|
|
@@ -3043,7 +3088,7 @@ i--; |
|
|
RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, chrSrcW, chrXInc, |
|
|
RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, chrSrcW, chrXInc, |
|
|
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize, |
|
|
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize, |
|
|
funnyUVCode, c->srcFormat, formatConvBuffer, |
|
|
funnyUVCode, c->srcFormat, formatConvBuffer, |
|
|
c->chrMmx2Filter, c->chrMmx2FilterPos); |
|
|
|
|
|
|
|
|
c->chrMmx2Filter, c->chrMmx2FilterPos, pal); |
|
|
lastInChrBuf++; |
|
|
lastInChrBuf++; |
|
|
} |
|
|
} |
|
|
//wrap buf index around to stay inside the ring buffer |
|
|
//wrap buf index around to stay inside the ring buffer |
|
|
@@ -3068,7 +3113,7 @@ i--; |
|
|
RENAME(hyscale)(lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc, |
|
|
RENAME(hyscale)(lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc, |
|
|
flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize, |
|
|
flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize, |
|
|
funnyYCode, c->srcFormat, formatConvBuffer, |
|
|
funnyYCode, c->srcFormat, formatConvBuffer, |
|
|
c->lumMmx2Filter, c->lumMmx2FilterPos); |
|
|
|
|
|
|
|
|
c->lumMmx2Filter, c->lumMmx2FilterPos, pal); |
|
|
lastInLumBuf++; |
|
|
lastInLumBuf++; |
|
|
} |
|
|
} |
|
|
while(lastInChrBuf+1 < (chrSrcSliceY + chrSrcSliceH)) |
|
|
while(lastInChrBuf+1 < (chrSrcSliceY + chrSrcSliceH)) |
|
|
@@ -3084,7 +3129,7 @@ i--; |
|
|
RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, chrSrcW, chrXInc, |
|
|
RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, chrSrcW, chrXInc, |
|
|
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize, |
|
|
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize, |
|
|
funnyUVCode, c->srcFormat, formatConvBuffer, |
|
|
funnyUVCode, c->srcFormat, formatConvBuffer, |
|
|
c->chrMmx2Filter, c->chrMmx2FilterPos); |
|
|
|
|
|
|
|
|
c->chrMmx2Filter, c->chrMmx2FilterPos, pal); |
|
|
lastInChrBuf++; |
|
|
lastInChrBuf++; |
|
|
} |
|
|
} |
|
|
//wrap buf index around to stay inside the ring buffer |
|
|
//wrap buf index around to stay inside the ring buffer |
|
|
|