/src/libvpx/vp8/decoder/dboolhuff.h
Line | Count | Source |
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 | | #ifndef VPX_VP8_DECODER_DBOOLHUFF_H_ |
12 | | #define VPX_VP8_DECODER_DBOOLHUFF_H_ |
13 | | |
14 | | #include <stddef.h> |
15 | | #include <limits.h> |
16 | | |
17 | | #include "./vpx_config.h" |
18 | | #include "vpx_ports/compiler_attributes.h" |
19 | | #include "vpx_ports/mem.h" |
20 | | #include "vpx/vp8dx.h" |
21 | | #include "vpx/vpx_integer.h" |
22 | | |
23 | | #ifdef __cplusplus |
24 | | extern "C" { |
25 | | #endif |
26 | | |
27 | | typedef size_t VP8_BD_VALUE; |
28 | | |
29 | 15.6G | #define VP8_BD_VALUE_SIZE ((int)sizeof(VP8_BD_VALUE) * CHAR_BIT) |
30 | | |
31 | | /*This is meant to be a large, positive constant that can still be efficiently |
32 | | loaded as an immediate (on platforms like ARM, for example). |
33 | | Even relatively modest values like 100 would work fine.*/ |
34 | 1.33G | #define VP8_LOTS_OF_BITS (0x40000000) |
35 | | |
36 | | typedef struct { |
37 | | const unsigned char *user_buffer_end; |
38 | | const unsigned char *user_buffer; |
39 | | VP8_BD_VALUE value; |
40 | | int count; |
41 | | unsigned int range; |
42 | | vpx_decrypt_cb decrypt_cb; |
43 | | void *decrypt_state; |
44 | | } BOOL_DECODER; |
45 | | |
46 | | DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]); |
47 | | |
48 | | int vp8dx_start_decode(BOOL_DECODER *br, const unsigned char *source, |
49 | | unsigned int source_sz, vpx_decrypt_cb decrypt_cb, |
50 | | void *decrypt_state); |
51 | | |
52 | | void vp8dx_bool_decoder_fill(BOOL_DECODER *br); |
53 | | |
54 | | static VPX_NO_UNSIGNED_SHIFT_CHECK int vp8dx_decode_bool(BOOL_DECODER *br, |
55 | 14.2G | int probability) { |
56 | 14.2G | unsigned int bit = 0; |
57 | 14.2G | VP8_BD_VALUE value; |
58 | 14.2G | unsigned int split; |
59 | 14.2G | VP8_BD_VALUE bigsplit; |
60 | 14.2G | int count; |
61 | 14.2G | unsigned int range; |
62 | | |
63 | 14.2G | split = 1 + (((br->range - 1) * probability) >> 8); |
64 | | |
65 | 14.2G | if (br->count < 0) vp8dx_bool_decoder_fill(br); |
66 | | |
67 | 14.2G | value = br->value; |
68 | 14.2G | count = br->count; |
69 | | |
70 | 14.2G | bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); |
71 | | |
72 | 14.2G | range = split; |
73 | | |
74 | 14.2G | if (value >= bigsplit) { |
75 | 272M | range = br->range - split; |
76 | 272M | value = value - bigsplit; |
77 | 272M | bit = 1; |
78 | 272M | } |
79 | | |
80 | 14.2G | { |
81 | 14.2G | const unsigned char shift = vp8_norm[(unsigned char)range]; |
82 | 14.2G | range <<= shift; |
83 | 14.2G | value <<= shift; |
84 | 14.2G | count -= shift; |
85 | 14.2G | } |
86 | 14.2G | br->value = value; |
87 | 14.2G | br->count = count; |
88 | 14.2G | br->range = range; |
89 | | |
90 | 14.2G | return bit; |
91 | 14.2G | } Unexecuted instantiation: vp8_dx_iface.c:vp8dx_decode_bool Unexecuted instantiation: onyxd_if.c:vp8dx_decode_bool Unexecuted instantiation: threading.c:vp8dx_decode_bool decodeframe.c:vp8dx_decode_bool Line | Count | Source | 55 | 85.5M | int probability) { | 56 | 85.5M | unsigned int bit = 0; | 57 | 85.5M | VP8_BD_VALUE value; | 58 | 85.5M | unsigned int split; | 59 | 85.5M | VP8_BD_VALUE bigsplit; | 60 | 85.5M | int count; | 61 | 85.5M | unsigned int range; | 62 | | | 63 | 85.5M | split = 1 + (((br->range - 1) * probability) >> 8); | 64 | | | 65 | 85.5M | if (br->count < 0) vp8dx_bool_decoder_fill(br); | 66 | | | 67 | 85.5M | value = br->value; | 68 | 85.5M | count = br->count; | 69 | | | 70 | 85.5M | bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); | 71 | | | 72 | 85.5M | range = split; | 73 | | | 74 | 85.5M | if (value >= bigsplit) { | 75 | 3.64M | range = br->range - split; | 76 | 3.64M | value = value - bigsplit; | 77 | 3.64M | bit = 1; | 78 | 3.64M | } | 79 | | | 80 | 85.5M | { | 81 | 85.5M | const unsigned char shift = vp8_norm[(unsigned char)range]; | 82 | 85.5M | range <<= shift; | 83 | 85.5M | value <<= shift; | 84 | 85.5M | count -= shift; | 85 | 85.5M | } | 86 | 85.5M | br->value = value; | 87 | 85.5M | br->count = count; | 88 | 85.5M | br->range = range; | 89 | | | 90 | 85.5M | return bit; | 91 | 85.5M | } |
detokenize.c:vp8dx_decode_bool Line | Count | Source | 55 | 209M | int probability) { | 56 | 209M | unsigned int bit = 0; | 57 | 209M | VP8_BD_VALUE value; | 58 | 209M | unsigned int split; | 59 | 209M | VP8_BD_VALUE bigsplit; | 60 | 209M | int count; | 61 | 209M | unsigned int range; | 62 | | | 63 | 209M | split = 1 + (((br->range - 1) * probability) >> 8); | 64 | | | 65 | 209M | if (br->count < 0) vp8dx_bool_decoder_fill(br); | 66 | | | 67 | 209M | value = br->value; | 68 | 209M | count = br->count; | 69 | | | 70 | 209M | bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); | 71 | | | 72 | 209M | range = split; | 73 | | | 74 | 209M | if (value >= bigsplit) { | 75 | 40.4M | range = br->range - split; | 76 | 40.4M | value = value - bigsplit; | 77 | 40.4M | bit = 1; | 78 | 40.4M | } | 79 | | | 80 | 209M | { | 81 | 209M | const unsigned char shift = vp8_norm[(unsigned char)range]; | 82 | 209M | range <<= shift; | 83 | 209M | value <<= shift; | 84 | 209M | count -= shift; | 85 | 209M | } | 86 | 209M | br->value = value; | 87 | 209M | br->count = count; | 88 | 209M | br->range = range; | 89 | | | 90 | 209M | return bit; | 91 | 209M | } |
Unexecuted instantiation: dboolhuff.c:vp8dx_decode_bool decodemv.c:vp8dx_decode_bool Line | Count | Source | 55 | 13.9G | int probability) { | 56 | 13.9G | unsigned int bit = 0; | 57 | 13.9G | VP8_BD_VALUE value; | 58 | 13.9G | unsigned int split; | 59 | 13.9G | VP8_BD_VALUE bigsplit; | 60 | 13.9G | int count; | 61 | 13.9G | unsigned int range; | 62 | | | 63 | 13.9G | split = 1 + (((br->range - 1) * probability) >> 8); | 64 | | | 65 | 13.9G | if (br->count < 0) vp8dx_bool_decoder_fill(br); | 66 | | | 67 | 13.9G | value = br->value; | 68 | 13.9G | count = br->count; | 69 | | | 70 | 13.9G | bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); | 71 | | | 72 | 13.9G | range = split; | 73 | | | 74 | 13.9G | if (value >= bigsplit) { | 75 | 228M | range = br->range - split; | 76 | 228M | value = value - bigsplit; | 77 | 228M | bit = 1; | 78 | 228M | } | 79 | | | 80 | 13.9G | { | 81 | 13.9G | const unsigned char shift = vp8_norm[(unsigned char)range]; | 82 | 13.9G | range <<= shift; | 83 | 13.9G | value <<= shift; | 84 | 13.9G | count -= shift; | 85 | 13.9G | } | 86 | 13.9G | br->value = value; | 87 | 13.9G | br->count = count; | 88 | 13.9G | br->range = range; | 89 | | | 90 | 13.9G | return bit; | 91 | 13.9G | } |
|
92 | | |
93 | 1.32M | static INLINE int vp8_decode_value(BOOL_DECODER *br, int bits) { |
94 | 1.32M | int z = 0; |
95 | 1.32M | int bit; |
96 | | |
97 | 9.56M | for (bit = bits - 1; bit >= 0; bit--) { |
98 | 8.24M | z |= (vp8dx_decode_bool(br, 0x80) << bit); |
99 | 8.24M | } |
100 | | |
101 | 1.32M | return z; |
102 | 1.32M | } Unexecuted instantiation: vp8_dx_iface.c:vp8_decode_value Unexecuted instantiation: onyxd_if.c:vp8_decode_value Unexecuted instantiation: threading.c:vp8_decode_value decodeframe.c:vp8_decode_value Line | Count | Source | 93 | 995k | static INLINE int vp8_decode_value(BOOL_DECODER *br, int bits) { | 94 | 995k | int z = 0; | 95 | 995k | int bit; | 96 | | | 97 | 6.60M | for (bit = bits - 1; bit >= 0; bit--) { | 98 | 5.61M | z |= (vp8dx_decode_bool(br, 0x80) << bit); | 99 | 5.61M | } | 100 | | | 101 | 995k | return z; | 102 | 995k | } |
Unexecuted instantiation: detokenize.c:vp8_decode_value Unexecuted instantiation: dboolhuff.c:vp8_decode_value decodemv.c:vp8_decode_value Line | Count | Source | 93 | 332k | static INLINE int vp8_decode_value(BOOL_DECODER *br, int bits) { | 94 | 332k | int z = 0; | 95 | 332k | int bit; | 96 | | | 97 | 2.96M | for (bit = bits - 1; bit >= 0; bit--) { | 98 | 2.63M | z |= (vp8dx_decode_bool(br, 0x80) << bit); | 99 | 2.63M | } | 100 | | | 101 | 332k | return z; | 102 | 332k | } |
|
103 | | |
104 | 1.34G | static INLINE int vp8dx_bool_error(BOOL_DECODER *br) { |
105 | | /* Check if we have reached the end of the buffer. |
106 | | * |
107 | | * Variable 'count' stores the number of bits in the 'value' buffer, minus |
108 | | * 8. The top byte is part of the algorithm, and the remainder is buffered |
109 | | * to be shifted into it. So if count == 8, the top 16 bits of 'value' are |
110 | | * occupied, 8 for the algorithm and 8 in the buffer. |
111 | | * |
112 | | * When reading a byte from the user's buffer, count is filled with 8 and |
113 | | * one byte is filled into the value buffer. When we reach the end of the |
114 | | * data, count is additionally filled with VP8_LOTS_OF_BITS. So when |
115 | | * count == VP8_LOTS_OF_BITS - 1, the user's data has been exhausted. |
116 | | */ |
117 | 1.34G | if ((br->count > VP8_BD_VALUE_SIZE) && (br->count < VP8_LOTS_OF_BITS)) { |
118 | | /* We have tried to decode bits after the end of |
119 | | * stream was encountered. |
120 | | */ |
121 | 1.32G | return 1; |
122 | 1.32G | } |
123 | | |
124 | | /* No error. */ |
125 | 21.6M | return 0; |
126 | 1.34G | } Unexecuted instantiation: vp8_dx_iface.c:vp8dx_bool_error Unexecuted instantiation: onyxd_if.c:vp8dx_bool_error threading.c:vp8dx_bool_error Line | Count | Source | 104 | 3.26M | static INLINE int vp8dx_bool_error(BOOL_DECODER *br) { | 105 | | /* Check if we have reached the end of the buffer. | 106 | | * | 107 | | * Variable 'count' stores the number of bits in the 'value' buffer, minus | 108 | | * 8. The top byte is part of the algorithm, and the remainder is buffered | 109 | | * to be shifted into it. So if count == 8, the top 16 bits of 'value' are | 110 | | * occupied, 8 for the algorithm and 8 in the buffer. | 111 | | * | 112 | | * When reading a byte from the user's buffer, count is filled with 8 and | 113 | | * one byte is filled into the value buffer. When we reach the end of the | 114 | | * data, count is additionally filled with VP8_LOTS_OF_BITS. So when | 115 | | * count == VP8_LOTS_OF_BITS - 1, the user's data has been exhausted. | 116 | | */ | 117 | 3.26M | if ((br->count > VP8_BD_VALUE_SIZE) && (br->count < VP8_LOTS_OF_BITS)) { | 118 | | /* We have tried to decode bits after the end of | 119 | | * stream was encountered. | 120 | | */ | 121 | 14.4k | return 1; | 122 | 14.4k | } | 123 | | | 124 | | /* No error. */ | 125 | 3.25M | return 0; | 126 | 3.26M | } |
decodeframe.c:vp8dx_bool_error Line | Count | Source | 104 | 1.34G | static INLINE int vp8dx_bool_error(BOOL_DECODER *br) { | 105 | | /* Check if we have reached the end of the buffer. | 106 | | * | 107 | | * Variable 'count' stores the number of bits in the 'value' buffer, minus | 108 | | * 8. The top byte is part of the algorithm, and the remainder is buffered | 109 | | * to be shifted into it. So if count == 8, the top 16 bits of 'value' are | 110 | | * occupied, 8 for the algorithm and 8 in the buffer. | 111 | | * | 112 | | * When reading a byte from the user's buffer, count is filled with 8 and | 113 | | * one byte is filled into the value buffer. When we reach the end of the | 114 | | * data, count is additionally filled with VP8_LOTS_OF_BITS. So when | 115 | | * count == VP8_LOTS_OF_BITS - 1, the user's data has been exhausted. | 116 | | */ | 117 | 1.34G | if ((br->count > VP8_BD_VALUE_SIZE) && (br->count < VP8_LOTS_OF_BITS)) { | 118 | | /* We have tried to decode bits after the end of | 119 | | * stream was encountered. | 120 | | */ | 121 | 1.32G | return 1; | 122 | 1.32G | } | 123 | | | 124 | | /* No error. */ | 125 | 18.3M | return 0; | 126 | 1.34G | } |
Unexecuted instantiation: detokenize.c:vp8dx_bool_error Unexecuted instantiation: dboolhuff.c:vp8dx_bool_error Unexecuted instantiation: decodemv.c:vp8dx_bool_error |
127 | | |
128 | | #ifdef __cplusplus |
129 | | } // extern "C" |
130 | | #endif |
131 | | |
132 | | #endif // VPX_VP8_DECODER_DBOOLHUFF_H_ |