[Ffmpeg-cvslog] CVS: ffmpeg/libavcodec mpeg12.c,1.230,1.231
Michael Niedermayer CVS
michael
Tue Apr 19 13:37:03 CEST 2005
Update of /cvsroot/ffmpeg/ffmpeg/libavcodec
In directory mail:/var2/tmp/cvs-serv8568
Modified Files:
mpeg12.c
Log Message:
optimizing non_intra ac coeff decode
Index: mpeg12.c
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/mpeg12.c,v
retrieving revision 1.230
retrieving revision 1.231
diff -u -d -r1.230 -r1.231
--- mpeg12.c 18 Apr 2005 20:07:48 -0000 1.230
+++ mpeg12.c 19 Apr 2005 11:37:01 -0000 1.231
@@ -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;
More information about the ffmpeg-cvslog
mailing list