mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
optimizing non_intra ac coeff decode
Originally committed as revision 4140 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
6f921f3100
commit
29df259923
@ -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…
Reference in New Issue
Block a user