int main(void) { RangeCoder c; int i; uint8_t state[10]; AVLFG prng; av_lfg_init(&prng, 1); ff_init_range_encoder(&c, b, SIZE); ff_build_rac_states(&c, (1LL << 32) / 20, 128 + 64 + 32 + 16); memset(state, 128, sizeof(state)); for (i = 0; i < SIZE; i++) r[i] = av_lfg_get(&prng) % 7; for (i = 0; i < SIZE; i++) put_rac(&c, state, r[i] & 1); ff_rac_terminate(&c); ff_init_range_decoder(&c, b, SIZE); memset(state, 128, sizeof(state)); for (i = 0; i < SIZE; i++) if ((r[i] & 1) != get_rac(&c, state)) { av_log(NULL, AV_LOG_ERROR, "rac failure at %d\n", i); return 1; } return 0; }
static inline void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed){ int i; if(v){ const int a= FFABS(v); const int e= av_log2(a); put_rac(c, state+0, 0); if(e<=9){ for(i=0; i<e; i++){ put_rac(c, state+1+i, 1); //1..10 } put_rac(c, state+1+i, 0); for(i=e-1; i>=0; i--){ put_rac(c, state+22+i, (a>>i)&1); //22..31 } if(is_signed) put_rac(c, state+11 + e, v < 0); //11..21 }else{ for(i=0; i<e; i++){ put_rac(c, state+1+FFMIN(i,9), 1); //1..10 } put_rac(c, state+1+9, 0); for(i=e-1; i>=0; i--){ put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31 } if(is_signed) put_rac(c, state+11 + 10, v < 0); //11..21 } }else{
static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed, uint64_t rc_stat[256][2], uint64_t rc_stat2[32][2]) { int i; #define put_rac(C, S, B) \ do { \ if (rc_stat) { \ rc_stat[*(S)][B]++; \ rc_stat2[(S) - state][B]++; \ } \ put_rac(C, S, B); \ } while (0) if (v) { const int a = FFABS(v); const int e = av_log2(a); put_rac(c, state + 0, 0); if (e <= 9) { for (i = 0; i < e; i++) put_rac(c, state + 1 + i, 1); // 1..10 put_rac(c, state + 1 + i, 0); for (i = e - 1; i >= 0; i--) put_rac(c, state + 22 + i, (a >> i) & 1); // 22..31 if (is_signed) put_rac(c, state + 11 + e, v < 0); // 11..21 } else { for (i = 0; i < e; i++) put_rac(c, state + 1 + FFMIN(i, 9), 1); // 1..10 put_rac(c, state + 1 + 9, 0); for (i = e - 1; i >= 0; i--) put_rac(c, state + 22 + FFMIN(i, 9), (a >> i) & 1); // 22..31 if (is_signed) put_rac(c, state + 11 + 10, v < 0); // 11..21 } } else {
int main(void){ RangeCoder c; uint8_t b[9*SIZE]; uint8_t r[9*SIZE]; int i; uint8_t state[10]= {0}; AVLFG prng; av_lfg_init(&prng, 1); ff_init_range_encoder(&c, b, SIZE); ff_build_rac_states(&c, 0.05*(1LL<<32), 128+64+32+16); memset(state, 128, sizeof(state)); for(i=0; i<SIZE; i++){ r[i] = av_lfg_get(&prng) % 7; } for(i=0; i<SIZE; i++){ START_TIMER put_rac(&c, state, r[i]&1); STOP_TIMER("put_rac") } ff_rac_terminate(&c); ff_init_range_decoder(&c, b, SIZE); memset(state, 128, sizeof(state)); for(i=0; i<SIZE; i++){ START_TIMER if( (r[i]&1) != get_rac(&c, state) ) av_log(NULL, AV_LOG_DEBUG, "rac failure at %d\n", i); STOP_TIMER("get_rac") } return 0; }