|
|
@ -22,6 +22,7 @@ |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#include <inttypes.h> |
|
|
|
#include <inttypes.h> |
|
|
|
|
|
|
|
|
|
|
|
#include "config.h" |
|
|
|
#include "config.h" |
|
|
|
#include "libswscale/swscale.h" |
|
|
|
#include "libswscale/swscale.h" |
|
|
|
#include "libswscale/swscale_internal.h" |
|
|
|
#include "libswscale/swscale_internal.h" |
|
|
@ -30,8 +31,8 @@ |
|
|
|
|
|
|
|
|
|
|
|
#define vzero vec_splat_s32(0) |
|
|
|
#define vzero vec_splat_s32(0) |
|
|
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
static inline void altivec_packIntArrayToCharArray(int *val, uint8_t *dest, |
|
|
|
altivec_packIntArrayToCharArray(int *val, uint8_t* dest, int dstW) |
|
|
|
int dstW) |
|
|
|
{ |
|
|
|
{ |
|
|
|
register int i; |
|
|
|
register int i; |
|
|
|
vector unsigned int altivec_vectorShiftInt19 = |
|
|
|
vector unsigned int altivec_vectorShiftInt19 = |
|
|
@ -93,8 +94,7 @@ altivec_packIntArrayToCharArray(int *val, uint8_t* dest, int dstW) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// FIXME remove the usage of scratch buffers.
|
|
|
|
// FIXME remove the usage of scratch buffers.
|
|
|
|
static void |
|
|
|
static void yuv2planeX_altivec(const int16_t *filter, int filterSize, |
|
|
|
yuv2planeX_altivec(const int16_t *filter, int filterSize, |
|
|
|
|
|
|
|
const int16_t **src, uint8_t *dest, int dstW, |
|
|
|
const int16_t **src, uint8_t *dest, int dstW, |
|
|
|
const uint8_t *dither, int offset) |
|
|
|
const uint8_t *dither, int offset) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -136,10 +136,9 @@ yuv2planeX_altivec(const int16_t *filter, int filterSize, |
|
|
|
|
|
|
|
|
|
|
|
l1 = l2; |
|
|
|
l1 = l2; |
|
|
|
} |
|
|
|
} |
|
|
|
for ( ; i < dstW; i++) { |
|
|
|
for (; i < dstW; i++) |
|
|
|
val[i] += src[j][i] * filter[j]; |
|
|
|
val[i] += src[j][i] * filter[j]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
altivec_packIntArrayToCharArray(val, dest, dstW); |
|
|
|
altivec_packIntArrayToCharArray(val, dest, dstW); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -155,13 +154,11 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW, |
|
|
|
register int j; |
|
|
|
register int j; |
|
|
|
register int srcPos = filterPos[i]; |
|
|
|
register int srcPos = filterPos[i]; |
|
|
|
register int val = 0; |
|
|
|
register int val = 0; |
|
|
|
for (j=0; j<filterSize; j++) { |
|
|
|
for (j = 0; j < filterSize; j++) |
|
|
|
val += ((int)src[srcPos + j]) * filter[filterSize * i + j]; |
|
|
|
val += ((int)src[srcPos + j]) * filter[filterSize * i + j]; |
|
|
|
} |
|
|
|
|
|
|
|
dst[i] = FFMIN(val >> 7, (1 << 15) - 1); |
|
|
|
dst[i] = FFMIN(val >> 7, (1 << 15) - 1); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else |
|
|
|
else |
|
|
|
|
|
|
|
switch (filterSize) { |
|
|
|
switch (filterSize) { |
|
|
|
case 4: |
|
|
|
case 4: |
|
|
|
for (i = 0; i < dstW; i++) { |
|
|
|
for (i = 0; i < dstW; i++) { |
|
|
@ -310,7 +307,6 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW, |
|
|
|
vec_st(val_s, 0, tempo); |
|
|
|
vec_st(val_s, 0, tempo); |
|
|
|
dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1); |
|
|
|
dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -334,12 +330,24 @@ void ff_sws_init_swScale_altivec(SwsContext *c) |
|
|
|
* match what's found in the body of ff_yuv2packedX_altivec() */ |
|
|
|
* match what's found in the body of ff_yuv2packedX_altivec() */ |
|
|
|
if (!(c->flags & (SWS_BITEXACT | SWS_FULL_CHR_H_INT)) && !c->alpPixBuf) { |
|
|
|
if (!(c->flags & (SWS_BITEXACT | SWS_FULL_CHR_H_INT)) && !c->alpPixBuf) { |
|
|
|
switch (c->dstFormat) { |
|
|
|
switch (c->dstFormat) { |
|
|
|
case PIX_FMT_ABGR: c->yuv2packedX = ff_yuv2abgr_X_altivec; break; |
|
|
|
case PIX_FMT_ABGR: |
|
|
|
case PIX_FMT_BGRA: c->yuv2packedX = ff_yuv2bgra_X_altivec; break; |
|
|
|
c->yuv2packedX = ff_yuv2abgr_X_altivec; |
|
|
|
case PIX_FMT_ARGB: c->yuv2packedX = ff_yuv2argb_X_altivec; break; |
|
|
|
break; |
|
|
|
case PIX_FMT_RGBA: c->yuv2packedX = ff_yuv2rgba_X_altivec; break; |
|
|
|
case PIX_FMT_BGRA: |
|
|
|
case PIX_FMT_BGR24: c->yuv2packedX = ff_yuv2bgr24_X_altivec; break; |
|
|
|
c->yuv2packedX = ff_yuv2bgra_X_altivec; |
|
|
|
case PIX_FMT_RGB24: c->yuv2packedX = ff_yuv2rgb24_X_altivec; break; |
|
|
|
break; |
|
|
|
|
|
|
|
case PIX_FMT_ARGB: |
|
|
|
|
|
|
|
c->yuv2packedX = ff_yuv2argb_X_altivec; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case PIX_FMT_RGBA: |
|
|
|
|
|
|
|
c->yuv2packedX = ff_yuv2rgba_X_altivec; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case PIX_FMT_BGR24: |
|
|
|
|
|
|
|
c->yuv2packedX = ff_yuv2bgr24_X_altivec; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case PIX_FMT_RGB24: |
|
|
|
|
|
|
|
c->yuv2packedX = ff_yuv2rgb24_X_altivec; |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|