12
#define OUTPUT_BIT(rlecoder,bit) rlecoder_write_bit(rlecoder,bit)
13
#define INPUT_BIT(rlecoder) rlecoder_read_bit(rlecoder)
14
#define OUTPUT_BIT_DIRECT(coder,bit) bitcoder_write_bit(&(coder)->bitcoder,bit)
15
#define INPUT_BIT_DIRECT(rlecoder) bitcoder_read_bit(&(rlecoder)->bitcoder)
16
#define ENTROPY_CODER RLECoderState
17
#define ENTROPY_ENCODER_INIT(coder,limit) rlecoder_encoder_init(coder,limit)
18
#define ENTROPY_ENCODER_DONE(coder) rlecoder_encoder_done(coder)
19
#define ENTROPY_ENCODER_FLUSH(coder) rlecoder_encoder_flush(coder)
20
#define ENTROPY_DECODER_INIT(coder,bitstream,limit) \
21
rlecoder_decoder_init(coder,bitstream,limit)
22
#define ENTROPY_DECODER_DONE(coder) /* nothing to do ... */
23
#define ENTROPY_CODER_BITSTREAM(coder) ((coder)->bitcoder.bitstream)
24
#define ENTROPY_CODER_EOS(coder) ((coder)->bitcoder.eos)
26
#define ENTROPY_CODER_SYMBOL(coder) ((coder)->symbol)
27
#define ENTROPY_CODER_RUNLENGTH(coder) ((coder)->count)
28
#define ENTROPY_CODER_SKIP(coder,skip) do { (coder)->count -= skip; } while (0)
36
uint32_t count; /* have seen count symbol's */
37
BitCoderState bitcoder;
38
GolombAdaptiveCoderState golomb_state [2]; /* 2 states for 2 symbols... */
45
* bit should be 0 or 1 !!!
48
void rlecoder_write_bit (RLECoderState *s, int bit)
50
assert (bit == 0 || bit == 1);
52
if (s->symbol == -1) {
56
bitcoder_write_bit (&s->bitcoder, bit);
59
if (s->symbol != bit) {
60
golombcoder_encode_number (&s->golomb_state[s->symbol],
61
&s->bitcoder, s->count);
62
s->symbol = ~s->symbol & 1;
70
int rlecoder_read_bit (RLECoderState *s)
73
s->symbol = ~s->symbol & 1;
74
s->count = golombcoder_decode_number (&s->golomb_state[s->symbol],
76
if (s->bitcoder.eos) {
90
void rlecoder_encoder_init (RLECoderState *s, uint32_t limit)
92
bitcoder_encoder_init (&s->bitcoder, limit);
95
s->golomb_state[0].count = 0;
96
s->golomb_state[1].count = 0;
97
s->golomb_state[0].bits = 5 << 3;
98
s->golomb_state[1].bits = 5 << 3;
103
* once you called this, you better should not encode any more symbols ...
106
uint32_t rlecoder_encoder_flush (RLECoderState *s)
108
if (s->symbol == -1 || !s->have_seen_1)
111
golombcoder_encode_number (&s->golomb_state[s->symbol],
112
&s->bitcoder, s->count);
113
return bitcoder_flush (&s->bitcoder);
118
void rlecoder_decoder_init (RLECoderState *s, uint8_t *bitstream, uint32_t limit)
120
bitcoder_decoder_init (&s->bitcoder, bitstream, limit);
121
s->golomb_state[0].count = 0;
122
s->golomb_state[1].count = 0;
123
s->golomb_state[0].bits = 5 << 3;
124
s->golomb_state[1].bits = 5 << 3;
125
s->symbol = bitcoder_read_bit (&s->bitcoder);
126
s->count = golombcoder_decode_number (&s->golomb_state[s->symbol],
128
if (s->bitcoder.eos) {
136
void rlecoder_encoder_done (RLECoderState *s)
138
bitcoder_encoder_done (&s->bitcoder);