mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-28 14:38:21 +01:00
Use the plane code and not the distance when computing statistics.
As backward references use the plane code when checking the cost of a distance, statistics used to compute the cost should use it too. This provides a small compression improvement at no speed cost. Change-Id: Icade150929ee39ef6dc0d8b1fc85973086ecf41d
This commit is contained in:
parent
b903b80c30
commit
f209a5481e
@ -58,13 +58,21 @@ static void ConvertPopulationCountTableToBitEstimates(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CostModelBuild(CostModel* const m, int cache_bits,
|
static int CostModelBuild(CostModel* const m, int xsize, int cache_bits,
|
||||||
const VP8LBackwardRefs* const refs) {
|
const VP8LBackwardRefs* const refs) {
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
|
VP8LRefsCursor c = VP8LRefsCursorInit(refs);
|
||||||
VP8LHistogram* const histo = VP8LAllocateHistogram(cache_bits);
|
VP8LHistogram* const histo = VP8LAllocateHistogram(cache_bits);
|
||||||
if (histo == NULL) goto Error;
|
if (histo == NULL) goto Error;
|
||||||
|
|
||||||
VP8LHistogramCreate(histo, refs, cache_bits);
|
// The following code is similar to VP8LHistogramCreate but converts the
|
||||||
|
// distance to plane code.
|
||||||
|
VP8LHistogramInit(histo, cache_bits);
|
||||||
|
while (VP8LRefsCursorOk(&c)) {
|
||||||
|
VP8LHistogramAddSinglePixOrCopy(histo, c.cur_pos, VP8LDistanceToPlaneCode,
|
||||||
|
xsize);
|
||||||
|
VP8LRefsCursorNext(&c);
|
||||||
|
}
|
||||||
|
|
||||||
ConvertPopulationCountTableToBitEstimates(
|
ConvertPopulationCountTableToBitEstimates(
|
||||||
VP8LHistogramNumCodes(histo->palette_code_bits_),
|
VP8LHistogramNumCodes(histo->palette_code_bits_),
|
||||||
@ -583,7 +591,7 @@ static int BackwardReferencesHashChainDistanceOnly(
|
|||||||
if (!cc_init) goto Error;
|
if (!cc_init) goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CostModelBuild(cost_model, cache_bits, refs)) {
|
if (!CostModelBuild(cost_model, xsize, cache_bits, refs)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ void VP8LHistogramStoreRefs(const VP8LBackwardRefs* const refs,
|
|||||||
VP8LHistogram* const histo) {
|
VP8LHistogram* const histo) {
|
||||||
VP8LRefsCursor c = VP8LRefsCursorInit(refs);
|
VP8LRefsCursor c = VP8LRefsCursorInit(refs);
|
||||||
while (VP8LRefsCursorOk(&c)) {
|
while (VP8LRefsCursorOk(&c)) {
|
||||||
VP8LHistogramAddSinglePixOrCopy(histo, c.cur_pos);
|
VP8LHistogramAddSinglePixOrCopy(histo, c.cur_pos, NULL, 0);
|
||||||
VP8LRefsCursorNext(&c);
|
VP8LRefsCursorNext(&c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -138,7 +138,9 @@ VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits) {
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
|
void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
|
||||||
const PixOrCopy* const v) {
|
const PixOrCopy* const v,
|
||||||
|
int (*const distance_modifier)(int, int),
|
||||||
|
int distance_modifier_arg0) {
|
||||||
if (PixOrCopyIsLiteral(v)) {
|
if (PixOrCopyIsLiteral(v)) {
|
||||||
++histo->alpha_[PixOrCopyLiteral(v, 3)];
|
++histo->alpha_[PixOrCopyLiteral(v, 3)];
|
||||||
++histo->red_[PixOrCopyLiteral(v, 2)];
|
++histo->red_[PixOrCopyLiteral(v, 2)];
|
||||||
@ -152,7 +154,13 @@ void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
|
|||||||
int code, extra_bits;
|
int code, extra_bits;
|
||||||
VP8LPrefixEncodeBits(PixOrCopyLength(v), &code, &extra_bits);
|
VP8LPrefixEncodeBits(PixOrCopyLength(v), &code, &extra_bits);
|
||||||
++histo->literal_[NUM_LITERAL_CODES + code];
|
++histo->literal_[NUM_LITERAL_CODES + code];
|
||||||
|
if (distance_modifier == NULL) {
|
||||||
VP8LPrefixEncodeBits(PixOrCopyDistance(v), &code, &extra_bits);
|
VP8LPrefixEncodeBits(PixOrCopyDistance(v), &code, &extra_bits);
|
||||||
|
} else {
|
||||||
|
VP8LPrefixEncodeBits(
|
||||||
|
distance_modifier(distance_modifier_arg0, PixOrCopyDistance(v)),
|
||||||
|
&code, &extra_bits);
|
||||||
|
}
|
||||||
++histo->distance_[code];
|
++histo->distance_[code];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -473,7 +481,7 @@ static void HistogramBuild(
|
|||||||
while (VP8LRefsCursorOk(&c)) {
|
while (VP8LRefsCursorOk(&c)) {
|
||||||
const PixOrCopy* const v = c.cur_pos;
|
const PixOrCopy* const v = c.cur_pos;
|
||||||
const int ix = (y >> histo_bits) * histo_xsize + (x >> histo_bits);
|
const int ix = (y >> histo_bits) * histo_xsize + (x >> histo_bits);
|
||||||
VP8LHistogramAddSinglePixOrCopy(histograms[ix], v);
|
VP8LHistogramAddSinglePixOrCopy(histograms[ix], v, NULL, 0);
|
||||||
x += PixOrCopyLength(v);
|
x += PixOrCopyLength(v);
|
||||||
while (x >= xsize) {
|
while (x >= xsize) {
|
||||||
x -= xsize;
|
x -= xsize;
|
||||||
|
@ -90,7 +90,9 @@ VP8LHistogram* VP8LAllocateHistogram(int cache_bits);
|
|||||||
|
|
||||||
// Accumulate a token 'v' into a histogram.
|
// Accumulate a token 'v' into a histogram.
|
||||||
void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
|
void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
|
||||||
const PixOrCopy* const v);
|
const PixOrCopy* const v,
|
||||||
|
int (*const distance_modifier)(int, int),
|
||||||
|
int distance_modifier_arg0);
|
||||||
|
|
||||||
static WEBP_INLINE int VP8LHistogramNumCodes(int palette_code_bits) {
|
static WEBP_INLINE int VP8LHistogramNumCodes(int palette_code_bits) {
|
||||||
return NUM_LITERAL_CODES + NUM_LENGTH_CODES +
|
return NUM_LITERAL_CODES + NUM_LENGTH_CODES +
|
||||||
|
Loading…
Reference in New Issue
Block a user