Update lossless encoder strategy:

Don't use any other transform when using palette.

Change-Id: I488ac546869677f1b6e4eed80e973569c757e997
This commit is contained in:
Urvang Joshi 2012-04-23 18:23:18 +00:00 committed by James Zern
parent 0e6fa06595
commit 149b5098a9

View File

@ -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;
} }