diff --git a/vp8/dixie/bool_decoder.c b/vp8/dixie/bool_decoder.c deleted file mode 100644 index bda52d2a2d8867fa3735aa055b18015188deef88..0000000000000000000000000000000000000000 --- a/vp8/dixie/bool_decoder.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license and patent - * grant that can be found in the LICENSE file in the root of the source - * tree. All contributing project authors may be found in the AUTHORS - * file in the root of the source tree. - */ -#include "bool_decoder.h" -#include "vpx_ports/mem.h" - - -DECLARE_ALIGNED(16, const unsigned int, vp8dx_bool_norm[256]) = -{ - 0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - - -int vp8dx_bool_init(struct bool_decoder *br, const unsigned char *source, - unsigned int source_sz) -{ - br->user_buffer_end = source + source_sz; - br->user_buffer = source; - br->value = 0; - br->count = -8; - br->range = 255; - - if (source_sz && !source) - return 1; - - /* Populate the buffer */ - vp8dx_bool_fill(br); - - return 0; -} - - -void vp8dx_bool_fill(struct bool_decoder *br) -{ - const unsigned char *bufptr; - const unsigned char *bufend; - vp8_bool_value_t value; - int count; - bufend = br->user_buffer_end; - bufptr = br->user_buffer; - value = br->value; - count = br->count; - - VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend); - - br->user_buffer = bufptr; - br->value = value; - br->count = count; -} diff --git a/vp8/dixie/bool_decoder.h b/vp8/dixie/bool_decoder.h index bda472f278d59f1fb943bc26408269fe01fbccdc..53a2dc1b9fbabdb8d5d0ab66921d3775a73ec592 100644 --- a/vp8/dixie/bool_decoder.h +++ b/vp8/dixie/bool_decoder.h @@ -11,104 +11,71 @@ #ifndef BOOL_DECODER_H #define BOOL_DECODER_H #include <stddef.h> -#include <limits.h> -#include "vpx_ports/config.h" -#include "vpx_ports/mem.h" - - -typedef size_t vp8_bool_value_t; -# define VP8_BD_VALUE_SIZE ((int)sizeof(vp8_bool_value_t)*CHAR_BIT) - - -/*This is meant to be a large, positive constant that can still be efficiently - loaded as an immediate (on platforms like ARM, for example). - Even relatively modest values like 100 would work fine.*/ -# define VP8_LOTS_OF_BITS (0x40000000) - - -DECLARE_ALIGNED(16, extern const unsigned int, vp8dx_bitreader_norm[256]); - struct bool_decoder { - const unsigned char *user_buffer_end; - const unsigned char *user_buffer; - vp8_bool_value_t value; - int count; - unsigned int range; + const unsigned char *input; /* pointer to next compressed data byte */ + size_t input_len; /* length of the input buffer */ + unsigned int range; /* always identical to encoder's range */ + unsigned int value; /* contains at least 8 significant bits */ + int bit_count; /* # of bits shifted out of value, max 7 */ }; -int vp8dx_bool_init(struct bool_decoder *br, const unsigned char *source, - unsigned int source_sz); - -void vp8dx_bool_fill(struct bool_decoder *br); - - -/*The refill loop is used in several places, so define it in a macro to make - sure they're all consistent. - An inline function would be cleaner, but has a significant penalty, because - multiple BOOL_DECODER fields must be modified, and the compiler is not smart - enough to eliminate the stores to those fields and the subsequent reloads - from them when inlining the function.*/ -#define VP8DX_BOOL_DECODER_FILL(_count,_value,_bufptr,_bufend) \ - do \ - { \ - int shift; \ - for(shift = VP8_BD_VALUE_SIZE - 8 - ((_count) + 8); shift >= 0; ) \ - { \ - if((_bufptr) >= (_bufend)) { \ - (_count) = VP8_LOTS_OF_BITS; \ - break; \ - } \ - (_count) += 8; \ - (_value) |= (vp8_bool_value_t)*(_bufptr)++ << shift; \ - shift -= 8; \ - } \ - } \ - while(0) - - -static int bool_get(struct bool_decoder *br, int probability) +static void +init_bool_decoder(struct bool_decoder *d, + const unsigned char *start_partition, + size_t sz) { - unsigned int bit = 0; - vp8_bool_value_t value; - unsigned int split; - vp8_bool_value_t bigsplit; - int count; - unsigned int range; - - value = br->value; - count = br->count; - range = br->range; - - split = 1 + (((range - 1) * probability) >> 8); - bigsplit = (vp8_bool_value_t)split << (VP8_BD_VALUE_SIZE - 8); - - range = split; - - if (value >= bigsplit) + if(sz >= 2) { - range = br->range - split; - value = value - bigsplit; - bit = 1; + d->value = (start_partition[0] << 8) /* first 2 input bytes */ + | start_partition[1]; + d->input = start_partition + 2; /* ptr to next byte to be read */ + d->input_len = sz - 2; } - + else { - register unsigned int shift = vp8dx_bitreader_norm[range]; - range <<= shift; - value <<= shift; - count -= shift; + d->value = 0; + d->input = NULL; + d->input_len = 0; } + d->range = 255; /* initial range is full */ + d->bit_count = 0; /* have not yet shifted out any bits */ +} - br->value = value; - br->count = count; - br->range = range; - - if (count < 0) - vp8dx_bool_fill(br); - return bit; +static int bool_get(struct bool_decoder *d, int probability) +{ + /* range and split are identical to the corresponding values + used by the encoder when this bool was written */ + + unsigned int split = 1 + ( ((d->range - 1) * probability) >> 8); + unsigned int SPLIT = split << 8; + int retval; /* will be 0 or 1 */ + + if( d->value >= SPLIT) { /* encoded a one */ + retval = 1; + d->range -= split; /* reduce range */ + d->value -= SPLIT; /* subtract off left endpoint of interval */ + } else { /* encoded a zero */ + retval = 0; + d->range = split; /* reduce range, no change in left endpoint */ + } + + while( d->range < 128) { /* shift out irrelevant value bits */ + d->value <<= 1; + d->range <<= 1; + if( ++d->bit_count == 8) { /* shift in new bits 8 at a time */ + d->bit_count = 0; + if(d->input_len) + { + d->value |= *d->input++; + d->input_len--; + } + } + } + return retval; } @@ -148,18 +115,7 @@ static int bool_get_int(struct bool_decoder *br, int bits) static int bool_maybe_get_int(struct bool_decoder *br, int bits) { - int z = 0; - int bit; - - if (!bool_get_bit(br)) - return 0; - - for (bit = bits - 1; bit >= 0; bit--) - { - z |= (bool_get_bit(br) << bit); - } - - return bool_get_bit(br) ? -z : z; + return bool_get_bit(br) ? bool_get_int(br, bits) : 0; } diff --git a/vp8/dixie/dixie.c b/vp8/dixie/dixie.c index be3a6a92e205314e0328c89632e0b9ca53d7a0dc..e895f316e07ee2a4b4d0095cb5a89b5e52dae6c1 100644 --- a/vp8/dixie/dixie.c +++ b/vp8/dixie/dixie.c @@ -151,7 +151,7 @@ decode_and_init_token_partitions(struct vp8_decoder_ctx *ctx, for (i = 0; i < ctx->token_hdr.partitions; i++) { - vp8dx_bool_init(&ctx->tokens[i].bool, data, + init_bool_decoder(&ctx->tokens[i].bool, data, ctx->token_hdr.partition_sz[i]); data += ctx->token_hdr.partition_sz[i]; } @@ -332,7 +332,7 @@ decode_frame(struct vp8_decoder_ctx *ctx, } /* Start the bitreader for the header/entropy partition */ - vp8dx_bool_init(&bool, data, ctx->frame_hdr.part0_sz); + init_bool_decoder(&bool, data, ctx->frame_hdr.part0_sz); /* Skip the colorspace and clamping bits */ if (ctx->frame_hdr.is_keyframe) diff --git a/vp8/dixie/predict.c b/vp8/dixie/predict.c index 0a5f4cac629ccc191279b7cc453de13aeb581cc0..22fab6536e6262b4b741ca90d818a96a52f9bfe7 100644 --- a/vp8/dixie/predict.c +++ b/vp8/dixie/predict.c @@ -10,6 +10,7 @@ #include "dixie.h" #include "predict.h" #include "idct_add.h" +#include "vpx_ports/mem.h" #include <assert.h> #include <string.h> diff --git a/vp8/dixie/tokens.c b/vp8/dixie/tokens.c index 787aa202c2475c4d9ef79766210ea392d4a1c34d..89f1a3ea80f99ebff1524dfc02c769e92b8521fe 100644 --- a/vp8/dixie/tokens.c +++ b/vp8/dixie/tokens.c @@ -86,74 +86,23 @@ static const unsigned int zigzag[16] = 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 }; -#define FILL \ - if(count < 0) \ - VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend); - -#define NORMALIZE \ - /*if(range < 0x80)*/ \ - { \ - shift = vp8dx_bitreader_norm[range]; \ - range <<= shift; \ - value <<= shift; \ - count -= shift; \ - } - #define DECODE_AND_APPLYSIGN(value_to_sign) \ - split = (range + 1) >> 1; \ - bigsplit = (vp8_bool_value_t)split << (VP8_BD_VALUE_SIZE - 8); \ - FILL \ - if ( value < bigsplit ) \ - { \ - range = split; \ - v= value_to_sign; \ - } \ - else \ - { \ - range = range-split; \ - value = value-bigsplit; \ - v = -value_to_sign; \ - } \ - v *= dqf[!!c]; \ - range +=range; \ - value +=value; \ - count--; + v = (bool_get_bit(bool) ? -value_to_sign : value_to_sign) * dqf[!!c]; #define DECODE_AND_BRANCH_IF_ZERO(probability,branch) \ - { \ - split = 1 + ((( probability*(range-1) ) )>> 8); \ - bigsplit = (vp8_bool_value_t)split << (VP8_BD_VALUE_SIZE - 8); \ - FILL \ - if ( value < bigsplit ) \ - { \ - range = split; \ - NORMALIZE \ - goto branch; \ - } \ - value -= bigsplit; \ - range = range - split; \ - NORMALIZE \ - } + if (!bool_get(bool, probability)) goto branch; #define DECODE_AND_LOOP_IF_ZERO(probability,branch) \ + if (!bool_get(bool, probability)) \ { \ - split = 1 + ((( probability*(range-1) ) ) >> 8); \ - bigsplit = (vp8_bool_value_t)split << (VP8_BD_VALUE_SIZE - 8); \ - FILL \ - if ( value < bigsplit ) \ - { \ - range = split; \ - NORMALIZE \ - prob = type_probs; \ - if(c<15) {\ - ++c; \ - prob += bands_x[c]; \ - goto branch; \ - } goto BLOCK_FINISHED; /*for malformed input */\ - } \ - value -= bigsplit; \ - range = range - split; \ - NORMALIZE \ + prob = type_probs; \ + if(c<15) {\ + ++c; \ + prob += bands_x[c]; \ + goto branch; \ + }\ + else \ + goto BLOCK_FINISHED; /*for malformed input */\ } #define DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val) \ @@ -168,20 +117,7 @@ static const unsigned int zigzag[16] = #define DECODE_EXTRABIT_AND_ADJUST_VAL(t,bits_count)\ - split = 1 + (((range-1) * extrabits[t].probs[bits_count]) >> 8); \ - bigsplit = (vp8_bool_value_t)split << (VP8_BD_VALUE_SIZE - 8); \ - FILL \ - if(value >= bigsplit)\ - {\ - range = range-split;\ - value = value-bigsplit;\ - val += 1<<bits_count;\ - }\ - else\ - {\ - range = split;\ - }\ - NORMALIZE + val += bool_get(bool, extrabits[t].probs[bits_count]) << bits_count; static int @@ -202,16 +138,6 @@ decode_mb_tokens(struct bool_decoder *bool, unsigned char *prob; short *dqf; - /* Unpack bool decoder to local variables */ - const unsigned char *bufend = bool->user_buffer_end; - const unsigned char *bufptr = bool->user_buffer; - vp8_bool_value_t value = bool->value; - int count = bool->count; - unsigned int range = bool->range; - unsigned int split; - vp8_bool_value_t bigsplit; - unsigned int shift; - eob_mask = 0; if (mode != B_PRED && mode != SPLITMV) @@ -360,11 +286,6 @@ BLOCK_FINISHED: goto BLOCK_LOOP; } - FILL - bool->user_buffer = bufptr; - bool->value = value; - bool->count = count; - bool->range = range; return eob_mask; } diff --git a/vp8/vp8dx.mk b/vp8/vp8dx.mk index 7ae3875aed286e69481d8047c605cd5bfe864b11..a36bbfcc9cfbb62c3947da5a08df2388001f178b 100644 --- a/vp8/vp8dx.mk +++ b/vp8/vp8dx.mk @@ -27,7 +27,6 @@ VP8_DX_SRCS-$(CONFIG_DIXIE) += vp8_dixie_iface.c VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/bit_ops.h VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/dixie.h VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/dixie.c -VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/bool_decoder.c VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/bool_decoder.h VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/modemv.c VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/modemv.h