Lines Matching refs:bw

23 static int BitWriterResize(VP8BitWriter* const bw, size_t extra_size) {
26 const size_t needed_size = bw->pos_ + extra_size;
27 if (needed_size <= bw->max_pos_) return 1;
28 new_size = 2 * bw->max_pos_;
34 bw->error_ = 1;
37 if (bw->pos_ > 0) memcpy(new_buf, bw->buf_, bw->pos_);
38 free(bw->buf_);
39 bw->buf_ = new_buf;
40 bw->max_pos_ = new_size;
44 static void kFlush(VP8BitWriter* const bw) {
45 const int s = 8 + bw->nb_bits_;
46 const int32_t bits = bw->value_ >> s;
47 assert(bw->nb_bits_ >= 0);
48 bw->value_ -= bits << s;
49 bw->nb_bits_ -= 8;
51 size_t pos = bw->pos_;
52 if (pos + bw->run_ >= bw->max_pos_) { // reallocate
53 if (!BitWriterResize(bw, bw->run_ + 1)) {
58 if (pos > 0) bw->buf_[pos - 1]++;
60 if (bw->run_ > 0) {
62 for (; bw->run_ > 0; --bw->run_) bw->buf_[pos++] = value;
64 bw->buf_[pos++] = bits;
65 bw->pos_ = pos;
67 bw->run_++; // delay writing of bytes 0xff, pending eventual carry.
99 int VP8PutBit(VP8BitWriter* const bw, int bit, int prob) {
100 const int split = (bw->range_ * prob) >> 8;
102 bw->value_ += split + 1;
103 bw->range_ -= split + 1;
105 bw->range_ = split;
107 if (bw->range_ < 127) { // emit 'shift' bits out and renormalize
108 const int shift = kNorm[bw->range_];
109 bw->range_ = kNewRange[bw->range_];
110 bw->value_ <<= shift;
111 bw->nb_bits_ += shift;
112 if (bw->nb_bits_ > 0) kFlush(bw);
117 int VP8PutBitUniform(VP8BitWriter* const bw, int bit) {
118 const int split = bw->range_ >> 1;
120 bw->value_ += split + 1;
121 bw->range_ -= split + 1;
123 bw->range_ = split;
125 if (bw->range_ < 127) {
126 bw->range_ = kNewRange[bw->range_];
127 bw->value_ <<= 1;
128 bw->nb_bits_ += 1;
129 if (bw->nb_bits_ > 0) kFlush(bw);
134 void VP8PutValue(VP8BitWriter* const bw, int value, int nb_bits) {
137 VP8PutBitUniform(bw, value & mask);
140 void VP8PutSignedValue(VP8BitWriter* const bw, int value, int nb_bits) {
141 if (!VP8PutBitUniform(bw, value != 0))
144 VP8PutValue(bw, ((-value) << 1) | 1, nb_bits + 1);
146 VP8PutValue(bw, value << 1, nb_bits + 1);
152 int VP8BitWriterInit(VP8BitWriter* const bw, size_t expected_size) {
153 bw->range_ = 255 - 1;
154 bw->value_ = 0;
155 bw->run_ = 0;
156 bw->nb_bits_ = -8;
157 bw->pos_ = 0;
158 bw->max_pos_ = 0;
159 bw->error_ = 0;
160 bw->buf_ = NULL;
161 return (expected_size > 0) ? BitWriterResize(bw, expected_size) : 1;
164 uint8_t* VP8BitWriterFinish(VP8BitWriter* const bw) {
165 VP8PutValue(bw, 0, 8 - bw->nb_bits_);
166 bw->nb_bits_ = 0; // pad with zeroes
167 kFlush(bw);
168 return bw->buf_;