mirror of
https://github.com/webmproject/libwebp.git
synced 2025-02-13 15:32:53 +01:00
up to 6% faster encoding with clang compiler
mostly by revamping the main loop of GetResidualCost() and avoiding some branches Change-Id: Ib05763e18a6bf46c82dc3d5d1d8eb65e99474207
This commit is contained in:
parent
93402f02db
commit
42542be855
@ -292,31 +292,20 @@ static int GetResidualCost(int ctx0, const VP8Residual* const res) {
|
|||||||
if (res->last < 0) {
|
if (res->last < 0) {
|
||||||
return VP8BitCost(0, p0);
|
return VP8BitCost(0, p0);
|
||||||
}
|
}
|
||||||
cost = 0;
|
cost = VP8BitCost(1, p0);
|
||||||
while (n < res->last) {
|
for (; n < res->last; ++n) {
|
||||||
int v = res->coeffs[n];
|
const int v = abs(res->coeffs[n]);
|
||||||
const int b = VP8EncBands[n + 1];
|
const int b = VP8EncBands[n + 1];
|
||||||
++n;
|
const int ctx = (v >= 2) ? 2 : v;
|
||||||
if (v == 0) {
|
|
||||||
// short-case for VP8LevelCost(t, 0) (note: VP8LevelFixedCosts[0] == 0):
|
|
||||||
cost += t[0];
|
|
||||||
t = res->cost[b][0];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
v = abs(v);
|
|
||||||
cost += VP8BitCost(1, p0);
|
|
||||||
cost += VP8LevelCost(t, v);
|
cost += VP8LevelCost(t, v);
|
||||||
{
|
|
||||||
const int ctx = (v == 1) ? 1 : 2;
|
|
||||||
p0 = res->prob[b][ctx][0];
|
|
||||||
t = res->cost[b][ctx];
|
t = res->cost[b][ctx];
|
||||||
}
|
// the masking trick is faster than "if (v) cost += ..." with clang
|
||||||
|
cost += (v ? ~0U : 0) & VP8BitCost(1, res->prob[b][ctx][0]);
|
||||||
}
|
}
|
||||||
// Last coefficient is always non-zero
|
// Last coefficient is always non-zero
|
||||||
{
|
{
|
||||||
const int v = abs(res->coeffs[n]);
|
const int v = abs(res->coeffs[n]);
|
||||||
assert(v != 0);
|
assert(v != 0);
|
||||||
cost += VP8BitCost(1, p0);
|
|
||||||
cost += VP8LevelCost(t, v);
|
cost += VP8LevelCost(t, v);
|
||||||
if (n < 15) {
|
if (n < 15) {
|
||||||
const int b = VP8EncBands[n + 1];
|
const int b = VP8EncBands[n + 1];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user