mirror of
https://github.com/webmproject/libwebp.git
synced 2025-07-14 21:09:55 +02:00
use DC error diffusion for U/V at low-quality
This fixes some color smearing due to heavy quantization. This is only enabled for q <= 30 (cf ERROR_DIFFUSION_QUALITY) Change-Id: I07e83a4d38461357a32c9e214f7eadc6db73baa9
This commit is contained in:
@ -159,12 +159,15 @@ static VP8Encoder* InitVP8Encoder(const WebPConfig* const config,
|
||||
+ WEBP_ALIGN_CST; // align all
|
||||
const size_t lf_stats_size =
|
||||
config->autofilter ? sizeof(*enc->lf_stats_) + WEBP_ALIGN_CST : 0;
|
||||
const size_t top_derr_size = (config->quality <= ERROR_DIFFUSION_QUALITY) ?
|
||||
mb_w * sizeof(*enc->top_derr_) : 0;
|
||||
uint8_t* mem;
|
||||
const uint64_t size = (uint64_t)sizeof(*enc) // main struct
|
||||
+ WEBP_ALIGN_CST // cache alignment
|
||||
+ info_size // modes info
|
||||
+ preds_size // prediction modes
|
||||
+ samples_size // top/left samples
|
||||
+ top_derr_size // top diffusion error
|
||||
+ nz_size // coeff context bits
|
||||
+ lf_stats_size; // autofilter stats
|
||||
|
||||
@ -175,11 +178,12 @@ static VP8Encoder* InitVP8Encoder(const WebPConfig* const config,
|
||||
" info: %ld\n"
|
||||
" preds: %ld\n"
|
||||
" top samples: %ld\n"
|
||||
" top diffusion: %ld\n"
|
||||
" non-zero: %ld\n"
|
||||
" lf-stats: %ld\n"
|
||||
" total: %ld\n",
|
||||
sizeof(*enc) + WEBP_ALIGN_CST, info_size,
|
||||
preds_size, samples_size, nz_size, lf_stats_size, size);
|
||||
preds_size, samples_size, top_derr_size, nz_size, lf_stats_size, size);
|
||||
printf("Transient object sizes:\n"
|
||||
" VP8EncIterator: %ld\n"
|
||||
" VP8ModeScore: %ld\n"
|
||||
@ -219,6 +223,8 @@ static VP8Encoder* InitVP8Encoder(const WebPConfig* const config,
|
||||
enc->y_top_ = mem;
|
||||
enc->uv_top_ = enc->y_top_ + top_stride;
|
||||
mem += 2 * top_stride;
|
||||
enc->top_derr_ = top_derr_size ? (DError*)mem : NULL;
|
||||
mem += top_derr_size;
|
||||
assert(mem <= (uint8_t*)enc + size);
|
||||
|
||||
enc->config_ = config;
|
||||
|
Reference in New Issue
Block a user