mirror of
https://github.com/webmproject/libwebp.git
synced 2025-07-13 14:34:33 +02:00
Merge branch 'lossless_encoder'
* lossless_encoder: (46 commits) split StoreHuffmanCode() into smaller functions more consolidation: introduce VP8LHistogramSet big code clean-up and refactoring and optimization Some cosmetics in histogram.c Approximate FastLog between value range [256, 8192] Forgot to update out_bit_costs to symbol_bit_costs at one instance. Evaluate output cluster's bit_costs once in HistogramRefine. Simple Huffman code changes. Lossless decoder: remove an unneeded param in ReadHuffmanCodeLengths(). Reducing emerging palette size from 11 to 9 bits. Move GetHistImageSymbols to histogram.c Improve predict vs no-predict heuristic. code-moving and clean-up reduce memory usage by allocating only one histo Restrict histo_bits to ensure histo_image size is under 32MB further simplification for the meta-Huffman coding A quick pass of cleanup in backward reference code Make transform bits a function of encode method (-m). introduce -lossless option, protected by USE_LOSSLESS_ENCODER Run TraceBackwards for higher qualities. ... Conflicts: src/enc/webpenc.c Change-Id: I9a5d98cba0889ea91d10699466939cc283da345a
This commit is contained in:
@ -15,6 +15,7 @@
|
||||
#include <math.h>
|
||||
|
||||
#include "./vp8enci.h"
|
||||
#include "./vp8li.h"
|
||||
|
||||
// #define PRINT_MEMORY_INFO
|
||||
|
||||
@ -142,8 +143,8 @@ static void MapConfigToTools(VP8Encoder* const enc) {
|
||||
// LFStats: 2048
|
||||
// Picture size (yuv): 589824
|
||||
|
||||
static VP8Encoder* InitEncoder(const WebPConfig* const config,
|
||||
WebPPicture* const picture) {
|
||||
static VP8Encoder* InitVP8Encoder(const WebPConfig* const config,
|
||||
WebPPicture* const picture) {
|
||||
const int use_filter =
|
||||
(config->filter_strength > 0) || (config->autofilter > 0);
|
||||
const int mb_w = (picture->width + 15) >> 4;
|
||||
@ -259,7 +260,7 @@ static VP8Encoder* InitEncoder(const WebPConfig* const config,
|
||||
return enc;
|
||||
}
|
||||
|
||||
static void DeleteEncoder(VP8Encoder* enc) {
|
||||
static void DeleteVP8Encoder(VP8Encoder* enc) {
|
||||
if (enc != NULL) {
|
||||
VP8EncDeleteAlpha(enc);
|
||||
#ifdef WEBP_EXPERIMENTAL_FEATURES
|
||||
@ -327,7 +328,6 @@ int WebPReportProgress(VP8Encoder* const enc, int percent) {
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
int WebPEncode(const WebPConfig* const config, WebPPicture* const pic) {
|
||||
VP8Encoder* enc;
|
||||
int ok;
|
||||
|
||||
if (pic == NULL)
|
||||
@ -339,27 +339,40 @@ int WebPEncode(const WebPConfig* const config, WebPPicture* const pic) {
|
||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
||||
if (pic->width <= 0 || pic->height <= 0)
|
||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||
if (pic->y == NULL || pic->u == NULL || pic->v == NULL)
|
||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER);
|
||||
if (pic->width > WEBP_MAX_DIMENSION || pic->height > WEBP_MAX_DIMENSION)
|
||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||
|
||||
enc = InitEncoder(config, pic);
|
||||
if (enc == NULL) return 0; // pic->error is already set.
|
||||
// Note: each of the tasks below account for 20% in the progress report.
|
||||
ok = VP8EncAnalyze(enc)
|
||||
&& VP8StatLoop(enc)
|
||||
&& VP8EncLoop(enc)
|
||||
&& VP8EncFinishAlpha(enc)
|
||||
if (!config->lossless) {
|
||||
VP8Encoder* enc = NULL;
|
||||
if (pic->y == NULL || pic->u == NULL || pic->v == NULL)
|
||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER);
|
||||
|
||||
enc = InitVP8Encoder(config, pic);
|
||||
if (enc == NULL) return 0; // pic->error is already set.
|
||||
// Note: each of the tasks below account for 20% in the progress report.
|
||||
ok = VP8EncAnalyze(enc)
|
||||
&& VP8StatLoop(enc)
|
||||
&& VP8EncLoop(enc)
|
||||
&& VP8EncFinishAlpha(enc)
|
||||
#ifdef WEBP_EXPERIMENTAL_FEATURES
|
||||
&& VP8EncFinishLayer(enc)
|
||||
&& VP8EncFinishLayer(enc)
|
||||
#endif
|
||||
&& VP8EncWrite(enc);
|
||||
StoreStats(enc);
|
||||
if (!ok) {
|
||||
VP8EncFreeBitWriters(enc);
|
||||
}
|
||||
DeleteVP8Encoder(enc);
|
||||
} else {
|
||||
#ifdef USE_LOSSLESS_ENCODER
|
||||
if (pic->argb == NULL)
|
||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER);
|
||||
|
||||
ok = VP8LEncodeImage(config, pic); // Sets pic->error in case of problem.
|
||||
#else
|
||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
||||
#endif
|
||||
&& VP8EncWrite(enc);
|
||||
StoreStats(enc);
|
||||
if (!ok) {
|
||||
VP8EncFreeBitWriters(enc);
|
||||
}
|
||||
DeleteEncoder(enc);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
Reference in New Issue
Block a user