mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 01:27:26 +08:00
1 parent
be5901100e
commit
c8a163a077
35 files changed
+3045
-373
No files matched your search
+47
-3
@@ -36,6 +36,7 @@ type u3dBits struct {
|
||||
pos uint64
|
||||
low, high, code uint32
|
||||
err error
|
||||
reserve func(uint64, uint64) error
|
||||
}
|
||||
|
||||
// u3dHistogram 保存一个动态压缩上下文的频次及前缀和
|
||||
@@ -224,7 +225,23 @@ func (r *u3dBits) index(count uint32) uint32 {
|
||||
// 入参: h 频次上下文
|
||||
// 返回: uint32 原始整数
|
||||
func (r *u3dBits) dynamic(h *u3dHistogram) uint32 {
|
||||
return r.dynamicValue(h, false)
|
||||
}
|
||||
|
||||
// dynamicValue 按字段位宽处理动态上下文的逃逸字面量,分配前检查可选预算
|
||||
// 入参: h 频次上下文, small 是否为8位字段
|
||||
// 返回: uint32 解码值
|
||||
func (r *u3dBits) dynamicValue(h *u3dHistogram, small bool) uint32 {
|
||||
if r.err != nil {
|
||||
return 0
|
||||
}
|
||||
if h.total == 0 {
|
||||
if r.reserve != nil {
|
||||
if err := r.reserve(1, 32); err != nil {
|
||||
r.err = err
|
||||
return 0
|
||||
}
|
||||
}
|
||||
h.counts = make([]uint32, 1)
|
||||
h.tree = make([]uint32, 2)
|
||||
h.add(0)
|
||||
@@ -235,17 +252,44 @@ func (r *u3dBits) dynamic(h *u3dHistogram) uint32 {
|
||||
return 0
|
||||
}
|
||||
r.advance(start, h.counts[symbol], h.total)
|
||||
h.add(symbol)
|
||||
r.histogramAdd(h, symbol)
|
||||
if r.err != nil {
|
||||
return 0
|
||||
}
|
||||
if symbol != 0 {
|
||||
if small && symbol > 256 {
|
||||
r.err = fmt.Errorf("invalid U3D compressed byte")
|
||||
}
|
||||
return symbol - 1
|
||||
}
|
||||
value := r.u32()
|
||||
var value uint32
|
||||
if small {
|
||||
value = uint32(r.byteValue())
|
||||
} else {
|
||||
value = r.u32()
|
||||
}
|
||||
if value < 0xffff && r.err == nil {
|
||||
h.add(value + 1)
|
||||
r.histogramAdd(h, value+1)
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
// histogramAdd 在频次数组扩展前计入解码预算
|
||||
// 入参: h 频次上下文, symbol 待更新符号
|
||||
func (r *u3dBits) histogramAdd(h *u3dHistogram, symbol uint32) {
|
||||
if r.err != nil {
|
||||
return
|
||||
}
|
||||
if r.reserve != nil && symbol <= 0xffff && int(symbol) >= len(h.counts) {
|
||||
length := min(65536, max(int(symbol)+1, len(h.counts)*2))
|
||||
if err := r.reserve(uint64(length-len(h.counts)), 32); err != nil {
|
||||
r.err = err
|
||||
return
|
||||
}
|
||||
}
|
||||
h.add(symbol)
|
||||
}
|
||||
|
||||
// find 以树状前缀和定位符号,避免按符号数量线性扫描
|
||||
// 入参: position 累计频次位置
|
||||
// 返回: uint32 符号, uint32 符号前缀频次
|
||||
|
||||
Reference in new issue
Block a user