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 #ifdef HAVE_CONFIG_H
11 #include "config.h"
12 #endif
13 
14 #include "dboolhuff.h"
15 
16 int
vp8dx_start_decode(BOOL_DECODER * br,const unsigned char * source,unsigned int source_sz,vp8_decrypt_cb * decrypt_cb,void * decrypt_state)17 vp8dx_start_decode (BOOL_DECODER * br,
18     const unsigned char *source,
19     unsigned int source_sz, vp8_decrypt_cb * decrypt_cb, void *decrypt_state)
20 {
21   br->user_buffer_end = source + source_sz;
22   br->user_buffer = source;
23   br->value = 0;
24   br->count = -8;
25   br->range = 255;
26   br->decrypt_cb = decrypt_cb;
27   br->decrypt_state = decrypt_state;
28 
29   if (source_sz && !source)
30     return 1;
31 
32   /* Populate the buffer */
33   vp8dx_bool_decoder_fill (br);
34 
35   return 0;
36 }
37 
38 void
vp8dx_bool_decoder_fill(BOOL_DECODER * br)39 vp8dx_bool_decoder_fill (BOOL_DECODER * br)
40 {
41   const unsigned char *bufptr = br->user_buffer;
42   VP8_BD_VALUE value = br->value;
43   int count = br->count;
44   int shift = VP8_BD_VALUE_SIZE - 8 - (count + 8);
45   size_t bytes_left = br->user_buffer_end - bufptr;
46   size_t bits_left = bytes_left * CHAR_BIT;
47   int x = (int) (shift + CHAR_BIT - bits_left);
48   int loop_end = 0;
49   unsigned char decrypted[sizeof (VP8_BD_VALUE) + 1];
50 
51   if (br->decrypt_cb) {
52     size_t n =
53         bytes_left > sizeof (decrypted) ? sizeof (decrypted) : bytes_left;
54     br->decrypt_cb (br->decrypt_state, bufptr, decrypted, (int) n);
55     bufptr = decrypted;
56   }
57 
58   if (x >= 0) {
59     count += VP8_LOTS_OF_BITS;
60     loop_end = x;
61   }
62 
63   if (x < 0 || bits_left) {
64     while (shift >= loop_end) {
65       count += CHAR_BIT;
66       value |= (VP8_BD_VALUE) * bufptr << shift;
67       ++bufptr;
68       ++br->user_buffer;
69       shift -= CHAR_BIT;
70     }
71   }
72 
73   br->value = value;
74   br->count = count;
75 }
76