# HG changeset patch # User michael # Date 1113910621 0 # Node ID 616d8c4fde6d9df8d50d45c7aa2184833ed9f399 # Parent ba6530ae8e3458bb52650a4dc9092f3f62e40ec9 optimizing non_intra ac coeff decode diff -r ba6530ae8e34 -r 616d8c4fde6d mpeg12.c --- a/mpeg12.c Tue Apr 19 04:29:11 2005 +0000 +++ b/mpeg12.c Tue Apr 19 11:37:01 2005 +0000 @@ -1564,45 +1564,42 @@ const int qscale= s->qscale; { - int v; OPEN_READER(re, &s->gb); i = -1; /* special case for the first coef. no need to add a second vlc table */ UPDATE_CACHE(re, &s->gb); - v= SHOW_UBITS(re, &s->gb, 2); - if (v & 2) { - LAST_SKIP_BITS(re, &s->gb, 2); + if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { level= (3*qscale*quant_matrix[0])>>5; level= (level-1)|1; - if(v&1) + if(GET_CACHE(re, &s->gb)&0x40000000) level= -level; block[0] = level; i++; + SKIP_BITS(re, &s->gb, 2); + if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) + goto end; } /* now quantify & encode AC coefs */ for(;;) { - UPDATE_CACHE(re, &s->gb); GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); - if(level == 127){ - break; - } else if(level != 0) { + if(level != 0) { i += run; j = scantable[i]; level= ((level*2+1)*qscale*quant_matrix[j])>>5; level= (level-1)|1; level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); - LAST_SKIP_BITS(re, &s->gb, 1); + SKIP_BITS(re, &s->gb, 1); } else { /* escape */ run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); UPDATE_CACHE(re, &s->gb); level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); if (level == -128) { - level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8); + level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); } else if (level == 0) { - level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8); + level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8); } i += run; j = scantable[i]; @@ -1622,7 +1619,12 @@ } block[j] = level; + if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) + break; + UPDATE_CACHE(re, &s->gb); } +end: + LAST_SKIP_BITS(re, &s->gb, 2); CLOSE_READER(re, &s->gb); } s->block_last_index[n] = i; @@ -1637,45 +1639,42 @@ const int qscale= s->qscale; { - int v; OPEN_READER(re, &s->gb); i = -1; /* special case for the first coef. no need to add a second vlc table */ UPDATE_CACHE(re, &s->gb); - v= SHOW_UBITS(re, &s->gb, 2); - if (v & 2) { - LAST_SKIP_BITS(re, &s->gb, 2); + if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { level= (3*qscale)>>1; level= (level-1)|1; - if(v&1) + if(GET_CACHE(re, &s->gb)&0x40000000) level= -level; block[0] = level; i++; + SKIP_BITS(re, &s->gb, 2); + if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) + goto end; } /* now quantify & encode AC coefs */ for(;;) { - UPDATE_CACHE(re, &s->gb); GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); - if(level == 127){ - break; - } else if(level != 0) { + if(level != 0) { i += run; j = scantable[i]; level= ((level*2+1)*qscale)>>1; level= (level-1)|1; level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); - LAST_SKIP_BITS(re, &s->gb, 1); + SKIP_BITS(re, &s->gb, 1); } else { /* escape */ run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); UPDATE_CACHE(re, &s->gb); level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); if (level == -128) { - level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8); + level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); } else if (level == 0) { - level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8); + level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8); } i += run; j = scantable[i]; @@ -1691,7 +1690,12 @@ } block[j] = level; + if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) + break; + UPDATE_CACHE(re, &s->gb); } +end: + LAST_SKIP_BITS(re, &s->gb, 2); CLOSE_READER(re, &s->gb); } s->block_last_index[n] = i; @@ -1713,7 +1717,6 @@ mismatch = 1; { - int v; OPEN_READER(re, &s->gb); i = -1; if (n < 4) @@ -1723,30 +1726,28 @@ /* special case for the first coef. no need to add a second vlc table */ UPDATE_CACHE(re, &s->gb); - v= SHOW_UBITS(re, &s->gb, 2); - if (v & 2) { - LAST_SKIP_BITS(re, &s->gb, 2); + if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { level= (3*qscale*quant_matrix[0])>>5; - if(v&1) + if(GET_CACHE(re, &s->gb)&0x40000000) level= -level; block[0] = level; mismatch ^= level; i++; + SKIP_BITS(re, &s->gb, 2); + if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) + goto end; } /* now quantify & encode AC coefs */ for(;;) { - UPDATE_CACHE(re, &s->gb); GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); - if(level == 127){ - break; - } else if(level != 0) { + if(level != 0) { i += run; j = scantable[i]; level= ((level*2+1)*qscale*quant_matrix[j])>>5; level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); - LAST_SKIP_BITS(re, &s->gb, 1); + SKIP_BITS(re, &s->gb, 1); } else { /* escape */ run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); @@ -1769,7 +1770,12 @@ mismatch ^= level; block[j] = level; + if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) + break; + UPDATE_CACHE(re, &s->gb); } +end: + LAST_SKIP_BITS(re, &s->gb, 2); CLOSE_READER(re, &s->gb); } block[63] ^= (mismatch & 1); @@ -1792,29 +1798,27 @@ /* special case for the first coef. no need to add a second vlc table */ UPDATE_CACHE(re, &s->gb); - v= SHOW_UBITS(re, &s->gb, 2); - if (v & 2) { - LAST_SKIP_BITS(re, &s->gb, 2); + if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { level= (3*qscale)>>1; - if(v&1) + if(GET_CACHE(re, &s->gb)&0x40000000) level= -level; block[0] = level; i++; + SKIP_BITS(re, &s->gb, 2); + if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) + goto end; } /* now quantify & encode AC coefs */ for(;;) { - UPDATE_CACHE(re, &s->gb); GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); - if(level == 127){ - break; - } else if(level != 0) { + if(level != 0) { i += run; j = scantable[i]; level= ((level*2+1)*qscale)>>1; level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); - LAST_SKIP_BITS(re, &s->gb, 1); + SKIP_BITS(re, &s->gb, 1); } else { /* escape */ run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); @@ -1832,7 +1836,12 @@ } block[j] = level; + if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) + break; + UPDATE_CACHE(re, &s->gb); } +end: + LAST_SKIP_BITS(re, &s->gb, 2); CLOSE_READER(re, &s->gb); s->block_last_index[n] = i; return 0;