optimizing non_intra ac coeff decode

Originally committed as revision 4140 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 20 years ago
parent 6f921f3100
commit 29df259923
  1. 95
      libavcodec/mpeg12.c

@ -1564,45 +1564,42 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
const int qscale= s->qscale; const int qscale= s->qscale;
{ {
int v;
OPEN_READER(re, &s->gb); OPEN_READER(re, &s->gb);
i = -1; i = -1;
/* special case for the first coef. no need to add a second vlc table */ /* special case for the first coef. no need to add a second vlc table */
UPDATE_CACHE(re, &s->gb); UPDATE_CACHE(re, &s->gb);
v= SHOW_UBITS(re, &s->gb, 2); if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
if (v & 2) {
LAST_SKIP_BITS(re, &s->gb, 2);
level= (3*qscale*quant_matrix[0])>>5; level= (3*qscale*quant_matrix[0])>>5;
level= (level-1)|1; level= (level-1)|1;
if(v&1) if(GET_CACHE(re, &s->gb)&0x40000000)
level= -level; level= -level;
block[0] = level; block[0] = level;
i++; 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 */ /* now quantify & encode AC coefs */
for(;;) { for(;;) {
UPDATE_CACHE(re, &s->gb);
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
if(level == 127){ if(level != 0) {
break;
} else if(level != 0) {
i += run; i += run;
j = scantable[i]; j = scantable[i];
level= ((level*2+1)*qscale*quant_matrix[j])>>5; level= ((level*2+1)*qscale*quant_matrix[j])>>5;
level= (level-1)|1; level= (level-1)|1;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 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 { } else {
/* escape */ /* escape */
run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
UPDATE_CACHE(re, &s->gb); UPDATE_CACHE(re, &s->gb);
level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
if (level == -128) { 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) { } 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; i += run;
j = scantable[i]; j = scantable[i];
@ -1622,7 +1619,12 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
} }
block[j] = 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); CLOSE_READER(re, &s->gb);
} }
s->block_last_index[n] = i; s->block_last_index[n] = i;
@ -1637,45 +1639,42 @@ static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *bloc
const int qscale= s->qscale; const int qscale= s->qscale;
{ {
int v;
OPEN_READER(re, &s->gb); OPEN_READER(re, &s->gb);
i = -1; i = -1;
/* special case for the first coef. no need to add a second vlc table */ /* special case for the first coef. no need to add a second vlc table */
UPDATE_CACHE(re, &s->gb); UPDATE_CACHE(re, &s->gb);
v= SHOW_UBITS(re, &s->gb, 2); if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
if (v & 2) {
LAST_SKIP_BITS(re, &s->gb, 2);
level= (3*qscale)>>1; level= (3*qscale)>>1;
level= (level-1)|1; level= (level-1)|1;
if(v&1) if(GET_CACHE(re, &s->gb)&0x40000000)
level= -level; level= -level;
block[0] = level; block[0] = level;
i++; 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 */ /* now quantify & encode AC coefs */
for(;;) { for(;;) {
UPDATE_CACHE(re, &s->gb);
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
if(level == 127){ if(level != 0) {
break;
} else if(level != 0) {
i += run; i += run;
j = scantable[i]; j = scantable[i];
level= ((level*2+1)*qscale)>>1; level= ((level*2+1)*qscale)>>1;
level= (level-1)|1; level= (level-1)|1;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 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 { } else {
/* escape */ /* escape */
run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
UPDATE_CACHE(re, &s->gb); UPDATE_CACHE(re, &s->gb);
level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
if (level == -128) { 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) { } 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; i += run;
j = scantable[i]; j = scantable[i];
@ -1691,7 +1690,12 @@ static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *bloc
} }
block[j] = 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); CLOSE_READER(re, &s->gb);
} }
s->block_last_index[n] = i; s->block_last_index[n] = i;
@ -1713,7 +1717,6 @@ static inline int mpeg2_decode_block_non_intra(MpegEncContext *s,
mismatch = 1; mismatch = 1;
{ {
int v;
OPEN_READER(re, &s->gb); OPEN_READER(re, &s->gb);
i = -1; i = -1;
if (n < 4) if (n < 4)
@ -1723,30 +1726,28 @@ static inline int mpeg2_decode_block_non_intra(MpegEncContext *s,
/* special case for the first coef. no need to add a second vlc table */ /* special case for the first coef. no need to add a second vlc table */
UPDATE_CACHE(re, &s->gb); UPDATE_CACHE(re, &s->gb);
v= SHOW_UBITS(re, &s->gb, 2); if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
if (v & 2) {
LAST_SKIP_BITS(re, &s->gb, 2);
level= (3*qscale*quant_matrix[0])>>5; level= (3*qscale*quant_matrix[0])>>5;
if(v&1) if(GET_CACHE(re, &s->gb)&0x40000000)
level= -level; level= -level;
block[0] = level; block[0] = level;
mismatch ^= level; mismatch ^= level;
i++; 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 */ /* now quantify & encode AC coefs */
for(;;) { for(;;) {
UPDATE_CACHE(re, &s->gb);
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
if(level == 127){ if(level != 0) {
break;
} else if(level != 0) {
i += run; i += run;
j = scantable[i]; j = scantable[i];
level= ((level*2+1)*qscale*quant_matrix[j])>>5; level= ((level*2+1)*qscale*quant_matrix[j])>>5;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 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 { } else {
/* escape */ /* escape */
run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
@ -1769,7 +1770,12 @@ static inline int mpeg2_decode_block_non_intra(MpegEncContext *s,
mismatch ^= level; mismatch ^= level;
block[j] = 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); CLOSE_READER(re, &s->gb);
} }
block[63] ^= (mismatch & 1); block[63] ^= (mismatch & 1);
@ -1792,29 +1798,27 @@ static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s,
/* special case for the first coef. no need to add a second vlc table */ /* special case for the first coef. no need to add a second vlc table */
UPDATE_CACHE(re, &s->gb); UPDATE_CACHE(re, &s->gb);
v= SHOW_UBITS(re, &s->gb, 2); if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
if (v & 2) {
LAST_SKIP_BITS(re, &s->gb, 2);
level= (3*qscale)>>1; level= (3*qscale)>>1;
if(v&1) if(GET_CACHE(re, &s->gb)&0x40000000)
level= -level; level= -level;
block[0] = level; block[0] = level;
i++; 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 */ /* now quantify & encode AC coefs */
for(;;) { for(;;) {
UPDATE_CACHE(re, &s->gb);
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
if(level == 127){ if(level != 0) {
break;
} else if(level != 0) {
i += run; i += run;
j = scantable[i]; j = scantable[i];
level= ((level*2+1)*qscale)>>1; level= ((level*2+1)*qscale)>>1;
level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 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 { } else {
/* escape */ /* escape */
run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
@ -1832,7 +1836,12 @@ static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s,
} }
block[j] = 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); CLOSE_READER(re, &s->gb);
s->block_last_index[n] = i; s->block_last_index[n] = i;
return 0; return 0;

Loading…
Cancel
Save