mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-06-19 19:03:00 +02:00
avcodec/mpeg12dec: Optimize mpeg1_decode_block_intra()
sandybridge i7 274->260 cycles Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
+14
-7
@@ -142,29 +142,30 @@ static inline int mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, in
|
|||||||
i = 0;
|
i = 0;
|
||||||
{
|
{
|
||||||
OPEN_READER(re, &s->gb);
|
OPEN_READER(re, &s->gb);
|
||||||
|
UPDATE_CACHE(re, &s->gb);
|
||||||
|
if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
|
||||||
|
goto end;
|
||||||
|
|
||||||
/* now quantify & encode AC coefficients */
|
/* now quantify & encode AC coefficients */
|
||||||
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 * qscale * quant_matrix[j]) >> 4;
|
level = (level * qscale * quant_matrix[j]) >> 4;
|
||||||
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];
|
||||||
@@ -184,7 +185,13 @@ static inline int mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user