Advertisement
Guest User

16b-precision 16b-IO uABS code

a guest
Nov 25th, 2014
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.30 KB | None | 0 0
  1. #define L_pb   16     // proba bit-precision for uABS
  2. #define L_IO   16     // 16bit I/O
  3. const uint32_t K = 1ul << L_pb;
  4.  
  5. size_t uABSEncode(const uint8_t* in, size_t in_size,
  6.                          uint8_t* const buf_start, uint8_t* const buf_end,
  7.                          uint32_t p0) {
  8.   p0 = (p0 < 1) ? 1 : (p0 >= K) ? K - 1 : p0;   // avoid corner cases
  9.   const uint16_t q0 = K - p0;
  10.   const uint32_t threshold0 = p0 << L_IO, threshold1 = q0 << L_IO;
  11.   uint16_t* buf = (uint16_t*)buf_end;
  12.   uint32_t x = K;
  13.   int i;
  14.   for (i = in_size - 1; i >= 0; --i) {
  15.     if (x >= (in[i] ? threshold1 : threshold0)) {
  16.       *--buf = x;
  17.       x >>= L_IO;
  18.     }
  19.     const uint64_t xK = (uint64_t)x * K;
  20.     x = in[i] ? (xK + K - 1) / q0 : xK / p0;
  21.   }
  22.   for (i = 0; i < 2; ++i, x >>= L_IO) *--buf = x;
  23.   return buf_end - (uint8_t*)buf;
  24. }
  25.  
  26. void uABSDecode(const uint16_t* ptr, uint8_t* out, size_t in_size,
  27.                 uint32_t p0) {
  28.   p0 = (p0 < 1) ? 1 : (p0 >= K) ? K - 1 : p0;   // avoid corner cases
  29.   const uint32_t q0 = K - p0;
  30.   uint32_t x = *ptr++;
  31.   int i;
  32.   for (i = 0; i < in_size; ++i) {
  33.     if (x < K) {
  34.       x = (x << L_IO) | *ptr++;   // decode forward
  35.     }
  36.     uint64_t xp = (uint64_t)x * q0;
  37.     out[i] = ((xp & (K - 1)) >= p0);
  38.     xp >>= L_pb;
  39.     x = out[i] ? xp : x - xp;
  40.   }
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement