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