// 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. // ----------------------------------------------------------------------------- // // Paginated token buffer // // A 'token' is a bit value associated with a probability, either fixed // or a later-to-be-determined after statistics have been collected. // For dynamic probability, we just record the slot id (idx) for the probability // value in the final probability array (uint8_t* probas in VP8EmitTokens). // // Author: Skal ([email protected]) #include <assert.h> #include <stdlib.h> #include <string.h> #include "src/enc/cost_enc.h" #include "src/enc/vp8i_enc.h" #include "src/utils/utils.h" #if !defined(DISABLE_TOKEN_BUFFER) // we use pages to reduce the number of memcpy() #define MIN_PAGE_SIZE … #define FIXED_PROBA_BIT … token_t; // bit #15: bit value // bit #14: flags for constant proba or idx // bits #0..13: slot or constant proba struct VP8Tokens { … }; // Token data is located in memory just after the next_ field. // This macro is used to return their address and hide the trick. #define TOKEN_DATA(p) … //------------------------------------------------------------------------------ void VP8TBufferInit(VP8TBuffer* const b, int page_size) { … } void VP8TBufferClear(VP8TBuffer* const b) { … } static int TBufferNewPage(VP8TBuffer* const b) { … } //------------------------------------------------------------------------------ #define TOKEN_ID … static WEBP_INLINE uint32_t AddToken(VP8TBuffer* const b, uint32_t bit, uint32_t proba_idx, proba_t* const stats) { … } static WEBP_INLINE void AddConstantToken(VP8TBuffer* const b, uint32_t bit, uint32_t proba) { … } int VP8RecordCoeffTokens(int ctx, const struct VP8Residual* const res, VP8TBuffer* const tokens) { … } #undef TOKEN_ID //------------------------------------------------------------------------------ // Final coding pass, with known probabilities int VP8EmitTokens(VP8TBuffer* const b, VP8BitWriter* const bw, const uint8_t* const probas, int final_pass) { … } // Size estimation size_t VP8EstimateTokenSize(VP8TBuffer* const b, const uint8_t* const probas) { … } //------------------------------------------------------------------------------ #else // DISABLE_TOKEN_BUFFER void VP8TBufferInit(VP8TBuffer* const b, int page_size) { (void)b; (void)page_size; } void VP8TBufferClear(VP8TBuffer* const b) { (void)b; } #endif // !DISABLE_TOKEN_BUFFER