From 21581182ca388090bebd032788fac958edd92b1e Mon Sep 17 00:00:00 2001 From: "zhaoxiu.zeng" Date: Wed, 25 Feb 2015 00:28:45 +0800 Subject: [PATCH] avcodec/vc1_block: Optimize vc1_decode_i_block() Signed-off-by: Michael Niedermayer --- libavcodec/vc1_block.c | 95 +++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 57 deletions(-) diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index 4adcc82b74..50c9887e22 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -555,7 +555,7 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, int i; int16_t *dc_val; int16_t *ac_val, *ac_val2; - int dcdiff; + int dcdiff, scale; /* Get DC differential */ if (n < 4) { @@ -584,27 +584,29 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, *dc_val = dcdiff; /* Store the quantized DC coeff, used for prediction */ - if (n < 4) { - block[0] = dcdiff * s->y_dc_scale; - } else { - block[0] = dcdiff * s->c_dc_scale; - } - /* Skip ? */ - if (!coded) { - goto not_coded; - } + if (n < 4) + scale = s->y_dc_scale; + else + scale = s->c_dc_scale; + block[0] = dcdiff * scale; - // AC Decoding - i = 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]; - { + scale = v->pq * 2 + v->halfpq; + + //AC Decoding + i = !!coded; + + if (coded) { int last = 0, skip, value; const uint8_t *zz_table; - int scale; int k; - scale = v->pq * 2 + v->halfpq; - if (v->s.ac_pred) { if (!dc_pred_dir) zz_table = v->zz_8x8[2]; @@ -613,13 +615,6 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, } else 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) { vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); i += skip; @@ -630,13 +625,15 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, /* apply AC prediction if needed */ if (s->ac_pred) { + int sh; if (dc_pred_dir) { // left - for (k = 1; k < 8; k++) - block[k << v->left_blk_sh] += ac_val[k]; + sh = v->left_blk_sh; } else { // top - for (k = 1; k < 8; k++) - block[k << v->top_blk_sh] += ac_val[k + 8]; + sh = v->top_blk_sh; + ac_val += 8; } + for (k = 1; k < 8; k++) + block[k << sh] += ac_val[k]; } /* save AC coeffs for further prediction */ for (k = 1; k < 8; k++) { @@ -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; } - 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); - 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 */ if (s->ac_pred) { + int sh; if (dc_pred_dir) { //left - for (k = 1; k < 8; k++) { - 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; - } + sh = v->left_blk_sh; } else { // top - for (k = 1; k < 8; k++) { - block[k << v->top_blk_sh] = ac_val[k + 8] * scale; - if (!v->pquantizer && block[k << v->top_blk_sh]) - block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -v->pq : v->pq; - } + sh = v->top_blk_sh; + ac_val += 8; + ac_val2 += 8; + } + 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; return 0;