From 570caaac65281f2f4091911770a6402a4b6eaa93 Mon Sep 17 00:00:00 2001 From: x Date: Tue, 16 May 2023 12:06:34 +0200 Subject: [PATCH] TurboPFor: Variable Length Coding bitio include --- lib/include_/vlcbit.h | 54 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/include_/vlcbit.h b/lib/include_/vlcbit.h index adc6a2d..85ba53c 100644 --- a/lib/include_/vlcbit.h +++ b/lib/include_/vlcbit.h @@ -102,16 +102,56 @@ static inline int vlcexpo(unsigned x, unsigned vn) { unsigned expo; _vlcexpo_(x, unsigned _expo, _mb, _ma;\ vlcenc((_u_)-_vb_, _vn_, _expo, _mb, _ma); \ *_cp_++ = _expo+_vb_; \ - bitput(_bw_,_br_, _mb, _ma); \ - /*bitenormr(_bw_,_br_,_bp_);*/\ + bitput(_bw_,_br_, _mb, _ma); /*bitenormr(_bw_,_br_,_bp_);*/\ } else *_cp_++ = _u_; \ } while(0) #define bitvcget(_bw_,_br_,_cp_,_bp_,_vn_,_vb_,_x_) do { /*bitdnormr(_bw_,_br_,_bp_);*/ _x_ = *_cp_++; \ - if(likely(_x_ >= vlcfirst(_vn_)+_vb_)) { \ - _x_ -= _vb_; \ - int _mb = vlcmbits(_x_, _vn_), _ma; \ - /*_ma = bitpeek(_bw_, _br_, _mb); bitrmv(_bw_,_br_, _mb);*/ bitget(_bw_,_br_, _mb,_ma);\ - _x_ = vlcdec(_x_, _mb, _ma, _vn_)+_vb_; \ + if(likely(_x_ >= vlcfirst(_vn_)+_vb_)) {\ + _x_ -= _vb_;\ + int _mb = vlcmbits(_x_, _vn_), _ma; /*_ma = bitpeek(_bw_, _br_, _mb); bitrmv(_bw_,_br_, _mb);*/\ + bitget(_bw_,_br_, _mb,_ma);\ + _x_ = vlcdec(_x_, _mb, _ma, _vn_)+_vb_;\ }\ } while(0) + + +#define vhifirst(_k_) (1<<(_k_)) + +#define vhimbits(_expo_,_k_,_i_,_j_) (_k_ - (_i_ + _j_) + ((_expo_ - (1<<_k_)) >> (_i_ + _j_))) +// Hybrid integer https://www.lucaversari.it/phd/main.pdf +#define VHI_K 4 +#define VHI_I 2 +#define VHI_J 1 + +//#define _vlcexpo_(_x_, _k_,_i_,_j, _expo_) +#define vhienc(_x_, _k_, _i_, _j_, _expo_, _mb_, _ma_) {\ + unsigned n = __bsr32(_x_), m = _x_ - (1 << n);\ + _expo_ = (1<<_k_) + ((n - _k_) << (_i_ + _j_)) + ((m >> (n - _i_)) << _j_) + BZHI32(m,_j_);\ + _mb_ = n - _i_ - _j_;\ + _ma_ = bzhi32(_x_ >> _j_,_mb_);\ +} + +#define vhidec(_x_, _mb_, _ma_, _k_, _i_, _j_) {\ + unsigned _mb_ = vhimbits(_x_,_k_,_i_,_j_), low_bits = _x_ & ((1 << _j_) - 1);\ + _x_ >>= _j_;\ + unsigned high_bits = (1 << _i_) | (_x_ & ((1 << _i_) - 1));\ + _x_ = (((high_bits << _mb_) | _ma_) << _j_) | low_bits;\ +} + +#define bithcput(_bw_,_br_,_cp_,_bp_,_k_,_i_,_j_, _u_) do { \ + if((_u_) >= vhifirst(_k_)) {\ + unsigned _expo, _mb, _ma;\ + vhienc(_u_, _k_, _i_, _j_, _expo, _mb, _ma); \ + *_cp_++ = _expo; \ + bitput(_bw_,_br_, _mb, _ma); /*bitenormr(_bw_,_br_,_bp_);*/\ + } else *_cp_++ = _u_; \ +} while(0) + +#define bithcget(_bw_,_br_,_cp_,_bp_,_k_,_i_,_j_,_x_) do { /*bitdnormr(_bw_,_br_,_bp_);*/ _x_ = *_cp_++; \ + if(likely(_x_ >= vhifirst(_k_))) {\ + unsigned _mb = _k_ - (_i_ + _j_) + ((_x_ - (1<<_k_)) >> (_i_ + _j_)), _ma; bitget(_bw_,_br_, _mb,_ma);\ + _x_ = (((((1 << _i_) | BZHI32(_x_ >> _j_,_i_)) << _mb) | _ma) << _j_) | BZHI32(_x_,_j_);\ + }\ +} while(0) +