|
|
@ -87,78 +87,77 @@ |
|
|
|
|
|
|
|
|
|
|
|
static inline void FUNC(idctRowCondDC)(DCTELEM *row) |
|
|
|
static inline void FUNC(idctRowCondDC)(DCTELEM *row) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int a0, a1, a2, a3, b0, b1, b2, b3; |
|
|
|
int a0, a1, a2, a3, b0, b1, b2, b3; |
|
|
|
|
|
|
|
|
|
|
|
#if HAVE_FAST_64BIT |
|
|
|
#if HAVE_FAST_64BIT |
|
|
|
#define ROW0_MASK (0xffffLL << 48 * HAVE_BIGENDIAN) |
|
|
|
#define ROW0_MASK (0xffffLL << 48 * HAVE_BIGENDIAN) |
|
|
|
if (((((uint64_t *)row)[0] & ~ROW0_MASK) | ((uint64_t *)row)[1]) == 0) { |
|
|
|
if (((((uint64_t *)row)[0] & ~ROW0_MASK) | ((uint64_t *)row)[1]) == 0) { |
|
|
|
uint64_t temp = (row[0] << DC_SHIFT) & 0xffff; |
|
|
|
uint64_t temp = (row[0] << DC_SHIFT) & 0xffff; |
|
|
|
temp += temp << 16; |
|
|
|
temp += temp << 16; |
|
|
|
temp += temp << 32; |
|
|
|
temp += temp << 32; |
|
|
|
((uint64_t *)row)[0] = temp; |
|
|
|
((uint64_t *)row)[0] = temp; |
|
|
|
((uint64_t *)row)[1] = temp; |
|
|
|
((uint64_t *)row)[1] = temp; |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
#else |
|
|
|
#else |
|
|
|
if (!(((uint32_t*)row)[1] | |
|
|
|
if (!(((uint32_t*)row)[1] | |
|
|
|
((uint32_t*)row)[2] | |
|
|
|
((uint32_t*)row)[2] | |
|
|
|
((uint32_t*)row)[3] | |
|
|
|
((uint32_t*)row)[3] | |
|
|
|
row[1])) { |
|
|
|
row[1])) { |
|
|
|
uint32_t temp = (row[0] << DC_SHIFT) & 0xffff; |
|
|
|
uint32_t temp = (row[0] << DC_SHIFT) & 0xffff; |
|
|
|
temp += temp << 16; |
|
|
|
temp += temp << 16; |
|
|
|
((uint32_t*)row)[0]=((uint32_t*)row)[1] = |
|
|
|
((uint32_t*)row)[0]=((uint32_t*)row)[1] = |
|
|
|
((uint32_t*)row)[2]=((uint32_t*)row)[3] = temp; |
|
|
|
((uint32_t*)row)[2]=((uint32_t*)row)[3] = temp; |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
a0 = (W4 * row[0]) + (1 << (ROW_SHIFT - 1)); |
|
|
|
a0 = (W4 * row[0]) + (1 << (ROW_SHIFT - 1)); |
|
|
|
a1 = a0; |
|
|
|
a1 = a0; |
|
|
|
a2 = a0; |
|
|
|
a2 = a0; |
|
|
|
a3 = a0; |
|
|
|
a3 = a0; |
|
|
|
|
|
|
|
|
|
|
|
/* no need to optimize : gcc does it */ |
|
|
|
a0 += W2 * row[2]; |
|
|
|
a0 += W2 * row[2]; |
|
|
|
a1 += W6 * row[2]; |
|
|
|
a1 += W6 * row[2]; |
|
|
|
a2 -= W6 * row[2]; |
|
|
|
a2 -= W6 * row[2]; |
|
|
|
a3 -= W2 * row[2]; |
|
|
|
a3 -= W2 * row[2]; |
|
|
|
|
|
|
|
|
|
|
|
b0 = MUL(W1, row[1]); |
|
|
|
b0 = MUL(W1, row[1]); |
|
|
|
MAC(b0, W3, row[3]); |
|
|
|
MAC(b0, W3, row[3]); |
|
|
|
b1 = MUL(W3, row[1]); |
|
|
|
b1 = MUL(W3, row[1]); |
|
|
|
MAC(b1, -W7, row[3]); |
|
|
|
MAC(b1, -W7, row[3]); |
|
|
|
b2 = MUL(W5, row[1]); |
|
|
|
b2 = MUL(W5, row[1]); |
|
|
|
MAC(b2, -W1, row[3]); |
|
|
|
MAC(b2, -W1, row[3]); |
|
|
|
b3 = MUL(W7, row[1]); |
|
|
|
b3 = MUL(W7, row[1]); |
|
|
|
MAC(b3, -W5, row[3]); |
|
|
|
MAC(b3, -W5, row[3]); |
|
|
|
|
|
|
|
|
|
|
|
if (AV_RN64A(row + 4)) { |
|
|
|
if (AV_RN64A(row + 4)) { |
|
|
|
a0 += W4*row[4] + W6*row[6]; |
|
|
|
a0 += W4*row[4] + W6*row[6]; |
|
|
|
a1 += - W4*row[4] - W2*row[6]; |
|
|
|
a1 += - W4*row[4] - W2*row[6]; |
|
|
|
a2 += - W4*row[4] + W2*row[6]; |
|
|
|
a2 += - W4*row[4] + W2*row[6]; |
|
|
|
a3 += W4*row[4] - W6*row[6]; |
|
|
|
a3 += W4*row[4] - W6*row[6]; |
|
|
|
|
|
|
|
|
|
|
|
MAC(b0, W5, row[5]); |
|
|
|
MAC(b0, W5, row[5]); |
|
|
|
MAC(b0, W7, row[7]); |
|
|
|
MAC(b0, W7, row[7]); |
|
|
|
|
|
|
|
|
|
|
|
MAC(b1, -W1, row[5]); |
|
|
|
MAC(b1, -W1, row[5]); |
|
|
|
MAC(b1, -W5, row[7]); |
|
|
|
MAC(b1, -W5, row[7]); |
|
|
|
|
|
|
|
|
|
|
|
MAC(b2, W7, row[5]); |
|
|
|
MAC(b2, W7, row[5]); |
|
|
|
MAC(b2, W3, row[7]); |
|
|
|
MAC(b2, W3, row[7]); |
|
|
|
|
|
|
|
|
|
|
|
MAC(b3, W3, row[5]); |
|
|
|
MAC(b3, W3, row[5]); |
|
|
|
MAC(b3, -W1, row[7]); |
|
|
|
MAC(b3, -W1, row[7]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
row[0] = (a0 + b0) >> ROW_SHIFT; |
|
|
|
row[0] = (a0 + b0) >> ROW_SHIFT; |
|
|
|
row[7] = (a0 - b0) >> ROW_SHIFT; |
|
|
|
row[7] = (a0 - b0) >> ROW_SHIFT; |
|
|
|
row[1] = (a1 + b1) >> ROW_SHIFT; |
|
|
|
row[1] = (a1 + b1) >> ROW_SHIFT; |
|
|
|
row[6] = (a1 - b1) >> ROW_SHIFT; |
|
|
|
row[6] = (a1 - b1) >> ROW_SHIFT; |
|
|
|
row[2] = (a2 + b2) >> ROW_SHIFT; |
|
|
|
row[2] = (a2 + b2) >> ROW_SHIFT; |
|
|
|
row[5] = (a2 - b2) >> ROW_SHIFT; |
|
|
|
row[5] = (a2 - b2) >> ROW_SHIFT; |
|
|
|
row[3] = (a3 + b3) >> ROW_SHIFT; |
|
|
|
row[3] = (a3 + b3) >> ROW_SHIFT; |
|
|
|
row[4] = (a3 - b3) >> ROW_SHIFT; |
|
|
|
row[4] = (a3 - b3) >> ROW_SHIFT; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#define IDCT_COLS do { \ |
|
|
|
#define IDCT_COLS do { \ |
|
|
@ -214,67 +213,67 @@ static inline void FUNC(idctRowCondDC)(DCTELEM *row) |
|
|
|
static inline void FUNC(idctSparseColPut)(pixel *dest, int line_size, |
|
|
|
static inline void FUNC(idctSparseColPut)(pixel *dest, int line_size, |
|
|
|
DCTELEM *col) |
|
|
|
DCTELEM *col) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int a0, a1, a2, a3, b0, b1, b2, b3; |
|
|
|
int a0, a1, a2, a3, b0, b1, b2, b3; |
|
|
|
INIT_CLIP; |
|
|
|
INIT_CLIP; |
|
|
|
|
|
|
|
|
|
|
|
IDCT_COLS; |
|
|
|
IDCT_COLS; |
|
|
|
|
|
|
|
|
|
|
|
dest[0] = CLIP((a0 + b0) >> COL_SHIFT); |
|
|
|
dest[0] = CLIP((a0 + b0) >> COL_SHIFT); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP((a1 + b1) >> COL_SHIFT); |
|
|
|
dest[0] = CLIP((a1 + b1) >> COL_SHIFT); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP((a2 + b2) >> COL_SHIFT); |
|
|
|
dest[0] = CLIP((a2 + b2) >> COL_SHIFT); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP((a3 + b3) >> COL_SHIFT); |
|
|
|
dest[0] = CLIP((a3 + b3) >> COL_SHIFT); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP((a3 - b3) >> COL_SHIFT); |
|
|
|
dest[0] = CLIP((a3 - b3) >> COL_SHIFT); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP((a2 - b2) >> COL_SHIFT); |
|
|
|
dest[0] = CLIP((a2 - b2) >> COL_SHIFT); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP((a1 - b1) >> COL_SHIFT); |
|
|
|
dest[0] = CLIP((a1 - b1) >> COL_SHIFT); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP((a0 - b0) >> COL_SHIFT); |
|
|
|
dest[0] = CLIP((a0 - b0) >> COL_SHIFT); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline void FUNC(idctSparseColAdd)(pixel *dest, int line_size, |
|
|
|
static inline void FUNC(idctSparseColAdd)(pixel *dest, int line_size, |
|
|
|
DCTELEM *col) |
|
|
|
DCTELEM *col) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int a0, a1, a2, a3, b0, b1, b2, b3; |
|
|
|
int a0, a1, a2, a3, b0, b1, b2, b3; |
|
|
|
INIT_CLIP; |
|
|
|
INIT_CLIP; |
|
|
|
|
|
|
|
|
|
|
|
IDCT_COLS; |
|
|
|
IDCT_COLS; |
|
|
|
|
|
|
|
|
|
|
|
dest[0] = CLIP(dest[0] + ((a0 + b0) >> COL_SHIFT)); |
|
|
|
dest[0] = CLIP(dest[0] + ((a0 + b0) >> COL_SHIFT)); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP(dest[0] + ((a1 + b1) >> COL_SHIFT)); |
|
|
|
dest[0] = CLIP(dest[0] + ((a1 + b1) >> COL_SHIFT)); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP(dest[0] + ((a2 + b2) >> COL_SHIFT)); |
|
|
|
dest[0] = CLIP(dest[0] + ((a2 + b2) >> COL_SHIFT)); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP(dest[0] + ((a3 + b3) >> COL_SHIFT)); |
|
|
|
dest[0] = CLIP(dest[0] + ((a3 + b3) >> COL_SHIFT)); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP(dest[0] + ((a3 - b3) >> COL_SHIFT)); |
|
|
|
dest[0] = CLIP(dest[0] + ((a3 - b3) >> COL_SHIFT)); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP(dest[0] + ((a2 - b2) >> COL_SHIFT)); |
|
|
|
dest[0] = CLIP(dest[0] + ((a2 - b2) >> COL_SHIFT)); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP(dest[0] + ((a1 - b1) >> COL_SHIFT)); |
|
|
|
dest[0] = CLIP(dest[0] + ((a1 - b1) >> COL_SHIFT)); |
|
|
|
dest += line_size; |
|
|
|
dest += line_size; |
|
|
|
dest[0] = CLIP(dest[0] + ((a0 - b0) >> COL_SHIFT)); |
|
|
|
dest[0] = CLIP(dest[0] + ((a0 - b0) >> COL_SHIFT)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline void FUNC(idctSparseCol)(DCTELEM *col) |
|
|
|
static inline void FUNC(idctSparseCol)(DCTELEM *col) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int a0, a1, a2, a3, b0, b1, b2, b3; |
|
|
|
int a0, a1, a2, a3, b0, b1, b2, b3; |
|
|
|
|
|
|
|
|
|
|
|
IDCT_COLS; |
|
|
|
IDCT_COLS; |
|
|
|
|
|
|
|
|
|
|
|
col[0 ] = ((a0 + b0) >> COL_SHIFT); |
|
|
|
col[0 ] = ((a0 + b0) >> COL_SHIFT); |
|
|
|
col[8 ] = ((a1 + b1) >> COL_SHIFT); |
|
|
|
col[8 ] = ((a1 + b1) >> COL_SHIFT); |
|
|
|
col[16] = ((a2 + b2) >> COL_SHIFT); |
|
|
|
col[16] = ((a2 + b2) >> COL_SHIFT); |
|
|
|
col[24] = ((a3 + b3) >> COL_SHIFT); |
|
|
|
col[24] = ((a3 + b3) >> COL_SHIFT); |
|
|
|
col[32] = ((a3 - b3) >> COL_SHIFT); |
|
|
|
col[32] = ((a3 - b3) >> COL_SHIFT); |
|
|
|
col[40] = ((a2 - b2) >> COL_SHIFT); |
|
|
|
col[40] = ((a2 - b2) >> COL_SHIFT); |
|
|
|
col[48] = ((a1 - b1) >> COL_SHIFT); |
|
|
|
col[48] = ((a1 - b1) >> COL_SHIFT); |
|
|
|
col[56] = ((a0 - b0) >> COL_SHIFT); |
|
|
|
col[56] = ((a0 - b0) >> COL_SHIFT); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void FUNC(ff_simple_idct_put)(uint8_t *dest_, int line_size, DCTELEM *block) |
|
|
|
void FUNC(ff_simple_idct_put)(uint8_t *dest_, int line_size, DCTELEM *block) |
|
|
@ -284,10 +283,10 @@ void FUNC(ff_simple_idct_put)(uint8_t *dest_, int line_size, DCTELEM *block) |
|
|
|
|
|
|
|
|
|
|
|
line_size /= sizeof(pixel); |
|
|
|
line_size /= sizeof(pixel); |
|
|
|
|
|
|
|
|
|
|
|
for(i=0; i<8; i++) |
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
FUNC(idctRowCondDC)(block + i*8); |
|
|
|
FUNC(idctRowCondDC)(block + i*8); |
|
|
|
|
|
|
|
|
|
|
|
for(i=0; i<8; i++) |
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
FUNC(idctSparseColPut)(dest + i, line_size, block + i); |
|
|
|
FUNC(idctSparseColPut)(dest + i, line_size, block + i); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -298,19 +297,20 @@ void FUNC(ff_simple_idct_add)(uint8_t *dest_, int line_size, DCTELEM *block) |
|
|
|
|
|
|
|
|
|
|
|
line_size /= sizeof(pixel); |
|
|
|
line_size /= sizeof(pixel); |
|
|
|
|
|
|
|
|
|
|
|
for(i=0; i<8; i++) |
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
FUNC(idctRowCondDC)(block + i*8); |
|
|
|
FUNC(idctRowCondDC)(block + i*8); |
|
|
|
|
|
|
|
|
|
|
|
for(i=0; i<8; i++) |
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
FUNC(idctSparseColAdd)(dest + i, line_size, block + i); |
|
|
|
FUNC(idctSparseColAdd)(dest + i, line_size, block + i); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void FUNC(ff_simple_idct)(DCTELEM *block) |
|
|
|
void FUNC(ff_simple_idct)(DCTELEM *block) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
for(i=0; i<8; i++) |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
FUNC(idctRowCondDC)(block + i*8); |
|
|
|
FUNC(idctRowCondDC)(block + i*8); |
|
|
|
|
|
|
|
|
|
|
|
for(i=0; i<8; i++) |
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
FUNC(idctSparseCol)(block + i); |
|
|
|
FUNC(idctSparseCol)(block + i); |
|
|
|
} |
|
|
|
} |
|
|
|