Update lossless encoder strategy:
Don't use any other transform when using palette. Change-Id: I488ac546869677f1b6e4eed80e973569c757e997
This commit is contained in:
parent
0e6fa06595
commit
149b5098a9
@ -126,22 +126,23 @@ static int AnalyzeEntropy(const uint32_t const *argb, int xsize, int ysize,
|
|||||||
|
|
||||||
static int VP8LEncAnalyze(VP8LEncoder* const enc) {
|
static int VP8LEncAnalyze(VP8LEncoder* const enc) {
|
||||||
const WebPPicture* const pic = enc->pic_;
|
const WebPPicture* const pic = enc->pic_;
|
||||||
int non_pred_entropy, pred_entropy;
|
|
||||||
assert(pic && pic->argb);
|
assert(pic && pic->argb);
|
||||||
|
|
||||||
if (!AnalyzeEntropy(pic->argb, pic->width, pic->height,
|
|
||||||
&non_pred_entropy, &pred_entropy)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (8 * pred_entropy < 7 * non_pred_entropy) {
|
|
||||||
enc->use_predict_ = 1;
|
|
||||||
enc->use_cross_color_ = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
enc->use_palette_ =
|
enc->use_palette_ =
|
||||||
AnalyzeAndCreatePalette(pic->argb, pic->width * pic->height,
|
AnalyzeAndCreatePalette(pic->argb, pic->width * pic->height,
|
||||||
enc->palette_, &enc->palette_size_);
|
enc->palette_, &enc->palette_size_);
|
||||||
|
if (!enc->use_palette_) {
|
||||||
|
int non_pred_entropy, pred_entropy;
|
||||||
|
if (!AnalyzeEntropy(pic->argb, pic->width, pic->height,
|
||||||
|
&non_pred_entropy, &pred_entropy)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (8 * pred_entropy < 7 * non_pred_entropy) {
|
||||||
|
enc->use_predict_ = 1;
|
||||||
|
enc->use_cross_color_ = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -865,32 +866,34 @@ static int EncodeImageInternal(VP8LBitWriter* const bw,
|
|||||||
static int EvalAndApplySubtractGreen(VP8LBitWriter* const bw,
|
static int EvalAndApplySubtractGreen(VP8LBitWriter* const bw,
|
||||||
VP8LEncoder* const enc,
|
VP8LEncoder* const enc,
|
||||||
int width, int height) {
|
int width, int height) {
|
||||||
int i;
|
if (!enc->use_palette_) {
|
||||||
VP8LHistogram* before = NULL;
|
int i;
|
||||||
// Check if it would be a good idea to subtract green from red and blue.
|
VP8LHistogram* before = NULL;
|
||||||
VP8LHistogram* after = (VP8LHistogram*)malloc(2 * sizeof(*after));
|
// Check if it would be a good idea to subtract green from red and blue.
|
||||||
if (after == NULL) return 0;
|
VP8LHistogram* after = (VP8LHistogram*)malloc(2 * sizeof(*after));
|
||||||
before = after + 1;
|
if (after == NULL) return 0;
|
||||||
|
before = after + 1;
|
||||||
|
|
||||||
VP8LHistogramInit(before, 1);
|
VP8LHistogramInit(before, 1);
|
||||||
VP8LHistogramInit(after, 1);
|
VP8LHistogramInit(after, 1);
|
||||||
for (i = 0; i < width * height; ++i) {
|
for (i = 0; i < width * height; ++i) {
|
||||||
// We only impact entropy in red and blue components, don't bother
|
// We only impact entropy in red and blue components, don't bother
|
||||||
// to look at others.
|
// to look at others.
|
||||||
const uint32_t c = enc->argb_[i];
|
const uint32_t c = enc->argb_[i];
|
||||||
const int green = (c >> 8) & 0xff;
|
const int green = (c >> 8) & 0xff;
|
||||||
++(before->red_[(c >> 16) & 0xff]);
|
++(before->red_[(c >> 16) & 0xff]);
|
||||||
++(before->blue_[c & 0xff]);
|
++(before->blue_[c & 0xff]);
|
||||||
++(after->red_[((c >> 16) - green) & 0xff]);
|
++(after->red_[((c >> 16) - green) & 0xff]);
|
||||||
++(after->blue_[(c - green) & 0xff]);
|
++(after->blue_[(c - green) & 0xff]);
|
||||||
|
}
|
||||||
|
// Check if subtracting green yields low entropy.
|
||||||
|
if (VP8LHistogramEstimateBits(after) < VP8LHistogramEstimateBits(before)) {
|
||||||
|
VP8LWriteBits(bw, 1, 1);
|
||||||
|
VP8LWriteBits(bw, 2, 2);
|
||||||
|
VP8LSubtractGreenFromBlueAndRed(enc->argb_, width * height);
|
||||||
|
}
|
||||||
|
free(after);
|
||||||
}
|
}
|
||||||
// Check if subtracting green yields low entropy.
|
|
||||||
if (VP8LHistogramEstimateBits(after) < VP8LHistogramEstimateBits(before)) {
|
|
||||||
VP8LWriteBits(bw, 1, 1);
|
|
||||||
VP8LWriteBits(bw, 2, 2);
|
|
||||||
VP8LSubtractGreenFromBlueAndRed(enc->argb_, width * height);
|
|
||||||
}
|
|
||||||
free(after);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user