| OLD | NEW |
| 1 // Copyright 2011 Google Inc. All Rights Reserved. | 1 // Copyright 2011 Google Inc. All Rights Reserved. |
| 2 // | 2 // |
| 3 // Use of this source code is governed by a BSD-style license | 3 // Use of this source code is governed by a BSD-style license |
| 4 // that can be found in the COPYING file in the root of the source | 4 // that can be found in the COPYING file in the root of the source |
| 5 // tree. An additional intellectual property rights grant can be found | 5 // tree. An additional intellectual property rights grant can be found |
| 6 // in the file PATENTS. All contributing project authors may | 6 // in the file PATENTS. All contributing project authors may |
| 7 // be found in the AUTHORS file in the root of the source tree. | 7 // be found in the AUTHORS file in the root of the source tree. |
| 8 // ----------------------------------------------------------------------------- | 8 // ----------------------------------------------------------------------------- |
| 9 // | 9 // |
| 10 // Bit writing and boolean coder | 10 // Bit writing and boolean coder |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 if (bw->pos_ > 0) { | 45 if (bw->pos_ > 0) { |
| 46 assert(bw->buf_ != NULL); | 46 assert(bw->buf_ != NULL); |
| 47 memcpy(new_buf, bw->buf_, bw->pos_); | 47 memcpy(new_buf, bw->buf_, bw->pos_); |
| 48 } | 48 } |
| 49 WebPSafeFree(bw->buf_); | 49 WebPSafeFree(bw->buf_); |
| 50 bw->buf_ = new_buf; | 50 bw->buf_ = new_buf; |
| 51 bw->max_pos_ = new_size; | 51 bw->max_pos_ = new_size; |
| 52 return 1; | 52 return 1; |
| 53 } | 53 } |
| 54 | 54 |
| 55 static void kFlush(VP8BitWriter* const bw) { | 55 static void Flush(VP8BitWriter* const bw) { |
| 56 const int s = 8 + bw->nb_bits_; | 56 const int s = 8 + bw->nb_bits_; |
| 57 const int32_t bits = bw->value_ >> s; | 57 const int32_t bits = bw->value_ >> s; |
| 58 assert(bw->nb_bits_ >= 0); | 58 assert(bw->nb_bits_ >= 0); |
| 59 bw->value_ -= bits << s; | 59 bw->value_ -= bits << s; |
| 60 bw->nb_bits_ -= 8; | 60 bw->nb_bits_ -= 8; |
| 61 if ((bits & 0xff) != 0xff) { | 61 if ((bits & 0xff) != 0xff) { |
| 62 size_t pos = bw->pos_; | 62 size_t pos = bw->pos_; |
| 63 if (!BitWriterResize(bw, bw->run_ + 1)) { | 63 if (!BitWriterResize(bw, bw->run_ + 1)) { |
| 64 return; | 64 return; |
| 65 } | 65 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 bw->value_ += split + 1; | 111 bw->value_ += split + 1; |
| 112 bw->range_ -= split + 1; | 112 bw->range_ -= split + 1; |
| 113 } else { | 113 } else { |
| 114 bw->range_ = split; | 114 bw->range_ = split; |
| 115 } | 115 } |
| 116 if (bw->range_ < 127) { // emit 'shift' bits out and renormalize | 116 if (bw->range_ < 127) { // emit 'shift' bits out and renormalize |
| 117 const int shift = kNorm[bw->range_]; | 117 const int shift = kNorm[bw->range_]; |
| 118 bw->range_ = kNewRange[bw->range_]; | 118 bw->range_ = kNewRange[bw->range_]; |
| 119 bw->value_ <<= shift; | 119 bw->value_ <<= shift; |
| 120 bw->nb_bits_ += shift; | 120 bw->nb_bits_ += shift; |
| 121 if (bw->nb_bits_ > 0) kFlush(bw); | 121 if (bw->nb_bits_ > 0) Flush(bw); |
| 122 } | 122 } |
| 123 return bit; | 123 return bit; |
| 124 } | 124 } |
| 125 | 125 |
| 126 int VP8PutBitUniform(VP8BitWriter* const bw, int bit) { | 126 int VP8PutBitUniform(VP8BitWriter* const bw, int bit) { |
| 127 const int split = bw->range_ >> 1; | 127 const int split = bw->range_ >> 1; |
| 128 if (bit) { | 128 if (bit) { |
| 129 bw->value_ += split + 1; | 129 bw->value_ += split + 1; |
| 130 bw->range_ -= split + 1; | 130 bw->range_ -= split + 1; |
| 131 } else { | 131 } else { |
| 132 bw->range_ = split; | 132 bw->range_ = split; |
| 133 } | 133 } |
| 134 if (bw->range_ < 127) { | 134 if (bw->range_ < 127) { |
| 135 bw->range_ = kNewRange[bw->range_]; | 135 bw->range_ = kNewRange[bw->range_]; |
| 136 bw->value_ <<= 1; | 136 bw->value_ <<= 1; |
| 137 bw->nb_bits_ += 1; | 137 bw->nb_bits_ += 1; |
| 138 if (bw->nb_bits_ > 0) kFlush(bw); | 138 if (bw->nb_bits_ > 0) Flush(bw); |
| 139 } | 139 } |
| 140 return bit; | 140 return bit; |
| 141 } | 141 } |
| 142 | 142 |
| 143 void VP8PutValue(VP8BitWriter* const bw, int value, int nb_bits) { | 143 void VP8PutValue(VP8BitWriter* const bw, int value, int nb_bits) { |
| 144 int mask; | 144 int mask; |
| 145 for (mask = 1 << (nb_bits - 1); mask; mask >>= 1) | 145 for (mask = 1 << (nb_bits - 1); mask; mask >>= 1) |
| 146 VP8PutBitUniform(bw, value & mask); | 146 VP8PutBitUniform(bw, value & mask); |
| 147 } | 147 } |
| 148 | 148 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 166 bw->pos_ = 0; | 166 bw->pos_ = 0; |
| 167 bw->max_pos_ = 0; | 167 bw->max_pos_ = 0; |
| 168 bw->error_ = 0; | 168 bw->error_ = 0; |
| 169 bw->buf_ = NULL; | 169 bw->buf_ = NULL; |
| 170 return (expected_size > 0) ? BitWriterResize(bw, expected_size) : 1; | 170 return (expected_size > 0) ? BitWriterResize(bw, expected_size) : 1; |
| 171 } | 171 } |
| 172 | 172 |
| 173 uint8_t* VP8BitWriterFinish(VP8BitWriter* const bw) { | 173 uint8_t* VP8BitWriterFinish(VP8BitWriter* const bw) { |
| 174 VP8PutValue(bw, 0, 9 - bw->nb_bits_); | 174 VP8PutValue(bw, 0, 9 - bw->nb_bits_); |
| 175 bw->nb_bits_ = 0; // pad with zeroes | 175 bw->nb_bits_ = 0; // pad with zeroes |
| 176 kFlush(bw); | 176 Flush(bw); |
| 177 return bw->buf_; | 177 return bw->buf_; |
| 178 } | 178 } |
| 179 | 179 |
| 180 int VP8BitWriterAppend(VP8BitWriter* const bw, | 180 int VP8BitWriterAppend(VP8BitWriter* const bw, |
| 181 const uint8_t* data, size_t size) { | 181 const uint8_t* data, size_t size) { |
| 182 assert(data != NULL); | 182 assert(data != NULL); |
| 183 if (bw->nb_bits_ != -8) return 0; // kFlush() must have been called | 183 if (bw->nb_bits_ != -8) return 0; // Flush() must have been called |
| 184 if (!BitWriterResize(bw, size)) return 0; | 184 if (!BitWriterResize(bw, size)) return 0; |
| 185 memcpy(bw->buf_ + bw->pos_, data, size); | 185 memcpy(bw->buf_ + bw->pos_, data, size); |
| 186 bw->pos_ += size; | 186 bw->pos_ += size; |
| 187 return 1; | 187 return 1; |
| 188 } | 188 } |
| 189 | 189 |
| 190 void VP8BitWriterWipeOut(VP8BitWriter* const bw) { | 190 void VP8BitWriterWipeOut(VP8BitWriter* const bw) { |
| 191 if (bw != NULL) { | 191 if (bw != NULL) { |
| 192 WebPSafeFree(bw->buf_); | 192 WebPSafeFree(bw->buf_); |
| 193 memset(bw, 0, sizeof(*bw)); | 193 memset(bw, 0, sizeof(*bw)); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 *bw->cur_++ = (uint8_t)bw->bits_; | 298 *bw->cur_++ = (uint8_t)bw->bits_; |
| 299 bw->bits_ >>= 8; | 299 bw->bits_ >>= 8; |
| 300 bw->used_ -= 8; | 300 bw->used_ -= 8; |
| 301 } | 301 } |
| 302 bw->used_ = 0; | 302 bw->used_ = 0; |
| 303 } | 303 } |
| 304 return bw->buf_; | 304 return bw->buf_; |
| 305 } | 305 } |
| 306 | 306 |
| 307 //------------------------------------------------------------------------------ | 307 //------------------------------------------------------------------------------ |
| OLD | NEW |