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
);