// Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Alpha-plane compression. // // Author: Skal ([email protected]) #include <assert.h> #include <stdlib.h> #include <string.h> #include "src/enc/vp8i_enc.h" #include "src/dsp/dsp.h" #include "src/utils/filters_utils.h" #include "src/utils/quant_levels_utils.h" #include "src/utils/utils.h" #include "src/webp/encode.h" #include "src/webp/format_constants.h" // ----------------------------------------------------------------------------- // Encodes the given alpha data via specified compression method 'method'. // The pre-processing (quantization) is performed if 'quality' is less than 100. // For such cases, the encoding is lossy. The valid range is [0, 100] for // 'quality' and [0, 1] for 'method': // 'method = 0' - No compression; // 'method = 1' - Use lossless coder on the alpha plane only // 'filter' values [0, 4] correspond to prediction modes none, horizontal, // vertical & gradient filters. The prediction mode 4 will try all the // prediction modes 0 to 3 and pick the best one. // 'effort_level': specifies how much effort must be spent to try and reduce // the compressed output size. In range 0 (quick) to 6 (slow). // // 'output' corresponds to the buffer containing compressed alpha data. // This buffer is allocated by this method and caller should call // WebPSafeFree(*output) when done. // 'output_size' corresponds to size of this compressed alpha buffer. // // Returns 1 on successfully encoding the alpha and // 0 if either: // invalid quality or method, or // memory allocation for the compressed data fails. #include "src/enc/vp8li_enc.h" static int EncodeLossless(const uint8_t* const data, int width, int height, int effort_level, // in [0..6] range int use_quality_100, VP8LBitWriter* const bw, WebPAuxStats* const stats) { … } // ----------------------------------------------------------------------------- // Small struct to hold the result of a filter mode compression attempt. FilterTrial; // This function always returns an initialized 'bw' object, even upon error. static int EncodeAlphaInternal(const uint8_t* const data, int width, int height, int method, int filter, int reduce_levels, int effort_level, // in [0..6] range uint8_t* const tmp_alpha, FilterTrial* result) { … } // ----------------------------------------------------------------------------- static int GetNumColors(const uint8_t* data, int width, int height, int stride) { … } #define FILTER_TRY_NONE … #define FILTER_TRY_ALL … // Given the input 'filter' option, return an OR'd bit-set of filters to try. static uint32_t GetFilterMap(const uint8_t* alpha, int width, int height, int filter, int effort_level) { … } static void InitFilterTrial(FilterTrial* const score) { … } static int ApplyFiltersAndEncode(const uint8_t* alpha, int width, int height, size_t data_size, int method, int filter, int reduce_levels, int effort_level, uint8_t** const output, size_t* const output_size, WebPAuxStats* const stats) { … } static int EncodeAlpha(VP8Encoder* const enc, int quality, int method, int filter, int effort_level, uint8_t** const output, size_t* const output_size) { … } //------------------------------------------------------------------------------ // Main calls static int CompressAlphaJob(void* arg1, void* unused) { … } void VP8EncInitAlpha(VP8Encoder* const enc) { … } int VP8EncStartAlpha(VP8Encoder* const enc) { … } int VP8EncFinishAlpha(VP8Encoder* const enc) { … } int VP8EncDeleteAlpha(VP8Encoder* const enc) { … }