Commit 21581182 authored by zhaoxiu.zeng's avatar zhaoxiu.zeng Committed by Michael Niedermayer

avcodec/vc1_block: Optimize vc1_decode_i_block()

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 80a0daa0
...@@ -555,7 +555,7 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, ...@@ -555,7 +555,7 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
int i; int i;
int16_t *dc_val; int16_t *dc_val;
int16_t *ac_val, *ac_val2; int16_t *ac_val, *ac_val2;
int dcdiff; int dcdiff, scale;
/* Get DC differential */ /* Get DC differential */
if (n < 4) { if (n < 4) {
...@@ -584,27 +584,29 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, ...@@ -584,27 +584,29 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
*dc_val = dcdiff; *dc_val = dcdiff;
/* Store the quantized DC coeff, used for prediction */ /* Store the quantized DC coeff, used for prediction */
if (n < 4) { if (n < 4)
block[0] = dcdiff * s->y_dc_scale; scale = s->y_dc_scale;
} else { else
block[0] = dcdiff * s->c_dc_scale; scale = s->c_dc_scale;
} block[0] = dcdiff * scale;
/* Skip ? */
if (!coded) {
goto not_coded;
}
// AC Decoding ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
i = 1; ac_val2 = ac_val;
if (dc_pred_dir) // left
ac_val -= 16;
else // top
ac_val -= 16 * s->block_wrap[n];
{ scale = v->pq * 2 + v->halfpq;
//AC Decoding
i = !!coded;
if (coded) {
int last = 0, skip, value; int last = 0, skip, value;
const uint8_t *zz_table; const uint8_t *zz_table;
int scale;
int k; int k;
scale = v->pq * 2 + v->halfpq;
if (v->s.ac_pred) { if (v->s.ac_pred) {
if (!dc_pred_dir) if (!dc_pred_dir)
zz_table = v->zz_8x8[2]; zz_table = v->zz_8x8[2];
...@@ -613,13 +615,6 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, ...@@ -613,13 +615,6 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
} else } else
zz_table = v->zz_8x8[1]; zz_table = v->zz_8x8[1];
ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
ac_val2 = ac_val;
if (dc_pred_dir) // left
ac_val -= 16;
else // top
ac_val -= 16 * s->block_wrap[n];
while (!last) { while (!last) {
vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
i += skip; i += skip;
...@@ -630,13 +625,15 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, ...@@ -630,13 +625,15 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
/* apply AC prediction if needed */ /* apply AC prediction if needed */
if (s->ac_pred) { if (s->ac_pred) {
int sh;
if (dc_pred_dir) { // left if (dc_pred_dir) { // left
for (k = 1; k < 8; k++) sh = v->left_blk_sh;
block[k << v->left_blk_sh] += ac_val[k];
} else { // top } else { // top
for (k = 1; k < 8; k++) sh = v->top_blk_sh;
block[k << v->top_blk_sh] += ac_val[k + 8]; ac_val += 8;
} }
for (k = 1; k < 8; k++)
block[k << sh] += ac_val[k];
} }
/* save AC coeffs for further prediction */ /* save AC coeffs for further prediction */
for (k = 1; k < 8; k++) { for (k = 1; k < 8; k++) {
...@@ -652,46 +649,30 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, ...@@ -652,46 +649,30 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
block[k] += (block[k] < 0) ? -v->pq : v->pq; block[k] += (block[k] < 0) ? -v->pq : v->pq;
} }
if (s->ac_pred) i = 63; } else {
} int k;
not_coded:
if (!coded) {
int k, scale;
ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
ac_val2 = ac_val;
i = 0;
scale = v->pq * 2 + v->halfpq;
memset(ac_val2, 0, 16 * 2); memset(ac_val2, 0, 16 * 2);
if (dc_pred_dir) { // left
ac_val -= 16;
if (s->ac_pred)
memcpy(ac_val2, ac_val, 8 * 2);
} else { // top
ac_val -= 16 * s->block_wrap[n];
if (s->ac_pred)
memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
}
/* apply AC prediction if needed */ /* apply AC prediction if needed */
if (s->ac_pred) { if (s->ac_pred) {
int sh;
if (dc_pred_dir) { //left if (dc_pred_dir) { //left
for (k = 1; k < 8; k++) { sh = v->left_blk_sh;
block[k << v->left_blk_sh] = ac_val[k] * scale;
if (!v->pquantizer && block[k << v->left_blk_sh])
block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -v->pq : v->pq;
}
} else { // top } else { // top
for (k = 1; k < 8; k++) { sh = v->top_blk_sh;
block[k << v->top_blk_sh] = ac_val[k + 8] * scale; ac_val += 8;
if (!v->pquantizer && block[k << v->top_blk_sh]) ac_val2 += 8;
block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -v->pq : v->pq; }
} memcpy(ac_val2, ac_val, 8 * 2);
for (k = 1; k < 8; k++) {
block[k << sh] = ac_val[k] * scale;
if (!v->pquantizer && block[k << sh])
block[k << sh] += (block[k << sh] < 0) ? -v->pq : v->pq;
} }
i = 63;
} }
} }
if (s->ac_pred) i = 63;
s->block_last_index[n] = i; s->block_last_index[n] = i;
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment