65
62
void ff_init_cabac_states(CABACContext *c);
68
static inline void put_cabac_bit(CABACContext *c, int b){
69
put_bits(&c->pb, 1, b);
70
for(;c->outstanding_count; c->outstanding_count--){
71
put_bits(&c->pb, 1, 1-b);
75
static inline void renorm_cabac_encoder(CABACContext *c){
76
while(c->range < 0x100){
80
}else if(c->low<0x200){
81
c->outstanding_count++;
94
static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
95
int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state];
97
if(bit == ((*state)&1)){
99
*state= ff_h264_mps_state[*state];
101
c->low += c->range - RangeLPS;
103
*state= ff_h264_lps_state[*state];
106
renorm_cabac_encoder(c);
113
static void put_cabac_static(CABACContext *c, int RangeLPS, int bit){
114
assert(c->range > RangeLPS);
117
c->range -= RangeLPS;
119
c->low += c->range - RangeLPS;
123
renorm_cabac_encoder(c);
131
* @param bit 0 -> write zero bit, !=0 write one bit
133
static void put_cabac_bypass(CABACContext *c, int bit){
142
}else if(c->low<0x400){
143
c->outstanding_count++;
157
* @return the number of bytes written
159
static int put_cabac_terminate(CABACContext *c, int bit){
163
renorm_cabac_encoder(c);
168
renorm_cabac_encoder(c);
170
assert(c->low <= 0x1FF);
171
put_cabac_bit(c, c->low>>9);
172
put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
174
flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
181
return (put_bits_count(&c->pb)+7)>>3;
185
* put (truncated) unary binarization.
187
static void put_cabac_u(CABACContext *c, uint8_t * state, int v, int max, int max_index, int truncated){
194
put_cabac(c, state, 1);
195
if(i < max_index) state++;
197
if(truncated==0 || v<max)
198
put_cabac(c, state, 0);
202
put_cabac(c, state+i, 1);
204
if(truncated==0 || v<max)
205
put_cabac(c, state+i, 0);
207
for(i=0; i<=max_index; i++){
208
put_cabac(c, state+i, 1);
211
put_cabac(c, state+max_index, 1);
213
if(truncated==0 || v<max)
214
put_cabac(c, state+max_index, 0);
220
* put unary exp golomb k-th order binarization.
222
static void put_cabac_ueg(CABACContext *c, uint8_t * state, int v, int max, int is_signed, int k, int max_index){
226
put_cabac(c, state, 0);
228
const int sign= v < 0;
230
if(is_signed) v= FFABS(v);
234
put_cabac(c, state, 1);
235
if(i < max_index) state++;
238
put_cabac(c, state, 0);
242
for(i=0; i<max; i++){
243
put_cabac(c, state, 1);
244
if(i < max_index) state++;
248
while(v >= m){ //FIXME optimize
249
put_cabac_bypass(c, 1);
253
put_cabac_bypass(c, 0);
255
put_cabac_bypass(c, v&m);
260
put_cabac_bypass(c, sign);
265
65
static void refill(CABACContext *c){
266
66
#if CABAC_BITS == 16
267
67
c->low+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1);
393
* Get (truncated) unary binarization.
395
static int get_cabac_u(CABACContext *c, uint8_t * state, int max, int max_index, int truncated){
398
for(i=0; i<max; i++){
399
if(get_cabac(c, state)==0)
402
if(i< max_index) state++;
405
return truncated ? max : -1;
409
* get unary exp golomb k-th order binarization.
411
static int get_cabac_ueg(CABACContext *c, uint8_t * state, int max, int is_signed, int k, int max_index){
415
if(get_cabac(c, state)==0)
418
if(0 < max_index) state++;
420
for(i=1; i<max; i++){
421
if(get_cabac(c, state)==0){
422
if(is_signed && get_cabac_bypass(c)){
428
if(i < max_index) state++;
431
while(get_cabac_bypass(c)){
438
v+= v + get_cabac_bypass(c);
442
if(is_signed && get_cabac_bypass(c)){
449
182
#endif /* AVCODEC_CABAC_H */