1 /*
2 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * @file
23 * Common VP5-VP9 range decoder stuff
24 */
25
26 #ifndef AVCODEC_VPX_RAC_H
27 #define AVCODEC_VPX_RAC_H
28
29 #include <stdint.h>
30
31 #include "config.h"
34
37 int bits;
/* stored negated (i.e. negative "bits" is a positive number of
38 bits left) in order to eliminate a negate in cache refilling */
44
47
48 /**
49 * returns 1 if the end of the stream has been reached, 0 otherwise.
50 */
52 {
53 if (
c->end <=
c->buffer &&
c->bits >= 0)
55 return c->end_reached > 10;
56 }
57
59 {
62 unsigned int code_word =
c->code_word;
63
67 if(
bits >= 0 &&
c->buffer <
c->end) {
68 code_word |= bytestream_get_be16(&
c->buffer) <<
bits;
70 }
72 return code_word;
73 }
74
75 #if ARCH_ARM
77 #elif ARCH_X86
79 #endif
80
81 #ifndef vpx_rac_get_prob
82 #define vpx_rac_get_prob vpx_rac_get_prob
84 {
86 unsigned int low = 1 + (((
c->high - 1) *
prob) >> 8);
87 unsigned int low_shift = low << 16;
88 int bit = code_word >= low_shift;
89
90 c->high =
bit ?
c->high - low : low;
91 c->code_word =
bit ? code_word - low_shift : code_word;
92
94 }
95 #endif
96
97 #ifndef vpx_rac_get_prob_branchy
98 // branchy variant, to be used where there's a branch based on the bit decoded
100 {
102 unsigned low = 1 + (((
c->high - 1) *
prob) >> 8);
103 unsigned low_shift = low << 16;
104
105 if (code_word >= low_shift) {
107 c->code_word = code_word - low_shift;
108 return 1;
109 }
110
112 c->code_word = code_word;
113 return 0;
114 }
115 #endif
116
118 {
120 /* equiprobable */
121 int low = (
c->high + 1) >> 1;
122 unsigned int low_shift = low << 16;
123 int bit = code_word >= low_shift;
126 code_word -= low_shift;
127 } else {
129 }
130
131 c->code_word = code_word;
133 }
134
135 #endif /* AVCODEC_VPX_RAC_H */