1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "dboolhuff.h" 12 #include "vp8/common/common.h" 13 #include "vpx_dsp/vpx_dsp_common.h" 14 15 int vp8dx_start_decode(BOOL_DECODER *br, const unsigned char *source, 16 unsigned int source_sz, vpx_decrypt_cb decrypt_cb, 17 void *decrypt_state) { 18 br->user_buffer_end = source + source_sz; 19 br->user_buffer = source; 20 br->value = 0; 21 br->count = -8; 22 br->range = 255; 23 br->decrypt_cb = decrypt_cb; 24 br->decrypt_state = decrypt_state; 25 26 if (source_sz && !source) return 1; 27 28 /* Populate the buffer */ 29 vp8dx_bool_decoder_fill(br); 30 31 return 0; 32 } 33 34 void vp8dx_bool_decoder_fill(BOOL_DECODER *br) { 35 const unsigned char *bufptr = br->user_buffer; 36 VP8_BD_VALUE value = br->value; 37 int count = br->count; 38 int shift = VP8_BD_VALUE_SIZE - CHAR_BIT - (count + CHAR_BIT); 39 size_t bytes_left = br->user_buffer_end - bufptr; 40 size_t bits_left = bytes_left * CHAR_BIT; 41 int x = shift + CHAR_BIT - (int)bits_left; 42 int loop_end = 0; 43 unsigned char decrypted[sizeof(VP8_BD_VALUE) + 1]; 44 45 if (br->decrypt_cb) { 46 size_t n = VPXMIN(sizeof(decrypted), bytes_left); 47 br->decrypt_cb(br->decrypt_state, bufptr, decrypted, (int)n); 48 bufptr = decrypted; 49 } 50 51 if (x >= 0) { 52 count += VP8_LOTS_OF_BITS; 53 loop_end = x; 54 } 55 56 if (x < 0 || bits_left) { 57 while (shift >= loop_end) { 58 count += CHAR_BIT; 59 value |= (VP8_BD_VALUE)*bufptr << shift; 60 ++bufptr; 61 ++br->user_buffer; 62 shift -= CHAR_BIT; 63 } 64 } 65 66 br->value = value; 67 br->count = count; 68 } 69