optimizing 4x4 idct
Originally committed as revision 3514 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
af2a9e8fdb
commit
affbf0435a
@ -1184,11 +1184,13 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
int32_t d0, d2, d4, d6;
|
||||
register DCTELEM *dataptr;
|
||||
int rowctr;
|
||||
|
||||
|
||||
/* Pass 1: process rows. */
|
||||
/* Note results are scaled up by sqrt(8) compared to a true IDCT; */
|
||||
/* furthermore, we scale the results by 2**PASS1_BITS. */
|
||||
|
||||
data[0] += 4;
|
||||
|
||||
dataptr = data;
|
||||
|
||||
for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
|
||||
@ -1222,13 +1224,11 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
dataptr += DCTSTRIDE; /* advance pointer to next row */
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
/* Even part: reverse the even part of the forward DCT. */
|
||||
/* The rotator is sqrt(2)*c(-6). */
|
||||
if (d6) {
|
||||
if (d4) {
|
||||
if (d2) {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
|
||||
z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
|
||||
tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
|
||||
@ -1241,21 +1241,7 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp1 + tmp2;
|
||||
tmp12 = tmp1 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
|
||||
z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
|
||||
tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
|
||||
tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
|
||||
|
||||
tmp0 = d4 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp2 - tmp0;
|
||||
tmp12 = -(tmp0 + tmp2);
|
||||
}
|
||||
} else {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
|
||||
tmp2 = MULTIPLY(-d6, FIX_1_306562965);
|
||||
tmp3 = MULTIPLY(d6, FIX_0_541196100);
|
||||
@ -1267,72 +1253,9 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp1 + tmp2;
|
||||
tmp12 = tmp1 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
|
||||
tmp2 = MULTIPLY(-d6, FIX_1_306562965);
|
||||
tmp3 = MULTIPLY(d6, FIX_0_541196100);
|
||||
|
||||
tmp0 = d4 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp2 - tmp0;
|
||||
tmp12 = -(tmp0 + tmp2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (d2) {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
|
||||
z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
|
||||
tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
|
||||
tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
|
||||
|
||||
tmp0 = d0 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp0 + tmp2;
|
||||
tmp12 = tmp0 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
|
||||
z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
|
||||
tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
|
||||
tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
|
||||
|
||||
tmp10 = tmp3;
|
||||
tmp13 = -tmp3;
|
||||
tmp11 = tmp2;
|
||||
tmp12 = -tmp2;
|
||||
}
|
||||
} else {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
|
||||
tmp2 = MULTIPLY(-d6, FIX_1_306562965);
|
||||
tmp3 = MULTIPLY(d6, FIX_0_541196100);
|
||||
|
||||
tmp0 = d0 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp0 + tmp2;
|
||||
tmp12 = tmp0 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
|
||||
tmp2 = MULTIPLY(-d6, FIX_1_306562965);
|
||||
tmp3 = MULTIPLY(d6, FIX_0_541196100);
|
||||
|
||||
tmp10 = tmp3;
|
||||
tmp13 = -tmp3;
|
||||
tmp11 = tmp2;
|
||||
tmp12 = -tmp2;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (d4) {
|
||||
if (d2) {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
|
||||
tmp2 = MULTIPLY(d2, FIX_0_541196100);
|
||||
tmp3 = MULTIPLY(d2, FIX_1_306562965);
|
||||
@ -1344,62 +1267,11 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp1 + tmp2;
|
||||
tmp12 = tmp1 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
|
||||
tmp2 = MULTIPLY(d2, FIX_0_541196100);
|
||||
tmp3 = MULTIPLY(d2, FIX_1_306562965);
|
||||
|
||||
tmp0 = d4 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp2 - tmp0;
|
||||
tmp12 = -(tmp0 + tmp2);
|
||||
}
|
||||
} else {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
|
||||
tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
|
||||
tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
|
||||
} else {
|
||||
/* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
|
||||
tmp10 = tmp13 = d4 << CONST_BITS;
|
||||
tmp11 = tmp12 = -tmp10;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (d2) {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
|
||||
tmp2 = MULTIPLY(d2, FIX_0_541196100);
|
||||
tmp3 = MULTIPLY(d2, FIX_1_306562965);
|
||||
|
||||
tmp0 = d0 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp0 + tmp2;
|
||||
tmp12 = tmp0 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
|
||||
tmp2 = MULTIPLY(d2, FIX_0_541196100);
|
||||
tmp3 = MULTIPLY(d2, FIX_1_306562965);
|
||||
|
||||
tmp10 = tmp3;
|
||||
tmp13 = -tmp3;
|
||||
tmp11 = tmp2;
|
||||
tmp12 = -tmp2;
|
||||
}
|
||||
} else {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
|
||||
tmp10 = tmp13 = tmp11 = tmp12 = d0 << CONST_BITS;
|
||||
} else {
|
||||
/* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
|
||||
tmp10 = tmp13 = tmp11 = tmp12 = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
|
||||
@ -1434,9 +1306,7 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
/* Even part: reverse the even part of the forward DCT. */
|
||||
/* The rotator is sqrt(2)*c(-6). */
|
||||
if (d6) {
|
||||
if (d4) {
|
||||
if (d2) {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
|
||||
z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
|
||||
tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
|
||||
@ -1449,21 +1319,7 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp1 + tmp2;
|
||||
tmp12 = tmp1 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
|
||||
z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
|
||||
tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
|
||||
tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
|
||||
|
||||
tmp0 = d4 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp2 - tmp0;
|
||||
tmp12 = -(tmp0 + tmp2);
|
||||
}
|
||||
} else {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
|
||||
tmp2 = MULTIPLY(-d6, FIX_1_306562965);
|
||||
tmp3 = MULTIPLY(d6, FIX_0_541196100);
|
||||
@ -1475,72 +1331,9 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp1 + tmp2;
|
||||
tmp12 = tmp1 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
|
||||
tmp2 = MULTIPLY(-d6, FIX_1_306562965);
|
||||
tmp3 = MULTIPLY(d6, FIX_0_541196100);
|
||||
|
||||
tmp0 = d4 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp2 - tmp0;
|
||||
tmp12 = -(tmp0 + tmp2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (d2) {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
|
||||
z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
|
||||
tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
|
||||
tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
|
||||
|
||||
tmp0 = d0 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp0 + tmp2;
|
||||
tmp12 = tmp0 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
|
||||
z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
|
||||
tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
|
||||
tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
|
||||
|
||||
tmp10 = tmp3;
|
||||
tmp13 = -tmp3;
|
||||
tmp11 = tmp2;
|
||||
tmp12 = -tmp2;
|
||||
}
|
||||
} else {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
|
||||
tmp2 = MULTIPLY(-d6, FIX_1_306562965);
|
||||
tmp3 = MULTIPLY(d6, FIX_0_541196100);
|
||||
|
||||
tmp0 = d0 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp0 + tmp2;
|
||||
tmp12 = tmp0 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
|
||||
tmp2 = MULTIPLY(-d6, FIX_1_306562965);
|
||||
tmp3 = MULTIPLY(d6, FIX_0_541196100);
|
||||
|
||||
tmp10 = tmp3;
|
||||
tmp13 = -tmp3;
|
||||
tmp11 = tmp2;
|
||||
tmp12 = -tmp2;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (d4) {
|
||||
if (d2) {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
|
||||
tmp2 = MULTIPLY(d2, FIX_0_541196100);
|
||||
tmp3 = MULTIPLY(d2, FIX_1_306562965);
|
||||
@ -1552,74 +1345,19 @@ void j_rev_dct4(DCTBLOCK data)
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp1 + tmp2;
|
||||
tmp12 = tmp1 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
|
||||
tmp2 = MULTIPLY(d2, FIX_0_541196100);
|
||||
tmp3 = MULTIPLY(d2, FIX_1_306562965);
|
||||
|
||||
tmp0 = d4 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp2 - tmp0;
|
||||
tmp12 = -(tmp0 + tmp2);
|
||||
}
|
||||
} else {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
|
||||
tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
|
||||
tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
|
||||
} else {
|
||||
/* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
|
||||
tmp10 = tmp13 = d4 << CONST_BITS;
|
||||
tmp11 = tmp12 = -tmp10;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (d2) {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
|
||||
tmp2 = MULTIPLY(d2, FIX_0_541196100);
|
||||
tmp3 = MULTIPLY(d2, FIX_1_306562965);
|
||||
|
||||
tmp0 = d0 << CONST_BITS;
|
||||
|
||||
tmp10 = tmp0 + tmp3;
|
||||
tmp13 = tmp0 - tmp3;
|
||||
tmp11 = tmp0 + tmp2;
|
||||
tmp12 = tmp0 - tmp2;
|
||||
} else {
|
||||
/* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
|
||||
tmp2 = MULTIPLY(d2, FIX_0_541196100);
|
||||
tmp3 = MULTIPLY(d2, FIX_1_306562965);
|
||||
|
||||
tmp10 = tmp3;
|
||||
tmp13 = -tmp3;
|
||||
tmp11 = tmp2;
|
||||
tmp12 = -tmp2;
|
||||
}
|
||||
} else {
|
||||
if (d0) {
|
||||
/* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
|
||||
tmp10 = tmp13 = tmp11 = tmp12 = d0 << CONST_BITS;
|
||||
} else {
|
||||
/* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
|
||||
tmp10 = tmp13 = tmp11 = tmp12 = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
|
||||
|
||||
dataptr[DCTSTRIDE*0] = (DCTELEM) DESCALE(tmp10,
|
||||
CONST_BITS+PASS1_BITS+3);
|
||||
dataptr[DCTSTRIDE*1] = (DCTELEM) DESCALE(tmp11,
|
||||
CONST_BITS+PASS1_BITS+3);
|
||||
dataptr[DCTSTRIDE*2] = (DCTELEM) DESCALE(tmp12,
|
||||
CONST_BITS+PASS1_BITS+3);
|
||||
dataptr[DCTSTRIDE*3] = (DCTELEM) DESCALE(tmp13,
|
||||
CONST_BITS+PASS1_BITS+3);
|
||||
dataptr[DCTSTRIDE*0] = tmp10 >> (CONST_BITS+PASS1_BITS+3);
|
||||
dataptr[DCTSTRIDE*1] = tmp11 >> (CONST_BITS+PASS1_BITS+3);
|
||||
dataptr[DCTSTRIDE*2] = tmp12 >> (CONST_BITS+PASS1_BITS+3);
|
||||
dataptr[DCTSTRIDE*3] = tmp13 >> (CONST_BITS+PASS1_BITS+3);
|
||||
|
||||
dataptr++; /* advance pointer to next column */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user