forked from mirror/brotli
Start un-exporting names.
This commit is contained in:
parent
1ce1c68433
commit
5001b3d0d7
|
@ -19,7 +19,7 @@ package brotli
|
||||||
initially the total amount of commands output by previous
|
initially the total amount of commands output by previous
|
||||||
CreateBackwardReferences calls, and must be incremented by the amount written
|
CreateBackwardReferences calls, and must be incremented by the amount written
|
||||||
by this call. */
|
by this call. */
|
||||||
func ComputeDistanceCode(distance uint, max_distance uint, dist_cache []int) uint {
|
func computeDistanceCode(distance uint, max_distance uint, dist_cache []int) uint {
|
||||||
if distance <= max_distance {
|
if distance <= max_distance {
|
||||||
var distance_plus_3 uint = distance + 3
|
var distance_plus_3 uint = distance + 3
|
||||||
var offset0 uint = distance_plus_3 - uint(dist_cache[0])
|
var offset0 uint = distance_plus_3 - uint(dist_cache[0])
|
||||||
|
@ -42,7 +42,7 @@ func ComputeDistanceCode(distance uint, max_distance uint, dist_cache []int) uin
|
||||||
return distance + BROTLI_NUM_DISTANCE_SHORT_CODES - 1
|
return distance + BROTLI_NUM_DISTANCE_SHORT_CODES - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliCreateBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, hasher HasherHandle, dist_cache []int, last_insert_len *uint, commands []Command, num_commands *uint, num_literals *uint) {
|
func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, hasher HasherHandle, dist_cache []int, last_insert_len *uint, commands []Command, num_commands *uint, num_literals *uint) {
|
||||||
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
||||||
var orig_commands []Command = commands
|
var orig_commands []Command = commands
|
||||||
var insert_length uint = *last_insert_len
|
var insert_length uint = *last_insert_len
|
||||||
|
@ -112,7 +112,7 @@ func BrotliCreateBackwardReferences(num_bytes uint, position uint, ringbuffer []
|
||||||
{
|
{
|
||||||
/* The first 16 codes are special short-codes,
|
/* The first 16 codes are special short-codes,
|
||||||
and the minimum offset is 1. */
|
and the minimum offset is 1. */
|
||||||
var distance_code uint = ComputeDistanceCode(sr.distance, max_distance+gap, dist_cache)
|
var distance_code uint = computeDistanceCode(sr.distance, max_distance+gap, dist_cache)
|
||||||
if (sr.distance <= (max_distance + gap)) && distance_code > 0 {
|
if (sr.distance <= (max_distance + gap)) && distance_code > 0 {
|
||||||
dist_cache[3] = dist_cache[2]
|
dist_cache[3] = dist_cache[2]
|
||||||
dist_cache[2] = dist_cache[1]
|
dist_cache[2] = dist_cache[1]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package brotli
|
package brotli
|
||||||
|
|
||||||
type ZopfliNode struct {
|
type zopfliNode struct {
|
||||||
length uint32
|
length uint32
|
||||||
distance uint32
|
distance uint32
|
||||||
dcode_insert_length uint32
|
dcode_insert_length uint32
|
||||||
|
@ -24,7 +24,7 @@ type ZopfliNode struct {
|
||||||
(1) nodes[i].copy_length() >= 2
|
(1) nodes[i].copy_length() >= 2
|
||||||
(2) nodes[i].command_length() <= i and
|
(2) nodes[i].command_length() <= i and
|
||||||
(3) nodes[i - nodes[i].command_length()].cost < kInfinity */
|
(3) nodes[i - nodes[i].command_length()].cost < kInfinity */
|
||||||
const BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE = 544
|
const maxEffectiveDistanceAlphabetSize = 544
|
||||||
|
|
||||||
var kInfinity float32 = 1.7e38 /* ~= 2 ^ 127 */
|
var kInfinity float32 = 1.7e38 /* ~= 2 ^ 127 */
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@ var kDistanceCacheIndex = []uint32{0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
||||||
|
|
||||||
var kDistanceCacheOffset = []int{0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3}
|
var kDistanceCacheOffset = []int{0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3}
|
||||||
|
|
||||||
func BrotliInitZopfliNodes(array []ZopfliNode, length uint) {
|
func initZopfliNodes(array []zopfliNode, length uint) {
|
||||||
var stub ZopfliNode
|
var stub zopfliNode
|
||||||
var i uint
|
var i uint
|
||||||
stub.length = 1
|
stub.length = 1
|
||||||
stub.distance = 0
|
stub.distance = 0
|
||||||
|
@ -44,34 +44,34 @@ func BrotliInitZopfliNodes(array []ZopfliNode, length uint) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliNodeCopyLength(self *ZopfliNode) uint32 {
|
func zopfliNodeCopyLength(self *zopfliNode) uint32 {
|
||||||
return self.length & 0x1FFFFFF
|
return self.length & 0x1FFFFFF
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliNodeLengthCode(self *ZopfliNode) uint32 {
|
func zopfliNodeLengthCode(self *zopfliNode) uint32 {
|
||||||
var modifier uint32 = self.length >> 25
|
var modifier uint32 = self.length >> 25
|
||||||
return ZopfliNodeCopyLength(self) + 9 - modifier
|
return zopfliNodeCopyLength(self) + 9 - modifier
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliNodeCopyDistance(self *ZopfliNode) uint32 {
|
func zopfliNodeCopyDistance(self *zopfliNode) uint32 {
|
||||||
return self.distance
|
return self.distance
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliNodeDistanceCode(self *ZopfliNode) uint32 {
|
func zopfliNodeDistanceCode(self *zopfliNode) uint32 {
|
||||||
var short_code uint32 = self.dcode_insert_length >> 27
|
var short_code uint32 = self.dcode_insert_length >> 27
|
||||||
if short_code == 0 {
|
if short_code == 0 {
|
||||||
return ZopfliNodeCopyDistance(self) + BROTLI_NUM_DISTANCE_SHORT_CODES - 1
|
return zopfliNodeCopyDistance(self) + BROTLI_NUM_DISTANCE_SHORT_CODES - 1
|
||||||
} else {
|
} else {
|
||||||
return short_code - 1
|
return short_code - 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliNodeCommandLength(self *ZopfliNode) uint32 {
|
func zopfliNodeCommandLength(self *zopfliNode) uint32 {
|
||||||
return ZopfliNodeCopyLength(self) + (self.dcode_insert_length & 0x7FFFFFF)
|
return zopfliNodeCopyLength(self) + (self.dcode_insert_length & 0x7FFFFFF)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Histogram based cost model for zopflification. */
|
/* Histogram based cost model for zopflification. */
|
||||||
type ZopfliCostModel struct {
|
type zopfliCostModel struct {
|
||||||
cost_cmd_ [BROTLI_NUM_COMMAND_SYMBOLS]float32
|
cost_cmd_ [BROTLI_NUM_COMMAND_SYMBOLS]float32
|
||||||
cost_dist_ []float32
|
cost_dist_ []float32
|
||||||
distance_histogram_size uint32
|
distance_histogram_size uint32
|
||||||
|
@ -80,10 +80,10 @@ type ZopfliCostModel struct {
|
||||||
num_bytes_ uint
|
num_bytes_ uint
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitZopfliCostModel(self *ZopfliCostModel, dist *BrotliDistanceParams, num_bytes uint) {
|
func initZopfliCostModel(self *zopfliCostModel, dist *BrotliDistanceParams, num_bytes uint) {
|
||||||
var distance_histogram_size uint32 = dist.alphabet_size
|
var distance_histogram_size uint32 = dist.alphabet_size
|
||||||
if distance_histogram_size > BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE {
|
if distance_histogram_size > maxEffectiveDistanceAlphabetSize {
|
||||||
distance_histogram_size = BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE
|
distance_histogram_size = maxEffectiveDistanceAlphabetSize
|
||||||
}
|
}
|
||||||
|
|
||||||
self.num_bytes_ = num_bytes
|
self.num_bytes_ = num_bytes
|
||||||
|
@ -92,12 +92,12 @@ func InitZopfliCostModel(self *ZopfliCostModel, dist *BrotliDistanceParams, num_
|
||||||
self.distance_histogram_size = distance_histogram_size
|
self.distance_histogram_size = distance_histogram_size
|
||||||
}
|
}
|
||||||
|
|
||||||
func CleanupZopfliCostModel(self *ZopfliCostModel) {
|
func cleanupZopfliCostModel(self *zopfliCostModel) {
|
||||||
self.literal_costs_ = nil
|
self.literal_costs_ = nil
|
||||||
self.cost_dist_ = nil
|
self.cost_dist_ = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetCost(histogram []uint32, histogram_size uint, literal_histogram bool, cost []float32) {
|
func setCost(histogram []uint32, histogram_size uint, literal_histogram bool, cost []float32) {
|
||||||
var sum uint = 0
|
var sum uint = 0
|
||||||
var missing_symbol_sum uint
|
var missing_symbol_sum uint
|
||||||
var log2sum float32
|
var log2sum float32
|
||||||
|
@ -134,10 +134,10 @@ func SetCost(histogram []uint32, histogram_size uint, literal_histogram bool, co
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliCostModelSetFromCommands(self *ZopfliCostModel, position uint, ringbuffer []byte, ringbuffer_mask uint, commands []Command, num_commands uint, last_insert_len uint) {
|
func zopfliCostModelSetFromCommands(self *zopfliCostModel, position uint, ringbuffer []byte, ringbuffer_mask uint, commands []Command, num_commands uint, last_insert_len uint) {
|
||||||
var histogram_literal [BROTLI_NUM_LITERAL_SYMBOLS]uint32
|
var histogram_literal [BROTLI_NUM_LITERAL_SYMBOLS]uint32
|
||||||
var histogram_cmd [BROTLI_NUM_COMMAND_SYMBOLS]uint32
|
var histogram_cmd [BROTLI_NUM_COMMAND_SYMBOLS]uint32
|
||||||
var histogram_dist [BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE]uint32
|
var histogram_dist [maxEffectiveDistanceAlphabetSize]uint32
|
||||||
var cost_literal [BROTLI_NUM_LITERAL_SYMBOLS]float32
|
var cost_literal [BROTLI_NUM_LITERAL_SYMBOLS]float32
|
||||||
var pos uint = position - last_insert_len
|
var pos uint = position - last_insert_len
|
||||||
var min_cost_cmd float32 = kInfinity
|
var min_cost_cmd float32 = kInfinity
|
||||||
|
@ -147,7 +147,7 @@ func ZopfliCostModelSetFromCommands(self *ZopfliCostModel, position uint, ringbu
|
||||||
|
|
||||||
histogram_literal = [BROTLI_NUM_LITERAL_SYMBOLS]uint32{}
|
histogram_literal = [BROTLI_NUM_LITERAL_SYMBOLS]uint32{}
|
||||||
histogram_cmd = [BROTLI_NUM_COMMAND_SYMBOLS]uint32{}
|
histogram_cmd = [BROTLI_NUM_COMMAND_SYMBOLS]uint32{}
|
||||||
histogram_dist = [BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE]uint32{}
|
histogram_dist = [maxEffectiveDistanceAlphabetSize]uint32{}
|
||||||
|
|
||||||
for i = 0; i < num_commands; i++ {
|
for i = 0; i < num_commands; i++ {
|
||||||
var inslength uint = uint(commands[i].insert_len_)
|
var inslength uint = uint(commands[i].insert_len_)
|
||||||
|
@ -168,9 +168,9 @@ func ZopfliCostModelSetFromCommands(self *ZopfliCostModel, position uint, ringbu
|
||||||
pos += inslength + copylength
|
pos += inslength + copylength
|
||||||
}
|
}
|
||||||
|
|
||||||
SetCost(histogram_literal[:], BROTLI_NUM_LITERAL_SYMBOLS, true, cost_literal[:])
|
setCost(histogram_literal[:], BROTLI_NUM_LITERAL_SYMBOLS, true, cost_literal[:])
|
||||||
SetCost(histogram_cmd[:], BROTLI_NUM_COMMAND_SYMBOLS, false, cost_cmd)
|
setCost(histogram_cmd[:], BROTLI_NUM_COMMAND_SYMBOLS, false, cost_cmd)
|
||||||
SetCost(histogram_dist[:], uint(self.distance_histogram_size), false, self.cost_dist_)
|
setCost(histogram_dist[:], uint(self.distance_histogram_size), false, self.cost_dist_)
|
||||||
|
|
||||||
for i = 0; i < BROTLI_NUM_COMMAND_SYMBOLS; i++ {
|
for i = 0; i < BROTLI_NUM_COMMAND_SYMBOLS; i++ {
|
||||||
min_cost_cmd = brotli_min_float(min_cost_cmd, cost_cmd[i])
|
min_cost_cmd = brotli_min_float(min_cost_cmd, cost_cmd[i])
|
||||||
|
@ -190,7 +190,7 @@ func ZopfliCostModelSetFromCommands(self *ZopfliCostModel, position uint, ringbu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliCostModelSetFromLiteralCosts(self *ZopfliCostModel, position uint, ringbuffer []byte, ringbuffer_mask uint) {
|
func zopfliCostModelSetFromLiteralCosts(self *zopfliCostModel, position uint, ringbuffer []byte, ringbuffer_mask uint) {
|
||||||
var literal_costs []float32 = self.literal_costs_
|
var literal_costs []float32 = self.literal_costs_
|
||||||
var literal_carry float32 = 0.0
|
var literal_carry float32 = 0.0
|
||||||
var cost_dist []float32 = self.cost_dist_
|
var cost_dist []float32 = self.cost_dist_
|
||||||
|
@ -216,34 +216,34 @@ func ZopfliCostModelSetFromLiteralCosts(self *ZopfliCostModel, position uint, ri
|
||||||
self.min_cost_cmd_ = float32(FastLog2(11))
|
self.min_cost_cmd_ = float32(FastLog2(11))
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliCostModelGetCommandCost(self *ZopfliCostModel, cmdcode uint16) float32 {
|
func zopfliCostModelGetCommandCost(self *zopfliCostModel, cmdcode uint16) float32 {
|
||||||
return self.cost_cmd_[cmdcode]
|
return self.cost_cmd_[cmdcode]
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliCostModelGetDistanceCost(self *ZopfliCostModel, distcode uint) float32 {
|
func zopfliCostModelGetDistanceCost(self *zopfliCostModel, distcode uint) float32 {
|
||||||
return self.cost_dist_[distcode]
|
return self.cost_dist_[distcode]
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliCostModelGetLiteralCosts(self *ZopfliCostModel, from uint, to uint) float32 {
|
func zopfliCostModelGetLiteralCosts(self *zopfliCostModel, from uint, to uint) float32 {
|
||||||
return self.literal_costs_[to] - self.literal_costs_[from]
|
return self.literal_costs_[to] - self.literal_costs_[from]
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliCostModelGetMinCostCmd(self *ZopfliCostModel) float32 {
|
func zopfliCostModelGetMinCostCmd(self *zopfliCostModel) float32 {
|
||||||
return self.min_cost_cmd_
|
return self.min_cost_cmd_
|
||||||
}
|
}
|
||||||
|
|
||||||
/* REQUIRES: len >= 2, start_pos <= pos */
|
/* REQUIRES: len >= 2, start_pos <= pos */
|
||||||
/* REQUIRES: cost < kInfinity, nodes[start_pos].cost < kInfinity */
|
/* REQUIRES: cost < kInfinity, nodes[start_pos].cost < kInfinity */
|
||||||
/* Maintains the "ZopfliNode array invariant". */
|
/* Maintains the "ZopfliNode array invariant". */
|
||||||
func UpdateZopfliNode(nodes []ZopfliNode, pos uint, start_pos uint, len uint, len_code uint, dist uint, short_code uint, cost float32) {
|
func updateZopfliNode(nodes []zopfliNode, pos uint, start_pos uint, len uint, len_code uint, dist uint, short_code uint, cost float32) {
|
||||||
var next *ZopfliNode = &nodes[pos+len]
|
var next *zopfliNode = &nodes[pos+len]
|
||||||
next.length = uint32(len | (len+9-len_code)<<25)
|
next.length = uint32(len | (len+9-len_code)<<25)
|
||||||
next.distance = uint32(dist)
|
next.distance = uint32(dist)
|
||||||
next.dcode_insert_length = uint32(short_code<<27 | (pos - start_pos))
|
next.dcode_insert_length = uint32(short_code<<27 | (pos - start_pos))
|
||||||
next.u.cost = cost
|
next.u.cost = cost
|
||||||
}
|
}
|
||||||
|
|
||||||
type PosData struct {
|
type posData struct {
|
||||||
pos uint
|
pos uint
|
||||||
distance_cache [4]int
|
distance_cache [4]int
|
||||||
costdiff float32
|
costdiff float32
|
||||||
|
@ -251,32 +251,32 @@ type PosData struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Maintains the smallest 8 cost difference together with their positions */
|
/* Maintains the smallest 8 cost difference together with their positions */
|
||||||
type StartPosQueue struct {
|
type startPosQueue struct {
|
||||||
q_ [8]PosData
|
q_ [8]posData
|
||||||
idx_ uint
|
idx_ uint
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitStartPosQueue(self *StartPosQueue) {
|
func initStartPosQueue(self *startPosQueue) {
|
||||||
self.idx_ = 0
|
self.idx_ = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func StartPosQueueSize(self *StartPosQueue) uint {
|
func startPosQueueSize(self *startPosQueue) uint {
|
||||||
return brotli_min_size_t(self.idx_, 8)
|
return brotli_min_size_t(self.idx_, 8)
|
||||||
}
|
}
|
||||||
|
|
||||||
func StartPosQueuePush(self *StartPosQueue, posdata *PosData) {
|
func startPosQueuePush(self *startPosQueue, posdata *posData) {
|
||||||
var offset uint = ^(self.idx_) & 7
|
var offset uint = ^(self.idx_) & 7
|
||||||
self.idx_++
|
self.idx_++
|
||||||
var len uint = StartPosQueueSize(self)
|
var len uint = startPosQueueSize(self)
|
||||||
var i uint
|
var i uint
|
||||||
var q []PosData = self.q_[:]
|
var q []posData = self.q_[:]
|
||||||
q[offset] = *posdata
|
q[offset] = *posdata
|
||||||
|
|
||||||
/* Restore the sorted order. In the list of |len| items at most |len - 1|
|
/* Restore the sorted order. In the list of |len| items at most |len - 1|
|
||||||
adjacent element comparisons / swaps are required. */
|
adjacent element comparisons / swaps are required. */
|
||||||
for i = 1; i < len; i++ {
|
for i = 1; i < len; i++ {
|
||||||
if q[offset&7].costdiff > q[(offset+1)&7].costdiff {
|
if q[offset&7].costdiff > q[(offset+1)&7].costdiff {
|
||||||
var tmp PosData = q[offset&7]
|
var tmp posData = q[offset&7]
|
||||||
q[offset&7] = q[(offset+1)&7]
|
q[offset&7] = q[(offset+1)&7]
|
||||||
q[(offset+1)&7] = tmp
|
q[(offset+1)&7] = tmp
|
||||||
}
|
}
|
||||||
|
@ -285,13 +285,13 @@ func StartPosQueuePush(self *StartPosQueue, posdata *PosData) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func StartPosQueueAt(self *StartPosQueue, k uint) *PosData {
|
func startPosQueueAt(self *startPosQueue, k uint) *posData {
|
||||||
return &self.q_[(k-self.idx_)&7]
|
return &self.q_[(k-self.idx_)&7]
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the minimum possible copy length that can improve the cost of any */
|
/* Returns the minimum possible copy length that can improve the cost of any */
|
||||||
/* future position. */
|
/* future position. */
|
||||||
func ComputeMinimumCopyLength(start_cost float32, nodes []ZopfliNode, num_bytes uint, pos uint) uint {
|
func computeMinimumCopyLength(start_cost float32, nodes []zopfliNode, num_bytes uint, pos uint) uint {
|
||||||
var min_cost float32 = start_cost
|
var min_cost float32 = start_cost
|
||||||
var len uint = 2
|
var len uint = 2
|
||||||
var next_len_bucket uint = 4
|
var next_len_bucket uint = 4
|
||||||
|
@ -319,10 +319,10 @@ func ComputeMinimumCopyLength(start_cost float32, nodes []ZopfliNode, num_bytes
|
||||||
|
|
||||||
/* REQUIRES: nodes[pos].cost < kInfinity
|
/* REQUIRES: nodes[pos].cost < kInfinity
|
||||||
REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant". */
|
REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant". */
|
||||||
func ComputeDistanceShortcut(block_start uint, pos uint, max_backward_limit uint, gap uint, nodes []ZopfliNode) uint32 {
|
func computeDistanceShortcut(block_start uint, pos uint, max_backward_limit uint, gap uint, nodes []zopfliNode) uint32 {
|
||||||
var clen uint = uint(ZopfliNodeCopyLength(&nodes[pos]))
|
var clen uint = uint(zopfliNodeCopyLength(&nodes[pos]))
|
||||||
var ilen uint = uint(nodes[pos].dcode_insert_length & 0x7FFFFFF)
|
var ilen uint = uint(nodes[pos].dcode_insert_length & 0x7FFFFFF)
|
||||||
var dist uint = uint(ZopfliNodeCopyDistance(&nodes[pos]))
|
var dist uint = uint(zopfliNodeCopyDistance(&nodes[pos]))
|
||||||
|
|
||||||
/* Since |block_start + pos| is the end position of the command, the copy part
|
/* Since |block_start + pos| is the end position of the command, the copy part
|
||||||
starts from |block_start + pos - clen|. Distances that are greater than
|
starts from |block_start + pos - clen|. Distances that are greater than
|
||||||
|
@ -331,7 +331,7 @@ func ComputeDistanceShortcut(block_start uint, pos uint, max_backward_limit uint
|
||||||
Also distance code 0 (last distance) does not update the last distances. */
|
Also distance code 0 (last distance) does not update the last distances. */
|
||||||
if pos == 0 {
|
if pos == 0 {
|
||||||
return 0
|
return 0
|
||||||
} else if dist+clen <= block_start+pos+gap && dist <= max_backward_limit+gap && ZopfliNodeDistanceCode(&nodes[pos]) > 0 {
|
} else if dist+clen <= block_start+pos+gap && dist <= max_backward_limit+gap && zopfliNodeDistanceCode(&nodes[pos]) > 0 {
|
||||||
return uint32(pos)
|
return uint32(pos)
|
||||||
} else {
|
} else {
|
||||||
return nodes[pos-clen-ilen].u.shortcut
|
return nodes[pos-clen-ilen].u.shortcut
|
||||||
|
@ -345,13 +345,13 @@ func ComputeDistanceShortcut(block_start uint, pos uint, max_backward_limit uint
|
||||||
starting_dist_cache[0..3].
|
starting_dist_cache[0..3].
|
||||||
REQUIRES: nodes[pos].cost < kInfinity
|
REQUIRES: nodes[pos].cost < kInfinity
|
||||||
REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant". */
|
REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant". */
|
||||||
func ComputeDistanceCache(pos uint, starting_dist_cache []int, nodes []ZopfliNode, dist_cache []int) {
|
func computeDistanceCache(pos uint, starting_dist_cache []int, nodes []zopfliNode, dist_cache []int) {
|
||||||
var idx int = 0
|
var idx int = 0
|
||||||
var p uint = uint(nodes[pos].u.shortcut)
|
var p uint = uint(nodes[pos].u.shortcut)
|
||||||
for idx < 4 && p > 0 {
|
for idx < 4 && p > 0 {
|
||||||
var ilen uint = uint(nodes[p].dcode_insert_length & 0x7FFFFFF)
|
var ilen uint = uint(nodes[p].dcode_insert_length & 0x7FFFFFF)
|
||||||
var clen uint = uint(ZopfliNodeCopyLength(&nodes[p]))
|
var clen uint = uint(zopfliNodeCopyLength(&nodes[p]))
|
||||||
var dist uint = uint(ZopfliNodeCopyDistance(&nodes[p]))
|
var dist uint = uint(zopfliNodeCopyDistance(&nodes[p]))
|
||||||
dist_cache[idx] = int(dist)
|
dist_cache[idx] = int(dist)
|
||||||
idx++
|
idx++
|
||||||
|
|
||||||
|
@ -367,22 +367,22 @@ func ComputeDistanceCache(pos uint, starting_dist_cache []int, nodes []ZopfliNod
|
||||||
|
|
||||||
/* Maintains "ZopfliNode array invariant" and pushes node to the queue, if it
|
/* Maintains "ZopfliNode array invariant" and pushes node to the queue, if it
|
||||||
is eligible. */
|
is eligible. */
|
||||||
func EvaluateNode(block_start uint, pos uint, max_backward_limit uint, gap uint, starting_dist_cache []int, model *ZopfliCostModel, queue *StartPosQueue, nodes []ZopfliNode) {
|
func evaluateNode(block_start uint, pos uint, max_backward_limit uint, gap uint, starting_dist_cache []int, model *zopfliCostModel, queue *startPosQueue, nodes []zopfliNode) {
|
||||||
/* Save cost, because ComputeDistanceCache invalidates it. */
|
/* Save cost, because ComputeDistanceCache invalidates it. */
|
||||||
var node_cost float32 = nodes[pos].u.cost
|
var node_cost float32 = nodes[pos].u.cost
|
||||||
nodes[pos].u.shortcut = ComputeDistanceShortcut(block_start, pos, max_backward_limit, gap, nodes)
|
nodes[pos].u.shortcut = computeDistanceShortcut(block_start, pos, max_backward_limit, gap, nodes)
|
||||||
if node_cost <= ZopfliCostModelGetLiteralCosts(model, 0, pos) {
|
if node_cost <= zopfliCostModelGetLiteralCosts(model, 0, pos) {
|
||||||
var posdata PosData
|
var posdata posData
|
||||||
posdata.pos = pos
|
posdata.pos = pos
|
||||||
posdata.cost = node_cost
|
posdata.cost = node_cost
|
||||||
posdata.costdiff = node_cost - ZopfliCostModelGetLiteralCosts(model, 0, pos)
|
posdata.costdiff = node_cost - zopfliCostModelGetLiteralCosts(model, 0, pos)
|
||||||
ComputeDistanceCache(pos, starting_dist_cache, nodes, posdata.distance_cache[:])
|
computeDistanceCache(pos, starting_dist_cache, nodes, posdata.distance_cache[:])
|
||||||
StartPosQueuePush(queue, &posdata)
|
startPosQueuePush(queue, &posdata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns longest copy length. */
|
/* Returns longest copy length. */
|
||||||
func UpdateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, max_backward_limit uint, starting_dist_cache []int, num_matches uint, matches []BackwardMatch, model *ZopfliCostModel, queue *StartPosQueue, nodes []ZopfliNode) uint {
|
func updateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, max_backward_limit uint, starting_dist_cache []int, num_matches uint, matches []BackwardMatch, model *zopfliCostModel, queue *startPosQueue, nodes []zopfliNode) uint {
|
||||||
var cur_ix uint = block_start + pos
|
var cur_ix uint = block_start + pos
|
||||||
var cur_ix_masked uint = cur_ix & ringbuffer_mask
|
var cur_ix_masked uint = cur_ix & ringbuffer_mask
|
||||||
var max_distance uint = brotli_min_size_t(cur_ix, max_backward_limit)
|
var max_distance uint = brotli_min_size_t(cur_ix, max_backward_limit)
|
||||||
|
@ -394,21 +394,21 @@ func UpdateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte,
|
||||||
var k uint
|
var k uint
|
||||||
var gap uint = 0
|
var gap uint = 0
|
||||||
|
|
||||||
EvaluateNode(block_start, pos, max_backward_limit, gap, starting_dist_cache, model, queue, nodes)
|
evaluateNode(block_start, pos, max_backward_limit, gap, starting_dist_cache, model, queue, nodes)
|
||||||
{
|
{
|
||||||
var posdata *PosData = StartPosQueueAt(queue, 0)
|
var posdata *posData = startPosQueueAt(queue, 0)
|
||||||
var min_cost float32 = (posdata.cost + ZopfliCostModelGetMinCostCmd(model) + ZopfliCostModelGetLiteralCosts(model, posdata.pos, pos))
|
var min_cost float32 = (posdata.cost + zopfliCostModelGetMinCostCmd(model) + zopfliCostModelGetLiteralCosts(model, posdata.pos, pos))
|
||||||
min_len = ComputeMinimumCopyLength(min_cost, nodes, num_bytes, pos)
|
min_len = computeMinimumCopyLength(min_cost, nodes, num_bytes, pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Go over the command starting positions in order of increasing cost
|
/* Go over the command starting positions in order of increasing cost
|
||||||
difference. */
|
difference. */
|
||||||
for k = 0; k < max_iters && k < StartPosQueueSize(queue); k++ {
|
for k = 0; k < max_iters && k < startPosQueueSize(queue); k++ {
|
||||||
var posdata *PosData = StartPosQueueAt(queue, k)
|
var posdata *posData = startPosQueueAt(queue, k)
|
||||||
var start uint = posdata.pos
|
var start uint = posdata.pos
|
||||||
var inscode uint16 = GetInsertLengthCode(pos - start)
|
var inscode uint16 = GetInsertLengthCode(pos - start)
|
||||||
var start_costdiff float32 = posdata.costdiff
|
var start_costdiff float32 = posdata.costdiff
|
||||||
var base_cost float32 = start_costdiff + float32(GetInsertExtra(inscode)) + ZopfliCostModelGetLiteralCosts(model, 0, pos)
|
var base_cost float32 = start_costdiff + float32(GetInsertExtra(inscode)) + zopfliCostModelGetLiteralCosts(model, 0, pos)
|
||||||
var best_len uint = min_len - 1
|
var best_len uint = min_len - 1
|
||||||
var j uint = 0
|
var j uint = 0
|
||||||
/* Look for last distance matches using the distance cache from this
|
/* Look for last distance matches using the distance cache from this
|
||||||
|
@ -444,7 +444,7 @@ func UpdateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte,
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var dist_cost float32 = base_cost + ZopfliCostModelGetDistanceCost(model, j)
|
var dist_cost float32 = base_cost + zopfliCostModelGetDistanceCost(model, j)
|
||||||
var l uint
|
var l uint
|
||||||
for l = best_len + 1; l <= len; l++ {
|
for l = best_len + 1; l <= len; l++ {
|
||||||
var copycode uint16 = GetCopyLengthCode(l)
|
var copycode uint16 = GetCopyLengthCode(l)
|
||||||
|
@ -455,9 +455,9 @@ func UpdateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte,
|
||||||
} else {
|
} else {
|
||||||
tmp = dist_cost
|
tmp = dist_cost
|
||||||
}
|
}
|
||||||
var cost float32 = tmp + float32(GetCopyExtra(copycode)) + ZopfliCostModelGetCommandCost(model, cmdcode)
|
var cost float32 = tmp + float32(GetCopyExtra(copycode)) + zopfliCostModelGetCommandCost(model, cmdcode)
|
||||||
if cost < nodes[pos+l].u.cost {
|
if cost < nodes[pos+l].u.cost {
|
||||||
UpdateZopfliNode(nodes, pos, start, l, l, backward, j+1, cost)
|
updateZopfliNode(nodes, pos, start, l, l, backward, j+1, cost)
|
||||||
result = brotli_max_size_t(result, l)
|
result = brotli_max_size_t(result, l)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,7 +490,7 @@ func UpdateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte,
|
||||||
PrefixEncodeCopyDistance(dist_code, uint(params.dist.num_direct_distance_codes), uint(params.dist.distance_postfix_bits), &dist_symbol, &distextra)
|
PrefixEncodeCopyDistance(dist_code, uint(params.dist.num_direct_distance_codes), uint(params.dist.distance_postfix_bits), &dist_symbol, &distextra)
|
||||||
|
|
||||||
distnumextra = uint32(dist_symbol) >> 10
|
distnumextra = uint32(dist_symbol) >> 10
|
||||||
dist_cost = base_cost + float32(distnumextra) + ZopfliCostModelGetDistanceCost(model, uint(dist_symbol)&0x3FF)
|
dist_cost = base_cost + float32(distnumextra) + zopfliCostModelGetDistanceCost(model, uint(dist_symbol)&0x3FF)
|
||||||
|
|
||||||
/* Try all copy lengths up until the maximum copy length corresponding
|
/* Try all copy lengths up until the maximum copy length corresponding
|
||||||
to this distance. If the distance refers to the static dictionary, or
|
to this distance. If the distance refers to the static dictionary, or
|
||||||
|
@ -510,9 +510,9 @@ func UpdateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte,
|
||||||
}
|
}
|
||||||
var copycode uint16 = GetCopyLengthCode(len_code)
|
var copycode uint16 = GetCopyLengthCode(len_code)
|
||||||
var cmdcode uint16 = CombineLengthCodes(inscode, copycode, false)
|
var cmdcode uint16 = CombineLengthCodes(inscode, copycode, false)
|
||||||
var cost float32 = dist_cost + float32(GetCopyExtra(copycode)) + ZopfliCostModelGetCommandCost(model, cmdcode)
|
var cost float32 = dist_cost + float32(GetCopyExtra(copycode)) + zopfliCostModelGetCommandCost(model, cmdcode)
|
||||||
if cost < nodes[pos+len].u.cost {
|
if cost < nodes[pos+len].u.cost {
|
||||||
UpdateZopfliNode(nodes, pos, start, uint(len), len_code, dist, 0, cost)
|
updateZopfliNode(nodes, pos, start, uint(len), len_code, dist, 0, cost)
|
||||||
result = brotli_max_size_t(result, uint(len))
|
result = brotli_max_size_t(result, uint(len))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -523,7 +523,7 @@ func UpdateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte,
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func ComputeShortestPathFromNodes(num_bytes uint, nodes []ZopfliNode) uint {
|
func computeShortestPathFromNodes(num_bytes uint, nodes []zopfliNode) uint {
|
||||||
var index uint = num_bytes
|
var index uint = num_bytes
|
||||||
var num_commands uint = 0
|
var num_commands uint = 0
|
||||||
for nodes[index].dcode_insert_length&0x7FFFFFF == 0 && nodes[index].length == 1 {
|
for nodes[index].dcode_insert_length&0x7FFFFFF == 0 && nodes[index].length == 1 {
|
||||||
|
@ -531,7 +531,7 @@ func ComputeShortestPathFromNodes(num_bytes uint, nodes []ZopfliNode) uint {
|
||||||
}
|
}
|
||||||
nodes[index].u.next = BROTLI_UINT32_MAX
|
nodes[index].u.next = BROTLI_UINT32_MAX
|
||||||
for index != 0 {
|
for index != 0 {
|
||||||
var len uint = uint(ZopfliNodeCommandLength(&nodes[index]))
|
var len uint = uint(zopfliNodeCommandLength(&nodes[index]))
|
||||||
index -= uint(len)
|
index -= uint(len)
|
||||||
nodes[index].u.next = uint32(len)
|
nodes[index].u.next = uint32(len)
|
||||||
num_commands++
|
num_commands++
|
||||||
|
@ -541,15 +541,15 @@ func ComputeShortestPathFromNodes(num_bytes uint, nodes []ZopfliNode) uint {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */
|
/* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */
|
||||||
func BrotliZopfliCreateCommands(num_bytes uint, block_start uint, nodes []ZopfliNode, dist_cache []int, last_insert_len *uint, params *BrotliEncoderParams, commands []Command, num_literals *uint) {
|
func zopfliCreateCommands(num_bytes uint, block_start uint, nodes []zopfliNode, dist_cache []int, last_insert_len *uint, params *BrotliEncoderParams, commands []Command, num_literals *uint) {
|
||||||
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
||||||
var pos uint = 0
|
var pos uint = 0
|
||||||
var offset uint32 = nodes[0].u.next
|
var offset uint32 = nodes[0].u.next
|
||||||
var i uint
|
var i uint
|
||||||
var gap uint = 0
|
var gap uint = 0
|
||||||
for i = 0; offset != BROTLI_UINT32_MAX; i++ {
|
for i = 0; offset != BROTLI_UINT32_MAX; i++ {
|
||||||
var next *ZopfliNode = &nodes[uint32(pos)+offset]
|
var next *zopfliNode = &nodes[uint32(pos)+offset]
|
||||||
var copy_length uint = uint(ZopfliNodeCopyLength(next))
|
var copy_length uint = uint(zopfliNodeCopyLength(next))
|
||||||
var insert_length uint = uint(next.dcode_insert_length & 0x7FFFFFF)
|
var insert_length uint = uint(next.dcode_insert_length & 0x7FFFFFF)
|
||||||
pos += insert_length
|
pos += insert_length
|
||||||
offset = next.u.next
|
offset = next.u.next
|
||||||
|
@ -558,11 +558,11 @@ func BrotliZopfliCreateCommands(num_bytes uint, block_start uint, nodes []Zopfli
|
||||||
*last_insert_len = 0
|
*last_insert_len = 0
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var distance uint = uint(ZopfliNodeCopyDistance(next))
|
var distance uint = uint(zopfliNodeCopyDistance(next))
|
||||||
var len_code uint = uint(ZopfliNodeLengthCode(next))
|
var len_code uint = uint(zopfliNodeLengthCode(next))
|
||||||
var max_distance uint = brotli_min_size_t(block_start+pos, max_backward_limit)
|
var max_distance uint = brotli_min_size_t(block_start+pos, max_backward_limit)
|
||||||
var is_dictionary bool = (distance > max_distance+gap)
|
var is_dictionary bool = (distance > max_distance+gap)
|
||||||
var dist_code uint = uint(ZopfliNodeDistanceCode(next))
|
var dist_code uint = uint(zopfliNodeDistanceCode(next))
|
||||||
InitCommand(&commands[i], ¶ms.dist, insert_length, copy_length, int(len_code)-int(copy_length), dist_code)
|
InitCommand(&commands[i], ¶ms.dist, insert_length, copy_length, int(len_code)-int(copy_length), dist_code)
|
||||||
|
|
||||||
if !is_dictionary && dist_code > 0 {
|
if !is_dictionary && dist_code > 0 {
|
||||||
|
@ -580,17 +580,17 @@ func BrotliZopfliCreateCommands(num_bytes uint, block_start uint, nodes []Zopfli
|
||||||
*last_insert_len += num_bytes - pos
|
*last_insert_len += num_bytes - pos
|
||||||
}
|
}
|
||||||
|
|
||||||
func ZopfliIterate(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, gap uint, dist_cache []int, model *ZopfliCostModel, num_matches []uint32, matches []BackwardMatch, nodes []ZopfliNode) uint {
|
func zopfliIterate(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, gap uint, dist_cache []int, model *zopfliCostModel, num_matches []uint32, matches []BackwardMatch, nodes []zopfliNode) uint {
|
||||||
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
||||||
var max_zopfli_len uint = MaxZopfliLen(params)
|
var max_zopfli_len uint = MaxZopfliLen(params)
|
||||||
var queue StartPosQueue
|
var queue startPosQueue
|
||||||
var cur_match_pos uint = 0
|
var cur_match_pos uint = 0
|
||||||
var i uint
|
var i uint
|
||||||
nodes[0].length = 0
|
nodes[0].length = 0
|
||||||
nodes[0].u.cost = 0
|
nodes[0].u.cost = 0
|
||||||
InitStartPosQueue(&queue)
|
initStartPosQueue(&queue)
|
||||||
for i = 0; i+3 < num_bytes; i++ {
|
for i = 0; i+3 < num_bytes; i++ {
|
||||||
var skip uint = UpdateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, uint(num_matches[i]), matches[cur_match_pos:], model, &queue, nodes)
|
var skip uint = updateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, uint(num_matches[i]), matches[cur_match_pos:], model, &queue, nodes)
|
||||||
if skip < BROTLI_LONG_COPY_QUICK_STEP {
|
if skip < BROTLI_LONG_COPY_QUICK_STEP {
|
||||||
skip = 0
|
skip = 0
|
||||||
}
|
}
|
||||||
|
@ -606,22 +606,22 @@ func ZopfliIterate(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_
|
||||||
if i+3 >= num_bytes {
|
if i+3 >= num_bytes {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
EvaluateNode(position, i, max_backward_limit, gap, dist_cache, model, &queue, nodes)
|
evaluateNode(position, i, max_backward_limit, gap, dist_cache, model, &queue, nodes)
|
||||||
cur_match_pos += uint(num_matches[i])
|
cur_match_pos += uint(num_matches[i])
|
||||||
skip--
|
skip--
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ComputeShortestPathFromNodes(num_bytes, nodes)
|
return computeShortestPathFromNodes(num_bytes, nodes)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */
|
/* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */
|
||||||
func BrotliZopfliComputeShortestPath(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, dist_cache []int, hasher *H10, nodes []ZopfliNode) uint {
|
func zopfliComputeShortestPath(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, dist_cache []int, hasher *H10, nodes []zopfliNode) uint {
|
||||||
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
||||||
var max_zopfli_len uint = MaxZopfliLen(params)
|
var max_zopfli_len uint = MaxZopfliLen(params)
|
||||||
var model ZopfliCostModel
|
var model zopfliCostModel
|
||||||
var queue StartPosQueue
|
var queue startPosQueue
|
||||||
var matches [2 * (MAX_NUM_MATCHES_H10 + 64)]BackwardMatch
|
var matches [2 * (MAX_NUM_MATCHES_H10 + 64)]BackwardMatch
|
||||||
var store_end uint
|
var store_end uint
|
||||||
if num_bytes >= hasher.StoreLookahead() {
|
if num_bytes >= hasher.StoreLookahead() {
|
||||||
|
@ -634,9 +634,9 @@ func BrotliZopfliComputeShortestPath(num_bytes uint, position uint, ringbuffer [
|
||||||
var lz_matches_offset uint = 0
|
var lz_matches_offset uint = 0
|
||||||
nodes[0].length = 0
|
nodes[0].length = 0
|
||||||
nodes[0].u.cost = 0
|
nodes[0].u.cost = 0
|
||||||
InitZopfliCostModel(&model, ¶ms.dist, num_bytes)
|
initZopfliCostModel(&model, ¶ms.dist, num_bytes)
|
||||||
ZopfliCostModelSetFromLiteralCosts(&model, position, ringbuffer, ringbuffer_mask)
|
zopfliCostModelSetFromLiteralCosts(&model, position, ringbuffer, ringbuffer_mask)
|
||||||
InitStartPosQueue(&queue)
|
initStartPosQueue(&queue)
|
||||||
for i = 0; i+hasher.HashTypeLength()-1 < num_bytes; i++ {
|
for i = 0; i+hasher.HashTypeLength()-1 < num_bytes; i++ {
|
||||||
var pos uint = position + i
|
var pos uint = position + i
|
||||||
var max_distance uint = brotli_min_size_t(pos, max_backward_limit)
|
var max_distance uint = brotli_min_size_t(pos, max_backward_limit)
|
||||||
|
@ -648,7 +648,7 @@ func BrotliZopfliComputeShortestPath(num_bytes uint, position uint, ringbuffer [
|
||||||
num_matches = 1
|
num_matches = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
skip = UpdateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches, matches[:], &model, &queue, nodes)
|
skip = updateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches, matches[:], &model, &queue, nodes)
|
||||||
if skip < BROTLI_LONG_COPY_QUICK_STEP {
|
if skip < BROTLI_LONG_COPY_QUICK_STEP {
|
||||||
skip = 0
|
skip = 0
|
||||||
}
|
}
|
||||||
|
@ -666,26 +666,26 @@ func BrotliZopfliComputeShortestPath(num_bytes uint, position uint, ringbuffer [
|
||||||
if i+hasher.HashTypeLength()-1 >= num_bytes {
|
if i+hasher.HashTypeLength()-1 >= num_bytes {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
EvaluateNode(position, i, max_backward_limit, gap, dist_cache, &model, &queue, nodes)
|
evaluateNode(position, i, max_backward_limit, gap, dist_cache, &model, &queue, nodes)
|
||||||
skip--
|
skip--
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CleanupZopfliCostModel(&model)
|
cleanupZopfliCostModel(&model)
|
||||||
return ComputeShortestPathFromNodes(num_bytes, nodes)
|
return computeShortestPathFromNodes(num_bytes, nodes)
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliCreateZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, hasher *H10, dist_cache []int, last_insert_len *uint, commands []Command, num_commands *uint, num_literals *uint) {
|
func createZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, hasher *H10, dist_cache []int, last_insert_len *uint, commands []Command, num_commands *uint, num_literals *uint) {
|
||||||
var nodes []ZopfliNode
|
var nodes []zopfliNode
|
||||||
nodes = make([]ZopfliNode, (num_bytes + 1))
|
nodes = make([]zopfliNode, (num_bytes + 1))
|
||||||
BrotliInitZopfliNodes(nodes, num_bytes+1)
|
initZopfliNodes(nodes, num_bytes+1)
|
||||||
*num_commands += BrotliZopfliComputeShortestPath(num_bytes, position, ringbuffer, ringbuffer_mask, params, dist_cache, hasher, nodes)
|
*num_commands += zopfliComputeShortestPath(num_bytes, position, ringbuffer, ringbuffer_mask, params, dist_cache, hasher, nodes)
|
||||||
BrotliZopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals)
|
zopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals)
|
||||||
nodes = nil
|
nodes = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliCreateHqZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, hasher HasherHandle, dist_cache []int, last_insert_len *uint, commands []Command, num_commands *uint, num_literals *uint) {
|
func createHqZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *BrotliEncoderParams, hasher HasherHandle, dist_cache []int, last_insert_len *uint, commands []Command, num_commands *uint, num_literals *uint) {
|
||||||
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
var max_backward_limit uint = BROTLI_MAX_BACKWARD_LIMIT(params.lgwin)
|
||||||
var num_matches []uint32 = make([]uint32, num_bytes)
|
var num_matches []uint32 = make([]uint32, num_bytes)
|
||||||
var matches_size uint = 4 * num_bytes
|
var matches_size uint = 4 * num_bytes
|
||||||
|
@ -701,8 +701,8 @@ func BrotliCreateHqZopfliBackwardReferences(num_bytes uint, position uint, ringb
|
||||||
var orig_last_insert_len uint
|
var orig_last_insert_len uint
|
||||||
var orig_dist_cache [4]int
|
var orig_dist_cache [4]int
|
||||||
var orig_num_commands uint
|
var orig_num_commands uint
|
||||||
var model ZopfliCostModel
|
var model zopfliCostModel
|
||||||
var nodes []ZopfliNode
|
var nodes []zopfliNode
|
||||||
var matches []BackwardMatch = make([]BackwardMatch, matches_size)
|
var matches []BackwardMatch = make([]BackwardMatch, matches_size)
|
||||||
var gap uint = 0
|
var gap uint = 0
|
||||||
var shadow_matches uint = 0
|
var shadow_matches uint = 0
|
||||||
|
@ -767,25 +767,25 @@ func BrotliCreateHqZopfliBackwardReferences(num_bytes uint, position uint, ringb
|
||||||
orig_last_insert_len = *last_insert_len
|
orig_last_insert_len = *last_insert_len
|
||||||
copy(orig_dist_cache[:], dist_cache[:4])
|
copy(orig_dist_cache[:], dist_cache[:4])
|
||||||
orig_num_commands = *num_commands
|
orig_num_commands = *num_commands
|
||||||
nodes = make([]ZopfliNode, (num_bytes + 1))
|
nodes = make([]zopfliNode, (num_bytes + 1))
|
||||||
InitZopfliCostModel(&model, ¶ms.dist, num_bytes)
|
initZopfliCostModel(&model, ¶ms.dist, num_bytes)
|
||||||
for i = 0; i < 2; i++ {
|
for i = 0; i < 2; i++ {
|
||||||
BrotliInitZopfliNodes(nodes, num_bytes+1)
|
initZopfliNodes(nodes, num_bytes+1)
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
ZopfliCostModelSetFromLiteralCosts(&model, position, ringbuffer, ringbuffer_mask)
|
zopfliCostModelSetFromLiteralCosts(&model, position, ringbuffer, ringbuffer_mask)
|
||||||
} else {
|
} else {
|
||||||
ZopfliCostModelSetFromCommands(&model, position, ringbuffer, ringbuffer_mask, commands, *num_commands-orig_num_commands, orig_last_insert_len)
|
zopfliCostModelSetFromCommands(&model, position, ringbuffer, ringbuffer_mask, commands, *num_commands-orig_num_commands, orig_last_insert_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
*num_commands = orig_num_commands
|
*num_commands = orig_num_commands
|
||||||
*num_literals = orig_num_literals
|
*num_literals = orig_num_literals
|
||||||
*last_insert_len = orig_last_insert_len
|
*last_insert_len = orig_last_insert_len
|
||||||
copy(dist_cache, orig_dist_cache[:4])
|
copy(dist_cache, orig_dist_cache[:4])
|
||||||
*num_commands += ZopfliIterate(num_bytes, position, ringbuffer, ringbuffer_mask, params, gap, dist_cache, &model, num_matches, matches, nodes)
|
*num_commands += zopfliIterate(num_bytes, position, ringbuffer, ringbuffer_mask, params, gap, dist_cache, &model, num_matches, matches, nodes)
|
||||||
BrotliZopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals)
|
zopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals)
|
||||||
}
|
}
|
||||||
|
|
||||||
CleanupZopfliCostModel(&model)
|
cleanupZopfliCostModel(&model)
|
||||||
nodes = nil
|
nodes = nil
|
||||||
matches = nil
|
matches = nil
|
||||||
num_matches = nil
|
num_matches = nil
|
||||||
|
|
66
bit_cost.go
66
bit_cost.go
|
@ -14,7 +14,7 @@ package brotli
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Functions to estimate the bit cost of Huffman trees. */
|
/* Functions to estimate the bit cost of Huffman trees. */
|
||||||
func ShannonEntropy(population []uint32, size uint, total *uint) float64 {
|
func shannonEntropy(population []uint32, size uint, total *uint) float64 {
|
||||||
var sum uint = 0
|
var sum uint = 0
|
||||||
var retval float64 = 0
|
var retval float64 = 0
|
||||||
var population_end []uint32 = population[size:]
|
var population_end []uint32 = population[size:]
|
||||||
|
@ -33,9 +33,9 @@ func ShannonEntropy(population []uint32, size uint, total *uint) float64 {
|
||||||
return retval
|
return retval
|
||||||
}
|
}
|
||||||
|
|
||||||
func BitsEntropy(population []uint32, size uint) float64 {
|
func bitsEntropy(population []uint32, size uint) float64 {
|
||||||
var sum uint
|
var sum uint
|
||||||
var retval float64 = ShannonEntropy(population, size, &sum)
|
var retval float64 = shannonEntropy(population, size, &sum)
|
||||||
if retval < float64(sum) {
|
if retval < float64(sum) {
|
||||||
/* At least one bit per literal is needed. */
|
/* At least one bit per literal is needed. */
|
||||||
retval = float64(sum)
|
retval = float64(sum)
|
||||||
|
@ -44,19 +44,19 @@ func BitsEntropy(population []uint32, size uint) float64 {
|
||||||
return retval
|
return retval
|
||||||
}
|
}
|
||||||
|
|
||||||
var BrotliPopulationCostLiteral_kOneSymbolHistogramCost float64 = 12
|
const kOneSymbolHistogramCost float64 = 12
|
||||||
var BrotliPopulationCostLiteral_kTwoSymbolHistogramCost float64 = 20
|
const kTwoSymbolHistogramCost float64 = 20
|
||||||
var BrotliPopulationCostLiteral_kThreeSymbolHistogramCost float64 = 28
|
const kThreeSymbolHistogramCost float64 = 28
|
||||||
var BrotliPopulationCostLiteral_kFourSymbolHistogramCost float64 = 37
|
const kFourSymbolHistogramCost float64 = 37
|
||||||
|
|
||||||
func BrotliPopulationCostLiteral(histogram *HistogramLiteral) float64 {
|
func populationCostLiteral(histogram *HistogramLiteral) float64 {
|
||||||
var data_size uint = HistogramDataSizeLiteral()
|
var data_size uint = HistogramDataSizeLiteral()
|
||||||
var count int = 0
|
var count int = 0
|
||||||
var s [5]uint
|
var s [5]uint
|
||||||
var bits float64 = 0.0
|
var bits float64 = 0.0
|
||||||
var i uint
|
var i uint
|
||||||
if histogram.total_count_ == 0 {
|
if histogram.total_count_ == 0 {
|
||||||
return BrotliPopulationCostLiteral_kOneSymbolHistogramCost
|
return kOneSymbolHistogramCost
|
||||||
}
|
}
|
||||||
|
|
||||||
for i = 0; i < data_size; i++ {
|
for i = 0; i < data_size; i++ {
|
||||||
|
@ -70,11 +70,11 @@ func BrotliPopulationCostLiteral(histogram *HistogramLiteral) float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 1 {
|
if count == 1 {
|
||||||
return BrotliPopulationCostLiteral_kOneSymbolHistogramCost
|
return kOneSymbolHistogramCost
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 2 {
|
if count == 2 {
|
||||||
return BrotliPopulationCostLiteral_kTwoSymbolHistogramCost + float64(histogram.total_count_)
|
return kTwoSymbolHistogramCost + float64(histogram.total_count_)
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 3 {
|
if count == 3 {
|
||||||
|
@ -82,7 +82,7 @@ func BrotliPopulationCostLiteral(histogram *HistogramLiteral) float64 {
|
||||||
var histo1 uint32 = histogram.data_[s[1]]
|
var histo1 uint32 = histogram.data_[s[1]]
|
||||||
var histo2 uint32 = histogram.data_[s[2]]
|
var histo2 uint32 = histogram.data_[s[2]]
|
||||||
var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
|
var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
|
||||||
return BrotliPopulationCostLiteral_kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
|
return kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 4 {
|
if count == 4 {
|
||||||
|
@ -107,7 +107,7 @@ func BrotliPopulationCostLiteral(histogram *HistogramLiteral) float64 {
|
||||||
|
|
||||||
h23 = histo[2] + histo[3]
|
h23 = histo[2] + histo[3]
|
||||||
histomax = brotli_max_uint32_t(h23, histo[0])
|
histomax = brotli_max_uint32_t(h23, histo[0])
|
||||||
return BrotliPopulationCostLiteral_kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
|
return kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var max_depth uint = 1
|
var max_depth uint = 1
|
||||||
|
@ -174,25 +174,20 @@ func BrotliPopulationCostLiteral(histogram *HistogramLiteral) float64 {
|
||||||
bits += float64(18 + 2*max_depth)
|
bits += float64(18 + 2*max_depth)
|
||||||
|
|
||||||
/* Add the entropy of the code length code histogram. */
|
/* Add the entropy of the code length code histogram. */
|
||||||
bits += BitsEntropy(depth_histo[:], BROTLI_CODE_LENGTH_CODES)
|
bits += bitsEntropy(depth_histo[:], BROTLI_CODE_LENGTH_CODES)
|
||||||
}
|
}
|
||||||
|
|
||||||
return bits
|
return bits
|
||||||
}
|
}
|
||||||
|
|
||||||
var BrotliPopulationCostCommand_kOneSymbolHistogramCost float64 = 12
|
func populationCostCommand(histogram *HistogramCommand) float64 {
|
||||||
var BrotliPopulationCostCommand_kTwoSymbolHistogramCost float64 = 20
|
|
||||||
var BrotliPopulationCostCommand_kThreeSymbolHistogramCost float64 = 28
|
|
||||||
var BrotliPopulationCostCommand_kFourSymbolHistogramCost float64 = 37
|
|
||||||
|
|
||||||
func BrotliPopulationCostCommand(histogram *HistogramCommand) float64 {
|
|
||||||
var data_size uint = HistogramDataSizeCommand()
|
var data_size uint = HistogramDataSizeCommand()
|
||||||
var count int = 0
|
var count int = 0
|
||||||
var s [5]uint
|
var s [5]uint
|
||||||
var bits float64 = 0.0
|
var bits float64 = 0.0
|
||||||
var i uint
|
var i uint
|
||||||
if histogram.total_count_ == 0 {
|
if histogram.total_count_ == 0 {
|
||||||
return BrotliPopulationCostCommand_kOneSymbolHistogramCost
|
return kOneSymbolHistogramCost
|
||||||
}
|
}
|
||||||
|
|
||||||
for i = 0; i < data_size; i++ {
|
for i = 0; i < data_size; i++ {
|
||||||
|
@ -206,11 +201,11 @@ func BrotliPopulationCostCommand(histogram *HistogramCommand) float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 1 {
|
if count == 1 {
|
||||||
return BrotliPopulationCostCommand_kOneSymbolHistogramCost
|
return kOneSymbolHistogramCost
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 2 {
|
if count == 2 {
|
||||||
return BrotliPopulationCostCommand_kTwoSymbolHistogramCost + float64(histogram.total_count_)
|
return kTwoSymbolHistogramCost + float64(histogram.total_count_)
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 3 {
|
if count == 3 {
|
||||||
|
@ -218,7 +213,7 @@ func BrotliPopulationCostCommand(histogram *HistogramCommand) float64 {
|
||||||
var histo1 uint32 = histogram.data_[s[1]]
|
var histo1 uint32 = histogram.data_[s[1]]
|
||||||
var histo2 uint32 = histogram.data_[s[2]]
|
var histo2 uint32 = histogram.data_[s[2]]
|
||||||
var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
|
var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
|
||||||
return BrotliPopulationCostCommand_kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
|
return kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 4 {
|
if count == 4 {
|
||||||
|
@ -243,7 +238,7 @@ func BrotliPopulationCostCommand(histogram *HistogramCommand) float64 {
|
||||||
|
|
||||||
h23 = histo[2] + histo[3]
|
h23 = histo[2] + histo[3]
|
||||||
histomax = brotli_max_uint32_t(h23, histo[0])
|
histomax = brotli_max_uint32_t(h23, histo[0])
|
||||||
return BrotliPopulationCostCommand_kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
|
return kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var max_depth uint = 1
|
var max_depth uint = 1
|
||||||
|
@ -310,25 +305,20 @@ func BrotliPopulationCostCommand(histogram *HistogramCommand) float64 {
|
||||||
bits += float64(18 + 2*max_depth)
|
bits += float64(18 + 2*max_depth)
|
||||||
|
|
||||||
/* Add the entropy of the code length code histogram. */
|
/* Add the entropy of the code length code histogram. */
|
||||||
bits += BitsEntropy(depth_histo[:], BROTLI_CODE_LENGTH_CODES)
|
bits += bitsEntropy(depth_histo[:], BROTLI_CODE_LENGTH_CODES)
|
||||||
}
|
}
|
||||||
|
|
||||||
return bits
|
return bits
|
||||||
}
|
}
|
||||||
|
|
||||||
var BrotliPopulationCostDistance_kOneSymbolHistogramCost float64 = 12
|
func populationCostDistance(histogram *HistogramDistance) float64 {
|
||||||
var BrotliPopulationCostDistance_kTwoSymbolHistogramCost float64 = 20
|
|
||||||
var BrotliPopulationCostDistance_kThreeSymbolHistogramCost float64 = 28
|
|
||||||
var BrotliPopulationCostDistance_kFourSymbolHistogramCost float64 = 37
|
|
||||||
|
|
||||||
func BrotliPopulationCostDistance(histogram *HistogramDistance) float64 {
|
|
||||||
var data_size uint = HistogramDataSizeDistance()
|
var data_size uint = HistogramDataSizeDistance()
|
||||||
var count int = 0
|
var count int = 0
|
||||||
var s [5]uint
|
var s [5]uint
|
||||||
var bits float64 = 0.0
|
var bits float64 = 0.0
|
||||||
var i uint
|
var i uint
|
||||||
if histogram.total_count_ == 0 {
|
if histogram.total_count_ == 0 {
|
||||||
return BrotliPopulationCostDistance_kOneSymbolHistogramCost
|
return kOneSymbolHistogramCost
|
||||||
}
|
}
|
||||||
|
|
||||||
for i = 0; i < data_size; i++ {
|
for i = 0; i < data_size; i++ {
|
||||||
|
@ -342,11 +332,11 @@ func BrotliPopulationCostDistance(histogram *HistogramDistance) float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 1 {
|
if count == 1 {
|
||||||
return BrotliPopulationCostDistance_kOneSymbolHistogramCost
|
return kOneSymbolHistogramCost
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 2 {
|
if count == 2 {
|
||||||
return BrotliPopulationCostDistance_kTwoSymbolHistogramCost + float64(histogram.total_count_)
|
return kTwoSymbolHistogramCost + float64(histogram.total_count_)
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 3 {
|
if count == 3 {
|
||||||
|
@ -354,7 +344,7 @@ func BrotliPopulationCostDistance(histogram *HistogramDistance) float64 {
|
||||||
var histo1 uint32 = histogram.data_[s[1]]
|
var histo1 uint32 = histogram.data_[s[1]]
|
||||||
var histo2 uint32 = histogram.data_[s[2]]
|
var histo2 uint32 = histogram.data_[s[2]]
|
||||||
var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
|
var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
|
||||||
return BrotliPopulationCostDistance_kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
|
return kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 4 {
|
if count == 4 {
|
||||||
|
@ -379,7 +369,7 @@ func BrotliPopulationCostDistance(histogram *HistogramDistance) float64 {
|
||||||
|
|
||||||
h23 = histo[2] + histo[3]
|
h23 = histo[2] + histo[3]
|
||||||
histomax = brotli_max_uint32_t(h23, histo[0])
|
histomax = brotli_max_uint32_t(h23, histo[0])
|
||||||
return BrotliPopulationCostDistance_kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
|
return kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var max_depth uint = 1
|
var max_depth uint = 1
|
||||||
|
@ -446,7 +436,7 @@ func BrotliPopulationCostDistance(histogram *HistogramDistance) float64 {
|
||||||
bits += float64(18 + 2*max_depth)
|
bits += float64(18 + 2*max_depth)
|
||||||
|
|
||||||
/* Add the entropy of the code length code histogram. */
|
/* Add the entropy of the code length code histogram. */
|
||||||
bits += BitsEntropy(depth_histo[:], BROTLI_CODE_LENGTH_CODES)
|
bits += bitsEntropy(depth_histo[:], BROTLI_CODE_LENGTH_CODES)
|
||||||
}
|
}
|
||||||
|
|
||||||
return bits
|
return bits
|
||||||
|
|
|
@ -9,7 +9,7 @@ import "encoding/binary"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Bit reading helpers */
|
/* Bit reading helpers */
|
||||||
const BROTLI_SHORT_FILL_BIT_WINDOW_READ = (8 >> 1)
|
const shortFillBitWindowRead = (8 >> 1)
|
||||||
|
|
||||||
var kBitMask = [33]uint32{
|
var kBitMask = [33]uint32{
|
||||||
0x00000000,
|
0x00000000,
|
||||||
|
@ -47,11 +47,11 @@ var kBitMask = [33]uint32{
|
||||||
0xFFFFFFFF,
|
0xFFFFFFFF,
|
||||||
}
|
}
|
||||||
|
|
||||||
func BitMask(n uint32) uint32 {
|
func bitMask(n uint32) uint32 {
|
||||||
return kBitMask[n]
|
return kBitMask[n]
|
||||||
}
|
}
|
||||||
|
|
||||||
type BrotliBitReader struct {
|
type bitReader struct {
|
||||||
val_ uint64
|
val_ uint64
|
||||||
bit_pos_ uint32
|
bit_pos_ uint32
|
||||||
input []byte
|
input []byte
|
||||||
|
@ -59,7 +59,7 @@ type BrotliBitReader struct {
|
||||||
byte_pos uint
|
byte_pos uint
|
||||||
}
|
}
|
||||||
|
|
||||||
type BrotliBitReaderState struct {
|
type bitReaderState struct {
|
||||||
val_ uint64
|
val_ uint64
|
||||||
bit_pos_ uint32
|
bit_pos_ uint32
|
||||||
input []byte
|
input []byte
|
||||||
|
@ -74,7 +74,7 @@ type BrotliBitReaderState struct {
|
||||||
Returns false if data is required but there is no input available.
|
Returns false if data is required but there is no input available.
|
||||||
For BROTLI_ALIGNED_READ this function also prepares bit reader for aligned
|
For BROTLI_ALIGNED_READ this function also prepares bit reader for aligned
|
||||||
reading. */
|
reading. */
|
||||||
func BrotliBitReaderSaveState(from *BrotliBitReader, to *BrotliBitReaderState) {
|
func bitReaderSaveState(from *bitReader, to *bitReaderState) {
|
||||||
to.val_ = from.val_
|
to.val_ = from.val_
|
||||||
to.bit_pos_ = from.bit_pos_
|
to.bit_pos_ = from.bit_pos_
|
||||||
to.input = from.input
|
to.input = from.input
|
||||||
|
@ -82,7 +82,7 @@ func BrotliBitReaderSaveState(from *BrotliBitReader, to *BrotliBitReaderState) {
|
||||||
to.byte_pos = from.byte_pos
|
to.byte_pos = from.byte_pos
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliBitReaderRestoreState(to *BrotliBitReader, from *BrotliBitReaderState) {
|
func bitReaderRestoreState(to *bitReader, from *bitReaderState) {
|
||||||
to.val_ = from.val_
|
to.val_ = from.val_
|
||||||
to.bit_pos_ = from.bit_pos_
|
to.bit_pos_ = from.bit_pos_
|
||||||
to.input = from.input
|
to.input = from.input
|
||||||
|
@ -90,19 +90,19 @@ func BrotliBitReaderRestoreState(to *BrotliBitReader, from *BrotliBitReaderState
|
||||||
to.byte_pos = from.byte_pos
|
to.byte_pos = from.byte_pos
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliGetAvailableBits(br *BrotliBitReader) uint32 {
|
func getAvailableBits(br *bitReader) uint32 {
|
||||||
return 64 - br.bit_pos_
|
return 64 - br.bit_pos_
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns amount of unread bytes the bit reader still has buffered from the
|
/* Returns amount of unread bytes the bit reader still has buffered from the
|
||||||
BrotliInput, including whole bytes in br->val_. */
|
BrotliInput, including whole bytes in br->val_. */
|
||||||
func BrotliGetRemainingBytes(br *BrotliBitReader) uint {
|
func getRemainingBytes(br *bitReader) uint {
|
||||||
return uint(uint32(br.input_len-br.byte_pos) + (BrotliGetAvailableBits(br) >> 3))
|
return uint(uint32(br.input_len-br.byte_pos) + (getAvailableBits(br) >> 3))
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checks if there is at least |num| bytes left in the input ring-buffer
|
/* Checks if there is at least |num| bytes left in the input ring-buffer
|
||||||
(excluding the bits remaining in br->val_). */
|
(excluding the bits remaining in br->val_). */
|
||||||
func BrotliCheckInputAmount(br *BrotliBitReader, num uint) bool {
|
func checkInputAmount(br *bitReader, num uint) bool {
|
||||||
return br.input_len-br.byte_pos >= num
|
return br.input_len-br.byte_pos >= num
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ func BrotliCheckInputAmount(br *BrotliBitReader, num uint) bool {
|
||||||
Precondition: accumulator contains at least 1 bit.
|
Precondition: accumulator contains at least 1 bit.
|
||||||
|n_bits| should be in the range [1..24] for regular build. For portable
|
|n_bits| should be in the range [1..24] for regular build. For portable
|
||||||
non-64-bit little-endian build only 16 bits are safe to request. */
|
non-64-bit little-endian build only 16 bits are safe to request. */
|
||||||
func BrotliFillBitWindow(br *BrotliBitReader, n_bits uint32) {
|
func fillBitWindow(br *bitReader, n_bits uint32) {
|
||||||
if br.bit_pos_ >= 32 {
|
if br.bit_pos_ >= 32 {
|
||||||
br.val_ >>= 32
|
br.val_ >>= 32
|
||||||
br.bit_pos_ ^= 32 /* here same as -= 32 because of the if condition */
|
br.bit_pos_ ^= 32 /* here same as -= 32 because of the if condition */
|
||||||
|
@ -121,13 +121,13 @@ func BrotliFillBitWindow(br *BrotliBitReader, n_bits uint32) {
|
||||||
|
|
||||||
/* Mostly like BrotliFillBitWindow, but guarantees only 16 bits and reads no
|
/* Mostly like BrotliFillBitWindow, but guarantees only 16 bits and reads no
|
||||||
more than BROTLI_SHORT_FILL_BIT_WINDOW_READ bytes of input. */
|
more than BROTLI_SHORT_FILL_BIT_WINDOW_READ bytes of input. */
|
||||||
func BrotliFillBitWindow16(br *BrotliBitReader) {
|
func fillBitWindow16(br *bitReader) {
|
||||||
BrotliFillBitWindow(br, 17)
|
fillBitWindow(br, 17)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tries to pull one byte of input to accumulator.
|
/* Tries to pull one byte of input to accumulator.
|
||||||
Returns false if there is no input available. */
|
Returns false if there is no input available. */
|
||||||
func BrotliPullByte(br *BrotliBitReader) bool {
|
func pullByte(br *bitReader) bool {
|
||||||
if br.byte_pos == br.input_len {
|
if br.byte_pos == br.input_len {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -141,44 +141,44 @@ func BrotliPullByte(br *BrotliBitReader) bool {
|
||||||
|
|
||||||
/* Returns currently available bits.
|
/* Returns currently available bits.
|
||||||
The number of valid bits could be calculated by BrotliGetAvailableBits. */
|
The number of valid bits could be calculated by BrotliGetAvailableBits. */
|
||||||
func BrotliGetBitsUnmasked(br *BrotliBitReader) uint64 {
|
func getBitsUnmasked(br *bitReader) uint64 {
|
||||||
return br.val_ >> br.bit_pos_
|
return br.val_ >> br.bit_pos_
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like BrotliGetBits, but does not mask the result.
|
/* Like BrotliGetBits, but does not mask the result.
|
||||||
The result contains at least 16 valid bits. */
|
The result contains at least 16 valid bits. */
|
||||||
func BrotliGet16BitsUnmasked(br *BrotliBitReader) uint32 {
|
func get16BitsUnmasked(br *bitReader) uint32 {
|
||||||
BrotliFillBitWindow(br, 16)
|
fillBitWindow(br, 16)
|
||||||
return uint32(BrotliGetBitsUnmasked(br))
|
return uint32(getBitsUnmasked(br))
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the specified number of bits from |br| without advancing bit
|
/* Returns the specified number of bits from |br| without advancing bit
|
||||||
position. */
|
position. */
|
||||||
func BrotliGetBits(br *BrotliBitReader, n_bits uint32) uint32 {
|
func BrotliGetBits(br *bitReader, n_bits uint32) uint32 {
|
||||||
BrotliFillBitWindow(br, n_bits)
|
fillBitWindow(br, n_bits)
|
||||||
return uint32(BrotliGetBitsUnmasked(br)) & BitMask(n_bits)
|
return uint32(getBitsUnmasked(br)) & bitMask(n_bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tries to peek the specified amount of bits. Returns false, if there
|
/* Tries to peek the specified amount of bits. Returns false, if there
|
||||||
is not enough input. */
|
is not enough input. */
|
||||||
func BrotliSafeGetBits(br *BrotliBitReader, n_bits uint32, val *uint32) bool {
|
func safeGetBits(br *bitReader, n_bits uint32, val *uint32) bool {
|
||||||
for BrotliGetAvailableBits(br) < n_bits {
|
for getAvailableBits(br) < n_bits {
|
||||||
if !BrotliPullByte(br) {
|
if !pullByte(br) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*val = uint32(BrotliGetBitsUnmasked(br)) & BitMask(n_bits)
|
*val = uint32(getBitsUnmasked(br)) & bitMask(n_bits)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advances the bit pos by |n_bits|. */
|
/* Advances the bit pos by |n_bits|. */
|
||||||
func BrotliDropBits(br *BrotliBitReader, n_bits uint32) {
|
func dropBits(br *bitReader, n_bits uint32) {
|
||||||
br.bit_pos_ += n_bits
|
br.bit_pos_ += n_bits
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliBitReaderUnload(br *BrotliBitReader) {
|
func bitReaderUnload(br *bitReader) {
|
||||||
var unused_bytes uint32 = BrotliGetAvailableBits(br) >> 3
|
var unused_bytes uint32 = getAvailableBits(br) >> 3
|
||||||
var unused_bits uint32 = unused_bytes << 3
|
var unused_bits uint32 = unused_bytes << 3
|
||||||
br.byte_pos -= uint(unused_bytes)
|
br.byte_pos -= uint(unused_bytes)
|
||||||
if unused_bits == 64 {
|
if unused_bits == 64 {
|
||||||
|
@ -192,40 +192,40 @@ func BrotliBitReaderUnload(br *BrotliBitReader) {
|
||||||
|
|
||||||
/* Reads the specified number of bits from |br| and advances the bit pos.
|
/* Reads the specified number of bits from |br| and advances the bit pos.
|
||||||
Precondition: accumulator MUST contain at least |n_bits|. */
|
Precondition: accumulator MUST contain at least |n_bits|. */
|
||||||
func BrotliTakeBits(br *BrotliBitReader, n_bits uint32, val *uint32) {
|
func takeBits(br *bitReader, n_bits uint32, val *uint32) {
|
||||||
*val = uint32(BrotliGetBitsUnmasked(br)) & BitMask(n_bits)
|
*val = uint32(getBitsUnmasked(br)) & bitMask(n_bits)
|
||||||
BrotliDropBits(br, n_bits)
|
dropBits(br, n_bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reads the specified number of bits from |br| and advances the bit pos.
|
/* Reads the specified number of bits from |br| and advances the bit pos.
|
||||||
Assumes that there is enough input to perform BrotliFillBitWindow. */
|
Assumes that there is enough input to perform BrotliFillBitWindow. */
|
||||||
func BrotliReadBits(br *BrotliBitReader, n_bits uint32) uint32 {
|
func readBits(br *bitReader, n_bits uint32) uint32 {
|
||||||
var val uint32
|
var val uint32
|
||||||
BrotliFillBitWindow(br, n_bits)
|
fillBitWindow(br, n_bits)
|
||||||
BrotliTakeBits(br, n_bits, &val)
|
takeBits(br, n_bits, &val)
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tries to read the specified amount of bits. Returns false, if there
|
/* Tries to read the specified amount of bits. Returns false, if there
|
||||||
is not enough input. |n_bits| MUST be positive. */
|
is not enough input. |n_bits| MUST be positive. */
|
||||||
func BrotliSafeReadBits(br *BrotliBitReader, n_bits uint32, val *uint32) bool {
|
func safeReadBits(br *bitReader, n_bits uint32, val *uint32) bool {
|
||||||
for BrotliGetAvailableBits(br) < n_bits {
|
for getAvailableBits(br) < n_bits {
|
||||||
if !BrotliPullByte(br) {
|
if !pullByte(br) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliTakeBits(br, n_bits, val)
|
takeBits(br, n_bits, val)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advances the bit reader position to the next byte boundary and verifies
|
/* Advances the bit reader position to the next byte boundary and verifies
|
||||||
that any skipped bits are set to zero. */
|
that any skipped bits are set to zero. */
|
||||||
func BrotliJumpToByteBoundary(br *BrotliBitReader) bool {
|
func jumpToByteBoundary(br *bitReader) bool {
|
||||||
var pad_bits_count uint32 = BrotliGetAvailableBits(br) & 0x7
|
var pad_bits_count uint32 = getAvailableBits(br) & 0x7
|
||||||
var pad_bits uint32 = 0
|
var pad_bits uint32 = 0
|
||||||
if pad_bits_count != 0 {
|
if pad_bits_count != 0 {
|
||||||
BrotliTakeBits(br, pad_bits_count, &pad_bits)
|
takeBits(br, pad_bits_count, &pad_bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
return pad_bits == 0
|
return pad_bits == 0
|
||||||
|
@ -234,10 +234,10 @@ func BrotliJumpToByteBoundary(br *BrotliBitReader) bool {
|
||||||
/* Copies remaining input bytes stored in the bit reader to the output. Value
|
/* Copies remaining input bytes stored in the bit reader to the output. Value
|
||||||
|num| may not be larger than BrotliGetRemainingBytes. The bit reader must be
|
|num| may not be larger than BrotliGetRemainingBytes. The bit reader must be
|
||||||
warmed up again after this. */
|
warmed up again after this. */
|
||||||
func BrotliCopyBytes(dest []byte, br *BrotliBitReader, num uint) {
|
func copyBytes(dest []byte, br *bitReader, num uint) {
|
||||||
for BrotliGetAvailableBits(br) >= 8 && num > 0 {
|
for getAvailableBits(br) >= 8 && num > 0 {
|
||||||
dest[0] = byte(BrotliGetBitsUnmasked(br))
|
dest[0] = byte(getBitsUnmasked(br))
|
||||||
BrotliDropBits(br, 8)
|
dropBits(br, 8)
|
||||||
dest = dest[1:]
|
dest = dest[1:]
|
||||||
num--
|
num--
|
||||||
}
|
}
|
||||||
|
@ -246,17 +246,17 @@ func BrotliCopyBytes(dest []byte, br *BrotliBitReader, num uint) {
|
||||||
br.byte_pos += num
|
br.byte_pos += num
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliInitBitReader(br *BrotliBitReader) {
|
func initBitReader(br *bitReader) {
|
||||||
br.val_ = 0
|
br.val_ = 0
|
||||||
br.bit_pos_ = 64
|
br.bit_pos_ = 64
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliWarmupBitReader(br *BrotliBitReader) bool {
|
func warmupBitReader(br *bitReader) bool {
|
||||||
/* Fixing alignment after unaligned BrotliFillWindow would result accumulator
|
/* Fixing alignment after unaligned BrotliFillWindow would result accumulator
|
||||||
overflow. If unalignment is caused by BrotliSafeReadBits, then there is
|
overflow. If unalignment is caused by BrotliSafeReadBits, then there is
|
||||||
enough space in accumulator to fix alignment. */
|
enough space in accumulator to fix alignment. */
|
||||||
if BrotliGetAvailableBits(br) == 0 {
|
if getAvailableBits(br) == 0 {
|
||||||
if !BrotliPullByte(br) {
|
if !pullByte(br) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,7 +239,7 @@ func ClusterBlocksCommand(data []uint16, length uint, num_blocks uint, block_ids
|
||||||
pos++
|
pos++
|
||||||
}
|
}
|
||||||
|
|
||||||
histograms[j].bit_cost_ = BrotliPopulationCostCommand(&histograms[j])
|
histograms[j].bit_cost_ = populationCostCommand(&histograms[j])
|
||||||
new_clusters[j] = uint32(j)
|
new_clusters[j] = uint32(j)
|
||||||
symbols[j] = uint32(j)
|
symbols[j] = uint32(j)
|
||||||
sizes[j] = 1
|
sizes[j] = 1
|
||||||
|
|
|
@ -239,7 +239,7 @@ func ClusterBlocksDistance(data []uint16, length uint, num_blocks uint, block_id
|
||||||
pos++
|
pos++
|
||||||
}
|
}
|
||||||
|
|
||||||
histograms[j].bit_cost_ = BrotliPopulationCostDistance(&histograms[j])
|
histograms[j].bit_cost_ = populationCostDistance(&histograms[j])
|
||||||
new_clusters[j] = uint32(j)
|
new_clusters[j] = uint32(j)
|
||||||
symbols[j] = uint32(j)
|
symbols[j] = uint32(j)
|
||||||
sizes[j] = 1
|
sizes[j] = 1
|
||||||
|
|
|
@ -239,7 +239,7 @@ func ClusterBlocksLiteral(data []byte, length uint, num_blocks uint, block_ids [
|
||||||
pos++
|
pos++
|
||||||
}
|
}
|
||||||
|
|
||||||
histograms[j].bit_cost_ = BrotliPopulationCostLiteral(&histograms[j])
|
histograms[j].bit_cost_ = populationCostLiteral(&histograms[j])
|
||||||
new_clusters[j] = uint32(j)
|
new_clusters[j] = uint32(j)
|
||||||
symbols[j] = uint32(j)
|
symbols[j] = uint32(j)
|
||||||
sizes[j] = 1
|
sizes[j] = 1
|
||||||
|
|
|
@ -48,7 +48,7 @@ func BrotliCompareAndPushToQueueCommand(out []HistogramCommand, cluster_size []u
|
||||||
var combo HistogramCommand = out[idx1]
|
var combo HistogramCommand = out[idx1]
|
||||||
var cost_combo float64
|
var cost_combo float64
|
||||||
HistogramAddHistogramCommand(&combo, &out[idx2])
|
HistogramAddHistogramCommand(&combo, &out[idx2])
|
||||||
cost_combo = BrotliPopulationCostCommand(&combo)
|
cost_combo = populationCostCommand(&combo)
|
||||||
if cost_combo < threshold-p.cost_diff {
|
if cost_combo < threshold-p.cost_diff {
|
||||||
p.cost_combo = cost_combo
|
p.cost_combo = cost_combo
|
||||||
is_good_pair = true
|
is_good_pair = true
|
||||||
|
@ -160,7 +160,7 @@ func BrotliHistogramBitCostDistanceCommand(histogram *HistogramCommand, candidat
|
||||||
} else {
|
} else {
|
||||||
var tmp HistogramCommand = *histogram
|
var tmp HistogramCommand = *histogram
|
||||||
HistogramAddHistogramCommand(&tmp, candidate)
|
HistogramAddHistogramCommand(&tmp, candidate)
|
||||||
return BrotliPopulationCostCommand(&tmp) - candidate.bit_cost_
|
return populationCostCommand(&tmp) - candidate.bit_cost_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ func BrotliClusterHistogramsCommand(in []HistogramCommand, in_size uint, max_his
|
||||||
|
|
||||||
for i = 0; i < in_size; i++ {
|
for i = 0; i < in_size; i++ {
|
||||||
out[i] = in[i]
|
out[i] = in[i]
|
||||||
out[i].bit_cost_ = BrotliPopulationCostCommand(&in[i])
|
out[i].bit_cost_ = populationCostCommand(&in[i])
|
||||||
histogram_symbols[i] = uint32(i)
|
histogram_symbols[i] = uint32(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ func BrotliCompareAndPushToQueueDistance(out []HistogramDistance, cluster_size [
|
||||||
var combo HistogramDistance = out[idx1]
|
var combo HistogramDistance = out[idx1]
|
||||||
var cost_combo float64
|
var cost_combo float64
|
||||||
HistogramAddHistogramDistance(&combo, &out[idx2])
|
HistogramAddHistogramDistance(&combo, &out[idx2])
|
||||||
cost_combo = BrotliPopulationCostDistance(&combo)
|
cost_combo = populationCostDistance(&combo)
|
||||||
if cost_combo < threshold-p.cost_diff {
|
if cost_combo < threshold-p.cost_diff {
|
||||||
p.cost_combo = cost_combo
|
p.cost_combo = cost_combo
|
||||||
is_good_pair = true
|
is_good_pair = true
|
||||||
|
@ -160,7 +160,7 @@ func BrotliHistogramBitCostDistanceDistance(histogram *HistogramDistance, candid
|
||||||
} else {
|
} else {
|
||||||
var tmp HistogramDistance = *histogram
|
var tmp HistogramDistance = *histogram
|
||||||
HistogramAddHistogramDistance(&tmp, candidate)
|
HistogramAddHistogramDistance(&tmp, candidate)
|
||||||
return BrotliPopulationCostDistance(&tmp) - candidate.bit_cost_
|
return populationCostDistance(&tmp) - candidate.bit_cost_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ func BrotliClusterHistogramsDistance(in []HistogramDistance, in_size uint, max_h
|
||||||
|
|
||||||
for i = 0; i < in_size; i++ {
|
for i = 0; i < in_size; i++ {
|
||||||
out[i] = in[i]
|
out[i] = in[i]
|
||||||
out[i].bit_cost_ = BrotliPopulationCostDistance(&in[i])
|
out[i].bit_cost_ = populationCostDistance(&in[i])
|
||||||
histogram_symbols[i] = uint32(i)
|
histogram_symbols[i] = uint32(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ func BrotliCompareAndPushToQueueLiteral(out []HistogramLiteral, cluster_size []u
|
||||||
var combo HistogramLiteral = out[idx1]
|
var combo HistogramLiteral = out[idx1]
|
||||||
var cost_combo float64
|
var cost_combo float64
|
||||||
HistogramAddHistogramLiteral(&combo, &out[idx2])
|
HistogramAddHistogramLiteral(&combo, &out[idx2])
|
||||||
cost_combo = BrotliPopulationCostLiteral(&combo)
|
cost_combo = populationCostLiteral(&combo)
|
||||||
if cost_combo < threshold-p.cost_diff {
|
if cost_combo < threshold-p.cost_diff {
|
||||||
p.cost_combo = cost_combo
|
p.cost_combo = cost_combo
|
||||||
is_good_pair = true
|
is_good_pair = true
|
||||||
|
@ -160,7 +160,7 @@ func BrotliHistogramBitCostDistanceLiteral(histogram *HistogramLiteral, candidat
|
||||||
} else {
|
} else {
|
||||||
var tmp HistogramLiteral = *histogram
|
var tmp HistogramLiteral = *histogram
|
||||||
HistogramAddHistogramLiteral(&tmp, candidate)
|
HistogramAddHistogramLiteral(&tmp, candidate)
|
||||||
return BrotliPopulationCostLiteral(&tmp) - candidate.bit_cost_
|
return populationCostLiteral(&tmp) - candidate.bit_cost_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ func BrotliClusterHistogramsLiteral(in []HistogramLiteral, in_size uint, max_his
|
||||||
|
|
||||||
for i = 0; i < in_size; i++ {
|
for i = 0; i < in_size; i++ {
|
||||||
out[i] = in[i]
|
out[i] = in[i]
|
||||||
out[i].bit_cost_ = BrotliPopulationCostLiteral(&in[i])
|
out[i].bit_cost_ = populationCostLiteral(&in[i])
|
||||||
histogram_symbols[i] = uint32(i)
|
histogram_symbols[i] = uint32(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -670,7 +670,7 @@ func ShouldCompress(input []byte, input_size uint, num_literals uint) bool {
|
||||||
literal_histo[input[i]]++
|
literal_histo[input[i]]++
|
||||||
}
|
}
|
||||||
|
|
||||||
return BitsEntropy(literal_histo[:], 256) < max_total_bit_cost
|
return bitsEntropy(literal_histo[:], 256) < max_total_bit_cost
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
238
decode.go
238
decode.go
|
@ -156,26 +156,26 @@ func SaveErrorCode(s *Reader, e int) int {
|
||||||
|
|
||||||
/* Decodes WBITS by reading 1 - 7 bits, or 0x11 for "Large Window Brotli".
|
/* Decodes WBITS by reading 1 - 7 bits, or 0x11 for "Large Window Brotli".
|
||||||
Precondition: bit-reader accumulator has at least 8 bits. */
|
Precondition: bit-reader accumulator has at least 8 bits. */
|
||||||
func DecodeWindowBits(s *Reader, br *BrotliBitReader) int {
|
func DecodeWindowBits(s *Reader, br *bitReader) int {
|
||||||
var n uint32
|
var n uint32
|
||||||
var large_window bool = s.large_window
|
var large_window bool = s.large_window
|
||||||
s.large_window = false
|
s.large_window = false
|
||||||
BrotliTakeBits(br, 1, &n)
|
takeBits(br, 1, &n)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
s.window_bits = 16
|
s.window_bits = 16
|
||||||
return BROTLI_DECODER_SUCCESS
|
return BROTLI_DECODER_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliTakeBits(br, 3, &n)
|
takeBits(br, 3, &n)
|
||||||
if n != 0 {
|
if n != 0 {
|
||||||
s.window_bits = 17 + n
|
s.window_bits = 17 + n
|
||||||
return BROTLI_DECODER_SUCCESS
|
return BROTLI_DECODER_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliTakeBits(br, 3, &n)
|
takeBits(br, 3, &n)
|
||||||
if n == 1 {
|
if n == 1 {
|
||||||
if large_window {
|
if large_window {
|
||||||
BrotliTakeBits(br, 1, &n)
|
takeBits(br, 1, &n)
|
||||||
if n == 1 {
|
if n == 1 {
|
||||||
return BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS
|
return BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS
|
||||||
}
|
}
|
||||||
|
@ -197,11 +197,11 @@ func DecodeWindowBits(s *Reader, br *BrotliBitReader) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
|
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
|
||||||
func DecodeVarLenUint8(s *Reader, br *BrotliBitReader, value *uint32) int {
|
func DecodeVarLenUint8(s *Reader, br *bitReader, value *uint32) int {
|
||||||
var bits uint32
|
var bits uint32
|
||||||
switch s.substate_decode_uint8 {
|
switch s.substate_decode_uint8 {
|
||||||
case BROTLI_STATE_DECODE_UINT8_NONE:
|
case BROTLI_STATE_DECODE_UINT8_NONE:
|
||||||
if !BrotliSafeReadBits(br, 1, &bits) {
|
if !safeReadBits(br, 1, &bits) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ func DecodeVarLenUint8(s *Reader, br *BrotliBitReader, value *uint32) int {
|
||||||
|
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case BROTLI_STATE_DECODE_UINT8_SHORT:
|
case BROTLI_STATE_DECODE_UINT8_SHORT:
|
||||||
if !BrotliSafeReadBits(br, 3, &bits) {
|
if !safeReadBits(br, 3, &bits) {
|
||||||
s.substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT
|
s.substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
@ -230,7 +230,7 @@ func DecodeVarLenUint8(s *Reader, br *BrotliBitReader, value *uint32) int {
|
||||||
|
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case BROTLI_STATE_DECODE_UINT8_LONG:
|
case BROTLI_STATE_DECODE_UINT8_LONG:
|
||||||
if !BrotliSafeReadBits(br, *value, &bits) {
|
if !safeReadBits(br, *value, &bits) {
|
||||||
s.substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG
|
s.substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
@ -245,13 +245,13 @@ func DecodeVarLenUint8(s *Reader, br *BrotliBitReader, value *uint32) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
|
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
|
||||||
func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
func DecodeMetaBlockLength(s *Reader, br *bitReader) int {
|
||||||
var bits uint32
|
var bits uint32
|
||||||
var i int
|
var i int
|
||||||
for {
|
for {
|
||||||
switch s.substate_metablock_header {
|
switch s.substate_metablock_header {
|
||||||
case BROTLI_STATE_METABLOCK_HEADER_NONE:
|
case BROTLI_STATE_METABLOCK_HEADER_NONE:
|
||||||
if !BrotliSafeReadBits(br, 1, &bits) {
|
if !safeReadBits(br, 1, &bits) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,7 +273,7 @@ func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
||||||
|
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
|
case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
|
||||||
if !BrotliSafeReadBits(br, 1, &bits) {
|
if !safeReadBits(br, 1, &bits) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
||||||
|
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
|
case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
|
||||||
if !BrotliSafeReadBits(br, 2, &bits) {
|
if !safeReadBits(br, 2, &bits) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,7 +307,7 @@ func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
||||||
i = s.loop_counter
|
i = s.loop_counter
|
||||||
|
|
||||||
for ; i < int(s.size_nibbles); i++ {
|
for ; i < int(s.size_nibbles); i++ {
|
||||||
if !BrotliSafeReadBits(br, 4, &bits) {
|
if !safeReadBits(br, 4, &bits) {
|
||||||
s.loop_counter = i
|
s.loop_counter = i
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
@ -325,7 +325,7 @@ func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
|
case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
|
||||||
if s.is_last_metablock == 0 {
|
if s.is_last_metablock == 0 {
|
||||||
if !BrotliSafeReadBits(br, 1, &bits) {
|
if !safeReadBits(br, 1, &bits) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,7 +341,7 @@ func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
||||||
return BROTLI_DECODER_SUCCESS
|
return BROTLI_DECODER_SUCCESS
|
||||||
|
|
||||||
case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
|
case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
|
||||||
if !BrotliSafeReadBits(br, 1, &bits) {
|
if !safeReadBits(br, 1, &bits) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,7 +354,7 @@ func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
||||||
|
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case BROTLI_STATE_METABLOCK_HEADER_BYTES:
|
case BROTLI_STATE_METABLOCK_HEADER_BYTES:
|
||||||
if !BrotliSafeReadBits(br, 2, &bits) {
|
if !safeReadBits(br, 2, &bits) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -372,7 +372,7 @@ func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
||||||
i = s.loop_counter
|
i = s.loop_counter
|
||||||
|
|
||||||
for ; i < int(s.size_nibbles); i++ {
|
for ; i < int(s.size_nibbles); i++ {
|
||||||
if !BrotliSafeReadBits(br, 8, &bits) {
|
if !safeReadBits(br, 8, &bits) {
|
||||||
s.loop_counter = i
|
s.loop_counter = i
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
@ -398,29 +398,29 @@ func DecodeMetaBlockLength(s *Reader, br *BrotliBitReader) int {
|
||||||
This method doesn't read data from the bit reader, BUT drops the amount of
|
This method doesn't read data from the bit reader, BUT drops the amount of
|
||||||
bits that correspond to the decoded symbol.
|
bits that correspond to the decoded symbol.
|
||||||
bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
|
bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
|
||||||
func DecodeSymbol(bits uint32, table []HuffmanCode, br *BrotliBitReader) uint32 {
|
func DecodeSymbol(bits uint32, table []HuffmanCode, br *bitReader) uint32 {
|
||||||
table = table[bits&HUFFMAN_TABLE_MASK:]
|
table = table[bits&HUFFMAN_TABLE_MASK:]
|
||||||
if table[0].bits > HUFFMAN_TABLE_BITS {
|
if table[0].bits > HUFFMAN_TABLE_BITS {
|
||||||
var nbits uint32 = uint32(table[0].bits) - HUFFMAN_TABLE_BITS
|
var nbits uint32 = uint32(table[0].bits) - HUFFMAN_TABLE_BITS
|
||||||
BrotliDropBits(br, HUFFMAN_TABLE_BITS)
|
dropBits(br, HUFFMAN_TABLE_BITS)
|
||||||
table = table[uint32(table[0].value)+((bits>>HUFFMAN_TABLE_BITS)&BitMask(nbits)):]
|
table = table[uint32(table[0].value)+((bits>>HUFFMAN_TABLE_BITS)&bitMask(nbits)):]
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliDropBits(br, uint32(table[0].bits))
|
dropBits(br, uint32(table[0].bits))
|
||||||
return uint32(table[0].value)
|
return uint32(table[0].value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reads and decodes the next Huffman code from bit-stream.
|
/* Reads and decodes the next Huffman code from bit-stream.
|
||||||
This method peeks 16 bits of input and drops 0 - 15 of them. */
|
This method peeks 16 bits of input and drops 0 - 15 of them. */
|
||||||
func ReadSymbol(table []HuffmanCode, br *BrotliBitReader) uint32 {
|
func ReadSymbol(table []HuffmanCode, br *bitReader) uint32 {
|
||||||
return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br)
|
return DecodeSymbol(get16BitsUnmasked(br), table, br)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same as DecodeSymbol, but it is known that there is less than 15 bits of
|
/* Same as DecodeSymbol, but it is known that there is less than 15 bits of
|
||||||
input are currently available. */
|
input are currently available. */
|
||||||
func SafeDecodeSymbol(table []HuffmanCode, br *BrotliBitReader, result *uint32) bool {
|
func SafeDecodeSymbol(table []HuffmanCode, br *bitReader, result *uint32) bool {
|
||||||
var val uint32
|
var val uint32
|
||||||
var available_bits uint32 = BrotliGetAvailableBits(br)
|
var available_bits uint32 = getAvailableBits(br)
|
||||||
if available_bits == 0 {
|
if available_bits == 0 {
|
||||||
if table[0].bits == 0 {
|
if table[0].bits == 0 {
|
||||||
*result = uint32(table[0].value)
|
*result = uint32(table[0].value)
|
||||||
|
@ -430,11 +430,11 @@ func SafeDecodeSymbol(table []HuffmanCode, br *BrotliBitReader, result *uint32)
|
||||||
return false /* No valid bits at all. */
|
return false /* No valid bits at all. */
|
||||||
}
|
}
|
||||||
|
|
||||||
val = uint32(BrotliGetBitsUnmasked(br))
|
val = uint32(getBitsUnmasked(br))
|
||||||
table = table[val&HUFFMAN_TABLE_MASK:]
|
table = table[val&HUFFMAN_TABLE_MASK:]
|
||||||
if table[0].bits <= HUFFMAN_TABLE_BITS {
|
if table[0].bits <= HUFFMAN_TABLE_BITS {
|
||||||
if uint32(table[0].bits) <= available_bits {
|
if uint32(table[0].bits) <= available_bits {
|
||||||
BrotliDropBits(br, uint32(table[0].bits))
|
dropBits(br, uint32(table[0].bits))
|
||||||
*result = uint32(table[0].value)
|
*result = uint32(table[0].value)
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
|
@ -447,7 +447,7 @@ func SafeDecodeSymbol(table []HuffmanCode, br *BrotliBitReader, result *uint32)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Speculatively drop HUFFMAN_TABLE_BITS. */
|
/* Speculatively drop HUFFMAN_TABLE_BITS. */
|
||||||
val = (val & BitMask(uint32(table[0].bits))) >> HUFFMAN_TABLE_BITS
|
val = (val & bitMask(uint32(table[0].bits))) >> HUFFMAN_TABLE_BITS
|
||||||
|
|
||||||
available_bits -= HUFFMAN_TABLE_BITS
|
available_bits -= HUFFMAN_TABLE_BITS
|
||||||
table = table[uint32(table[0].value)+val:]
|
table = table[uint32(table[0].value)+val:]
|
||||||
|
@ -455,14 +455,14 @@ func SafeDecodeSymbol(table []HuffmanCode, br *BrotliBitReader, result *uint32)
|
||||||
return false /* Not enough bits for the second level. */
|
return false /* Not enough bits for the second level. */
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliDropBits(br, HUFFMAN_TABLE_BITS+uint32(table[0].bits))
|
dropBits(br, HUFFMAN_TABLE_BITS+uint32(table[0].bits))
|
||||||
*result = uint32(table[0].value)
|
*result = uint32(table[0].value)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func SafeReadSymbol(table []HuffmanCode, br *BrotliBitReader, result *uint32) bool {
|
func SafeReadSymbol(table []HuffmanCode, br *bitReader, result *uint32) bool {
|
||||||
var val uint32
|
var val uint32
|
||||||
if BrotliSafeGetBits(br, 15, &val) {
|
if safeGetBits(br, 15, &val) {
|
||||||
*result = DecodeSymbol(val, table, br)
|
*result = DecodeSymbol(val, table, br)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -471,7 +471,7 @@ func SafeReadSymbol(table []HuffmanCode, br *BrotliBitReader, result *uint32) bo
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Makes a look-up in first level Huffman table. Peeks 8 bits. */
|
/* Makes a look-up in first level Huffman table. Peeks 8 bits. */
|
||||||
func PreloadSymbol(safe int, table []HuffmanCode, br *BrotliBitReader, bits *uint32, value *uint32) {
|
func PreloadSymbol(safe int, table []HuffmanCode, br *bitReader, bits *uint32, value *uint32) {
|
||||||
if safe != 0 {
|
if safe != 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -483,19 +483,19 @@ func PreloadSymbol(safe int, table []HuffmanCode, br *BrotliBitReader, bits *uin
|
||||||
|
|
||||||
/* Decodes the next Huffman code using data prepared by PreloadSymbol.
|
/* Decodes the next Huffman code using data prepared by PreloadSymbol.
|
||||||
Reads 0 - 15 bits. Also peeks 8 following bits. */
|
Reads 0 - 15 bits. Also peeks 8 following bits. */
|
||||||
func ReadPreloadedSymbol(table []HuffmanCode, br *BrotliBitReader, bits *uint32, value *uint32) uint32 {
|
func ReadPreloadedSymbol(table []HuffmanCode, br *bitReader, bits *uint32, value *uint32) uint32 {
|
||||||
var result uint32 = *value
|
var result uint32 = *value
|
||||||
var ext []HuffmanCode
|
var ext []HuffmanCode
|
||||||
if *bits > HUFFMAN_TABLE_BITS {
|
if *bits > HUFFMAN_TABLE_BITS {
|
||||||
var val uint32 = BrotliGet16BitsUnmasked(br)
|
var val uint32 = get16BitsUnmasked(br)
|
||||||
ext = table[val&HUFFMAN_TABLE_MASK:][*value:]
|
ext = table[val&HUFFMAN_TABLE_MASK:][*value:]
|
||||||
var mask uint32 = BitMask((*bits - HUFFMAN_TABLE_BITS))
|
var mask uint32 = bitMask((*bits - HUFFMAN_TABLE_BITS))
|
||||||
BrotliDropBits(br, HUFFMAN_TABLE_BITS)
|
dropBits(br, HUFFMAN_TABLE_BITS)
|
||||||
ext = ext[(val>>HUFFMAN_TABLE_BITS)&mask:]
|
ext = ext[(val>>HUFFMAN_TABLE_BITS)&mask:]
|
||||||
BrotliDropBits(br, uint32(ext[0].bits))
|
dropBits(br, uint32(ext[0].bits))
|
||||||
result = uint32(ext[0].value)
|
result = uint32(ext[0].value)
|
||||||
} else {
|
} else {
|
||||||
BrotliDropBits(br, *bits)
|
dropBits(br, *bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
PreloadSymbol(0, table, br, bits, value)
|
PreloadSymbol(0, table, br, bits, value)
|
||||||
|
@ -516,7 +516,7 @@ func Log2Floor(x uint32) uint32 {
|
||||||
Totally 1..4 symbols are read, 1..11 bits each.
|
Totally 1..4 symbols are read, 1..11 bits each.
|
||||||
The list of symbols MUST NOT contain duplicates. */
|
The list of symbols MUST NOT contain duplicates. */
|
||||||
func ReadSimpleHuffmanSymbols(alphabet_size uint32, max_symbol uint32, s *Reader) int {
|
func ReadSimpleHuffmanSymbols(alphabet_size uint32, max_symbol uint32, s *Reader) int {
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
var max_bits uint32 = Log2Floor(alphabet_size - 1)
|
var max_bits uint32 = Log2Floor(alphabet_size - 1)
|
||||||
var i uint32 = s.sub_loop_counter
|
var i uint32 = s.sub_loop_counter
|
||||||
/* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
|
/* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
|
||||||
|
@ -524,7 +524,7 @@ func ReadSimpleHuffmanSymbols(alphabet_size uint32, max_symbol uint32, s *Reader
|
||||||
var num_symbols uint32 = s.symbol
|
var num_symbols uint32 = s.symbol
|
||||||
for i <= num_symbols {
|
for i <= num_symbols {
|
||||||
var v uint32
|
var v uint32
|
||||||
if !BrotliSafeReadBits(br, max_bits, &v) {
|
if !safeReadBits(br, max_bits, &v) {
|
||||||
s.sub_loop_counter = i
|
s.sub_loop_counter = i
|
||||||
s.substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ
|
s.substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
|
@ -629,7 +629,7 @@ func ProcessRepeatedCodeLength(code_len uint32, repeat_delta uint32, alphabet_si
|
||||||
|
|
||||||
/* Reads and decodes symbol codelengths. */
|
/* Reads and decodes symbol codelengths. */
|
||||||
func ReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
func ReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
var symbol uint32 = s.symbol
|
var symbol uint32 = s.symbol
|
||||||
var repeat uint32 = s.repeat
|
var repeat uint32 = s.repeat
|
||||||
var space uint32 = s.space
|
var space uint32 = s.space
|
||||||
|
@ -638,14 +638,14 @@ func ReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
var symbol_lists SymbolList = s.symbol_lists
|
var symbol_lists SymbolList = s.symbol_lists
|
||||||
var code_length_histo []uint16 = s.code_length_histo[:]
|
var code_length_histo []uint16 = s.code_length_histo[:]
|
||||||
var next_symbol []int = s.next_symbol[:]
|
var next_symbol []int = s.next_symbol[:]
|
||||||
if !BrotliWarmupBitReader(br) {
|
if !warmupBitReader(br) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
var p []HuffmanCode
|
var p []HuffmanCode
|
||||||
for symbol < alphabet_size && space > 0 {
|
for symbol < alphabet_size && space > 0 {
|
||||||
p = s.table[:]
|
p = s.table[:]
|
||||||
var code_len uint32
|
var code_len uint32
|
||||||
if !BrotliCheckInputAmount(br, BROTLI_SHORT_FILL_BIT_WINDOW_READ) {
|
if !checkInputAmount(br, shortFillBitWindowRead) {
|
||||||
s.symbol = symbol
|
s.symbol = symbol
|
||||||
s.repeat = repeat
|
s.repeat = repeat
|
||||||
s.prev_code_len = prev_code_len
|
s.prev_code_len = prev_code_len
|
||||||
|
@ -654,9 +654,9 @@ func ReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliFillBitWindow16(br)
|
fillBitWindow16(br)
|
||||||
p = p[BrotliGetBitsUnmasked(br)&uint64(BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH)):]
|
p = p[getBitsUnmasked(br)&uint64(bitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH)):]
|
||||||
BrotliDropBits(br, uint32(p[0].bits)) /* Use 1..5 bits. */
|
dropBits(br, uint32(p[0].bits)) /* Use 1..5 bits. */
|
||||||
code_len = uint32(p[0].value) /* code_len == 0..17 */
|
code_len = uint32(p[0].value) /* code_len == 0..17 */
|
||||||
if code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH {
|
if code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH {
|
||||||
ProcessSingleCodeLength(code_len, &symbol, &repeat, &space, &prev_code_len, symbol_lists, code_length_histo, next_symbol) /* code_len == 16..17, extra_bits == 2..3 */
|
ProcessSingleCodeLength(code_len, &symbol, &repeat, &space, &prev_code_len, symbol_lists, code_length_histo, next_symbol) /* code_len == 16..17, extra_bits == 2..3 */
|
||||||
|
@ -667,8 +667,8 @@ func ReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
} else {
|
} else {
|
||||||
extra_bits = 3
|
extra_bits = 3
|
||||||
}
|
}
|
||||||
var repeat_delta uint32 = uint32(BrotliGetBitsUnmasked(br)) & BitMask(extra_bits)
|
var repeat_delta uint32 = uint32(getBitsUnmasked(br)) & bitMask(extra_bits)
|
||||||
BrotliDropBits(br, extra_bits)
|
dropBits(br, extra_bits)
|
||||||
ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size, &symbol, &repeat, &space, &prev_code_len, &repeat_code_len, symbol_lists, code_length_histo, next_symbol)
|
ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size, &symbol, &repeat, &space, &prev_code_len, &repeat_code_len, symbol_lists, code_length_histo, next_symbol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -678,7 +678,7 @@ func ReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
func SafeReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
func SafeReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
var get_byte bool = false
|
var get_byte bool = false
|
||||||
var p []HuffmanCode
|
var p []HuffmanCode
|
||||||
for s.symbol < alphabet_size && s.space > 0 {
|
for s.symbol < alphabet_size && s.space > 0 {
|
||||||
|
@ -686,16 +686,16 @@ func SafeReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
var code_len uint32
|
var code_len uint32
|
||||||
var available_bits uint32
|
var available_bits uint32
|
||||||
var bits uint32 = 0
|
var bits uint32 = 0
|
||||||
if get_byte && !BrotliPullByte(br) {
|
if get_byte && !pullByte(br) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
get_byte = false
|
get_byte = false
|
||||||
available_bits = BrotliGetAvailableBits(br)
|
available_bits = getAvailableBits(br)
|
||||||
if available_bits != 0 {
|
if available_bits != 0 {
|
||||||
bits = uint32(BrotliGetBitsUnmasked(br))
|
bits = uint32(getBitsUnmasked(br))
|
||||||
}
|
}
|
||||||
|
|
||||||
p = p[bits&BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH):]
|
p = p[bits&bitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH):]
|
||||||
if uint32(p[0].bits) > available_bits {
|
if uint32(p[0].bits) > available_bits {
|
||||||
get_byte = true
|
get_byte = true
|
||||||
continue
|
continue
|
||||||
|
@ -703,17 +703,17 @@ func SafeReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
|
|
||||||
code_len = uint32(p[0].value) /* code_len == 0..17 */
|
code_len = uint32(p[0].value) /* code_len == 0..17 */
|
||||||
if code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH {
|
if code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH {
|
||||||
BrotliDropBits(br, uint32(p[0].bits))
|
dropBits(br, uint32(p[0].bits))
|
||||||
ProcessSingleCodeLength(code_len, &s.symbol, &s.repeat, &s.space, &s.prev_code_len, s.symbol_lists, s.code_length_histo[:], s.next_symbol[:]) /* code_len == 16..17, extra_bits == 2..3 */
|
ProcessSingleCodeLength(code_len, &s.symbol, &s.repeat, &s.space, &s.prev_code_len, s.symbol_lists, s.code_length_histo[:], s.next_symbol[:]) /* code_len == 16..17, extra_bits == 2..3 */
|
||||||
} else {
|
} else {
|
||||||
var extra_bits uint32 = code_len - 14
|
var extra_bits uint32 = code_len - 14
|
||||||
var repeat_delta uint32 = (bits >> p[0].bits) & BitMask(extra_bits)
|
var repeat_delta uint32 = (bits >> p[0].bits) & bitMask(extra_bits)
|
||||||
if available_bits < uint32(p[0].bits)+extra_bits {
|
if available_bits < uint32(p[0].bits)+extra_bits {
|
||||||
get_byte = true
|
get_byte = true
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliDropBits(br, uint32(p[0].bits)+extra_bits)
|
dropBits(br, uint32(p[0].bits)+extra_bits)
|
||||||
ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size, &s.symbol, &s.repeat, &s.space, &s.prev_code_len, &s.repeat_code_len, s.symbol_lists, s.code_length_histo[:], s.next_symbol[:])
|
ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size, &s.symbol, &s.repeat, &s.space, &s.prev_code_len, &s.repeat_code_len, s.symbol_lists, s.code_length_histo[:], s.next_symbol[:])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -724,7 +724,7 @@ func SafeReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
|
||||||
/* Reads and decodes 15..18 codes using static prefix code.
|
/* Reads and decodes 15..18 codes using static prefix code.
|
||||||
Each code is 2..4 bits long. In total 30..72 bits are used. */
|
Each code is 2..4 bits long. In total 30..72 bits are used. */
|
||||||
func ReadCodeLengthCodeLengths(s *Reader) int {
|
func ReadCodeLengthCodeLengths(s *Reader) int {
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
var num_codes uint32 = s.repeat
|
var num_codes uint32 = s.repeat
|
||||||
var space uint32 = s.space
|
var space uint32 = s.space
|
||||||
var i uint32 = s.sub_loop_counter
|
var i uint32 = s.sub_loop_counter
|
||||||
|
@ -732,10 +732,10 @@ func ReadCodeLengthCodeLengths(s *Reader) int {
|
||||||
var code_len_idx byte = kCodeLengthCodeOrder[i]
|
var code_len_idx byte = kCodeLengthCodeOrder[i]
|
||||||
var ix uint32
|
var ix uint32
|
||||||
var v uint32
|
var v uint32
|
||||||
if !BrotliSafeGetBits(br, 4, &ix) {
|
if !safeGetBits(br, 4, &ix) {
|
||||||
var available_bits uint32 = BrotliGetAvailableBits(br)
|
var available_bits uint32 = getAvailableBits(br)
|
||||||
if available_bits != 0 {
|
if available_bits != 0 {
|
||||||
ix = uint32(BrotliGetBitsUnmasked(br) & 0xF)
|
ix = uint32(getBitsUnmasked(br) & 0xF)
|
||||||
} else {
|
} else {
|
||||||
ix = 0
|
ix = 0
|
||||||
}
|
}
|
||||||
|
@ -750,7 +750,7 @@ func ReadCodeLengthCodeLengths(s *Reader) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
v = uint32(kCodeLengthPrefixValue[ix])
|
v = uint32(kCodeLengthPrefixValue[ix])
|
||||||
BrotliDropBits(br, uint32(kCodeLengthPrefixLength[ix]))
|
dropBits(br, uint32(kCodeLengthPrefixLength[ix]))
|
||||||
s.code_length_code_lengths[code_len_idx] = byte(v)
|
s.code_length_code_lengths[code_len_idx] = byte(v)
|
||||||
if v != 0 {
|
if v != 0 {
|
||||||
space = space - (32 >> v)
|
space = space - (32 >> v)
|
||||||
|
@ -782,7 +782,7 @@ func ReadCodeLengthCodeLengths(s *Reader) int {
|
||||||
B.2) Decoded table is used to decode code lengths of symbols in resulting
|
B.2) Decoded table is used to decode code lengths of symbols in resulting
|
||||||
Huffman table. In worst case 3520 bits are read. */
|
Huffman table. In worst case 3520 bits are read. */
|
||||||
func ReadHuffmanCode(alphabet_size uint32, max_symbol uint32, table []HuffmanCode, opt_table_size *uint32, s *Reader) int {
|
func ReadHuffmanCode(alphabet_size uint32, max_symbol uint32, table []HuffmanCode, opt_table_size *uint32, s *Reader) int {
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
|
|
||||||
/* Unnecessary masking, but might be good for safety. */
|
/* Unnecessary masking, but might be good for safety. */
|
||||||
alphabet_size &= 0x7FF
|
alphabet_size &= 0x7FF
|
||||||
|
@ -791,7 +791,7 @@ func ReadHuffmanCode(alphabet_size uint32, max_symbol uint32, table []HuffmanCod
|
||||||
for {
|
for {
|
||||||
switch s.substate_huffman {
|
switch s.substate_huffman {
|
||||||
case BROTLI_STATE_HUFFMAN_NONE:
|
case BROTLI_STATE_HUFFMAN_NONE:
|
||||||
if !BrotliSafeReadBits(br, 2, &s.sub_loop_counter) {
|
if !safeReadBits(br, 2, &s.sub_loop_counter) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -818,7 +818,7 @@ func ReadHuffmanCode(alphabet_size uint32, max_symbol uint32, table []HuffmanCod
|
||||||
/* Read symbols, codes & code lengths directly. */
|
/* Read symbols, codes & code lengths directly. */
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
|
case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
|
||||||
if !BrotliSafeReadBits(br, 2, &s.symbol) { /* num_symbols */
|
if !safeReadBits(br, 2, &s.symbol) { /* num_symbols */
|
||||||
s.substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE
|
s.substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
@ -841,7 +841,7 @@ func ReadHuffmanCode(alphabet_size uint32, max_symbol uint32, table []HuffmanCod
|
||||||
var table_size uint32
|
var table_size uint32
|
||||||
if s.symbol == 3 {
|
if s.symbol == 3 {
|
||||||
var bits uint32
|
var bits uint32
|
||||||
if !BrotliSafeReadBits(br, 1, &bits) {
|
if !safeReadBits(br, 1, &bits) {
|
||||||
s.substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD
|
s.substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
@ -921,17 +921,17 @@ func ReadHuffmanCode(alphabet_size uint32, max_symbol uint32, table []HuffmanCod
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Decodes a block length by reading 3..39 bits. */
|
/* Decodes a block length by reading 3..39 bits. */
|
||||||
func ReadBlockLength(table []HuffmanCode, br *BrotliBitReader) uint32 {
|
func ReadBlockLength(table []HuffmanCode, br *bitReader) uint32 {
|
||||||
var code uint32
|
var code uint32
|
||||||
var nbits uint32
|
var nbits uint32
|
||||||
code = ReadSymbol(table, br)
|
code = ReadSymbol(table, br)
|
||||||
nbits = uint32(kBlockLengthPrefixCode1[code].nbits) /* nbits == 2..24 */
|
nbits = uint32(kBlockLengthPrefixCode1[code].nbits) /* nbits == 2..24 */
|
||||||
return uint32(kBlockLengthPrefixCode1[code].offset) + BrotliReadBits(br, nbits)
|
return uint32(kBlockLengthPrefixCode1[code].offset) + readBits(br, nbits)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
|
/* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
|
||||||
reading can't be continued with ReadBlockLength. */
|
reading can't be continued with ReadBlockLength. */
|
||||||
func SafeReadBlockLength(s *Reader, result *uint32, table []HuffmanCode, br *BrotliBitReader) bool {
|
func SafeReadBlockLength(s *Reader, result *uint32, table []HuffmanCode, br *bitReader) bool {
|
||||||
var index uint32
|
var index uint32
|
||||||
if s.substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE {
|
if s.substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE {
|
||||||
if !SafeReadSymbol(table, br, &index) {
|
if !SafeReadSymbol(table, br, &index) {
|
||||||
|
@ -943,7 +943,7 @@ func SafeReadBlockLength(s *Reader, result *uint32, table []HuffmanCode, br *Bro
|
||||||
{
|
{
|
||||||
var bits uint32 /* nbits == 2..24 */
|
var bits uint32 /* nbits == 2..24 */
|
||||||
var nbits uint32 = uint32(kBlockLengthPrefixCode1[index].nbits)
|
var nbits uint32 = uint32(kBlockLengthPrefixCode1[index].nbits)
|
||||||
if !BrotliSafeReadBits(br, nbits, &bits) {
|
if !safeReadBits(br, nbits, &bits) {
|
||||||
s.block_length_index = index
|
s.block_length_index = index
|
||||||
s.substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX
|
s.substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX
|
||||||
return false
|
return false
|
||||||
|
@ -1024,7 +1024,7 @@ func HuffmanTreeGroupDecode(group *HuffmanTreeGroup, s *Reader) int {
|
||||||
3) Read context map items; "0" values could be run-length encoded.
|
3) Read context map items; "0" values could be run-length encoded.
|
||||||
4) Optionally, apply InverseMoveToFront transform to the resulting map. */
|
4) Optionally, apply InverseMoveToFront transform to the resulting map. */
|
||||||
func DecodeContextMap(context_map_size uint32, num_htrees *uint32, context_map_arg *[]byte, s *Reader) int {
|
func DecodeContextMap(context_map_size uint32, num_htrees *uint32, context_map_arg *[]byte, s *Reader) int {
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
var result int = BROTLI_DECODER_SUCCESS
|
var result int = BROTLI_DECODER_SUCCESS
|
||||||
|
|
||||||
switch int(s.substate_context_map) {
|
switch int(s.substate_context_map) {
|
||||||
|
@ -1057,16 +1057,16 @@ func DecodeContextMap(context_map_size uint32, num_htrees *uint32, context_map_a
|
||||||
|
|
||||||
/* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
|
/* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
|
||||||
to peek 4 bits ahead. */
|
to peek 4 bits ahead. */
|
||||||
if !BrotliSafeGetBits(br, 5, &bits) {
|
if !safeGetBits(br, 5, &bits) {
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
if bits&1 != 0 { /* Use RLE for zeros. */
|
if bits&1 != 0 { /* Use RLE for zeros. */
|
||||||
s.max_run_length_prefix = (bits >> 1) + 1
|
s.max_run_length_prefix = (bits >> 1) + 1
|
||||||
BrotliDropBits(br, 5)
|
dropBits(br, 5)
|
||||||
} else {
|
} else {
|
||||||
s.max_run_length_prefix = 0
|
s.max_run_length_prefix = 0
|
||||||
BrotliDropBits(br, 1)
|
dropBits(br, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN
|
s.substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN
|
||||||
|
@ -1120,7 +1120,7 @@ func DecodeContextMap(context_map_size uint32, num_htrees *uint32, context_map_a
|
||||||
/* RLE sub-stage. */
|
/* RLE sub-stage. */
|
||||||
{
|
{
|
||||||
var reps uint32
|
var reps uint32
|
||||||
if !BrotliSafeReadBits(br, code, &reps) {
|
if !safeReadBits(br, code, &reps) {
|
||||||
s.code = code
|
s.code = code
|
||||||
s.context_index = context_index
|
s.context_index = context_index
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
|
@ -1148,7 +1148,7 @@ func DecodeContextMap(context_map_size uint32, num_htrees *uint32, context_map_a
|
||||||
case BROTLI_STATE_CONTEXT_MAP_TRANSFORM:
|
case BROTLI_STATE_CONTEXT_MAP_TRANSFORM:
|
||||||
{
|
{
|
||||||
var bits uint32
|
var bits uint32
|
||||||
if !BrotliSafeReadBits(br, 1, &bits) {
|
if !safeReadBits(br, 1, &bits) {
|
||||||
s.substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM
|
s.substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
@ -1175,7 +1175,7 @@ func DecodeBlockTypeAndLength(safe int, s *Reader, tree_type int) bool {
|
||||||
type_tree = s.block_type_trees[tree_type*BROTLI_HUFFMAN_MAX_SIZE_258:]
|
type_tree = s.block_type_trees[tree_type*BROTLI_HUFFMAN_MAX_SIZE_258:]
|
||||||
var len_tree []HuffmanCode
|
var len_tree []HuffmanCode
|
||||||
len_tree = s.block_len_trees[tree_type*BROTLI_HUFFMAN_MAX_SIZE_26:]
|
len_tree = s.block_len_trees[tree_type*BROTLI_HUFFMAN_MAX_SIZE_26:]
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
var ringbuffer []uint32 = s.block_type_rb[tree_type*2:]
|
var ringbuffer []uint32 = s.block_type_rb[tree_type*2:]
|
||||||
var block_type uint32
|
var block_type uint32
|
||||||
if max_block_type <= 1 {
|
if max_block_type <= 1 {
|
||||||
|
@ -1187,14 +1187,14 @@ func DecodeBlockTypeAndLength(safe int, s *Reader, tree_type int) bool {
|
||||||
block_type = ReadSymbol(type_tree, br)
|
block_type = ReadSymbol(type_tree, br)
|
||||||
s.block_length[tree_type] = ReadBlockLength(len_tree, br)
|
s.block_length[tree_type] = ReadBlockLength(len_tree, br)
|
||||||
} else {
|
} else {
|
||||||
var memento BrotliBitReaderState
|
var memento bitReaderState
|
||||||
BrotliBitReaderSaveState(br, &memento)
|
bitReaderSaveState(br, &memento)
|
||||||
if !SafeReadSymbol(type_tree, br, &block_type) {
|
if !SafeReadSymbol(type_tree, br, &block_type) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if !SafeReadBlockLength(s, &s.block_length[tree_type], len_tree, br) {
|
if !SafeReadBlockLength(s, &s.block_length[tree_type], len_tree, br) {
|
||||||
s.substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE
|
s.substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE
|
||||||
BrotliBitReaderRestoreState(br, &memento)
|
bitReaderRestoreState(br, &memento)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1430,7 +1430,7 @@ func CopyUncompressedBlockToOutput(available_out *uint, next_out *[]byte, total_
|
||||||
switch s.substate_uncompressed {
|
switch s.substate_uncompressed {
|
||||||
case BROTLI_STATE_UNCOMPRESSED_NONE:
|
case BROTLI_STATE_UNCOMPRESSED_NONE:
|
||||||
{
|
{
|
||||||
var nbytes int = int(BrotliGetRemainingBytes(&s.br))
|
var nbytes int = int(getRemainingBytes(&s.br))
|
||||||
if nbytes > s.meta_block_remaining_len {
|
if nbytes > s.meta_block_remaining_len {
|
||||||
nbytes = s.meta_block_remaining_len
|
nbytes = s.meta_block_remaining_len
|
||||||
}
|
}
|
||||||
|
@ -1440,7 +1440,7 @@ func CopyUncompressedBlockToOutput(available_out *uint, next_out *[]byte, total_
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy remaining bytes from s->br.buf_ to ring-buffer. */
|
/* Copy remaining bytes from s->br.buf_ to ring-buffer. */
|
||||||
BrotliCopyBytes(s.ringbuffer[s.pos:], &s.br, uint(nbytes))
|
copyBytes(s.ringbuffer[s.pos:], &s.br, uint(nbytes))
|
||||||
|
|
||||||
s.pos += nbytes
|
s.pos += nbytes
|
||||||
s.meta_block_remaining_len -= nbytes
|
s.meta_block_remaining_len -= nbytes
|
||||||
|
@ -1535,12 +1535,12 @@ func BrotliCalculateRingBufferSize(s *Reader) {
|
||||||
|
|
||||||
/* Reads 1..256 2-bit context modes. */
|
/* Reads 1..256 2-bit context modes. */
|
||||||
func ReadContextModes(s *Reader) int {
|
func ReadContextModes(s *Reader) int {
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
var i int = s.loop_counter
|
var i int = s.loop_counter
|
||||||
|
|
||||||
for i < int(s.num_block_types[0]) {
|
for i < int(s.num_block_types[0]) {
|
||||||
var bits uint32
|
var bits uint32
|
||||||
if !BrotliSafeReadBits(br, 2, &bits) {
|
if !safeReadBits(br, 2, &bits) {
|
||||||
s.loop_counter = i
|
s.loop_counter = i
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
return BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
}
|
}
|
||||||
|
@ -1585,9 +1585,9 @@ func TakeDistanceFromRingBuffer(s *Reader) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func SafeReadBits(br *BrotliBitReader, n_bits uint32, val *uint32) bool {
|
func SafeReadBits(br *bitReader, n_bits uint32, val *uint32) bool {
|
||||||
if n_bits != 0 {
|
if n_bits != 0 {
|
||||||
return BrotliSafeReadBits(br, n_bits, val)
|
return safeReadBits(br, n_bits, val)
|
||||||
} else {
|
} else {
|
||||||
*val = 0
|
*val = 0
|
||||||
return true
|
return true
|
||||||
|
@ -1595,15 +1595,15 @@ func SafeReadBits(br *BrotliBitReader, n_bits uint32, val *uint32) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Precondition: s->distance_code < 0. */
|
/* Precondition: s->distance_code < 0. */
|
||||||
func ReadDistanceInternal(safe int, s *Reader, br *BrotliBitReader) bool {
|
func ReadDistanceInternal(safe int, s *Reader, br *bitReader) bool {
|
||||||
var distval int
|
var distval int
|
||||||
var memento BrotliBitReaderState
|
var memento bitReaderState
|
||||||
var distance_tree []HuffmanCode = []HuffmanCode(s.distance_hgroup.htrees[s.dist_htree_index])
|
var distance_tree []HuffmanCode = []HuffmanCode(s.distance_hgroup.htrees[s.dist_htree_index])
|
||||||
if safe == 0 {
|
if safe == 0 {
|
||||||
s.distance_code = int(ReadSymbol(distance_tree, br))
|
s.distance_code = int(ReadSymbol(distance_tree, br))
|
||||||
} else {
|
} else {
|
||||||
var code uint32
|
var code uint32
|
||||||
BrotliBitReaderSaveState(br, &memento)
|
bitReaderSaveState(br, &memento)
|
||||||
if !SafeReadSymbol(distance_tree, br, &code) {
|
if !SafeReadSymbol(distance_tree, br, &code) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -1629,7 +1629,7 @@ func ReadDistanceInternal(safe int, s *Reader, br *BrotliBitReader) bool {
|
||||||
if safe == 0 && (s.distance_postfix_bits == 0) {
|
if safe == 0 && (s.distance_postfix_bits == 0) {
|
||||||
nbits = (uint32(distval) >> 1) + 1
|
nbits = (uint32(distval) >> 1) + 1
|
||||||
offset = ((2 + (distval & 1)) << nbits) - 4
|
offset = ((2 + (distval & 1)) << nbits) - 4
|
||||||
s.distance_code = int(s.num_direct_distance_codes) + offset + int(BrotliReadBits(br, nbits))
|
s.distance_code = int(s.num_direct_distance_codes) + offset + int(readBits(br, nbits))
|
||||||
} else {
|
} else {
|
||||||
/* This branch also works well when s->distance_postfix_bits == 0. */
|
/* This branch also works well when s->distance_postfix_bits == 0. */
|
||||||
var bits uint32
|
var bits uint32
|
||||||
|
@ -1639,11 +1639,11 @@ func ReadDistanceInternal(safe int, s *Reader, br *BrotliBitReader) bool {
|
||||||
if safe != 0 {
|
if safe != 0 {
|
||||||
if !SafeReadBits(br, nbits, &bits) {
|
if !SafeReadBits(br, nbits, &bits) {
|
||||||
s.distance_code = -1 /* Restore precondition. */
|
s.distance_code = -1 /* Restore precondition. */
|
||||||
BrotliBitReaderRestoreState(br, &memento)
|
bitReaderRestoreState(br, &memento)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bits = BrotliReadBits(br, nbits)
|
bits = readBits(br, nbits)
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = ((2 + (distval & 1)) << nbits) - 4
|
offset = ((2 + (distval & 1)) << nbits) - 4
|
||||||
|
@ -1656,24 +1656,24 @@ func ReadDistanceInternal(safe int, s *Reader, br *BrotliBitReader) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadDistance(s *Reader, br *BrotliBitReader) {
|
func ReadDistance(s *Reader, br *bitReader) {
|
||||||
ReadDistanceInternal(0, s, br)
|
ReadDistanceInternal(0, s, br)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SafeReadDistance(s *Reader, br *BrotliBitReader) bool {
|
func SafeReadDistance(s *Reader, br *bitReader) bool {
|
||||||
return ReadDistanceInternal(1, s, br)
|
return ReadDistanceInternal(1, s, br)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadCommandInternal(safe int, s *Reader, br *BrotliBitReader, insert_length *int) bool {
|
func ReadCommandInternal(safe int, s *Reader, br *bitReader, insert_length *int) bool {
|
||||||
var cmd_code uint32
|
var cmd_code uint32
|
||||||
var insert_len_extra uint32 = 0
|
var insert_len_extra uint32 = 0
|
||||||
var copy_length uint32
|
var copy_length uint32
|
||||||
var v CmdLutElement
|
var v CmdLutElement
|
||||||
var memento BrotliBitReaderState
|
var memento bitReaderState
|
||||||
if safe == 0 {
|
if safe == 0 {
|
||||||
cmd_code = ReadSymbol(s.htree_command, br)
|
cmd_code = ReadSymbol(s.htree_command, br)
|
||||||
} else {
|
} else {
|
||||||
BrotliBitReaderSaveState(br, &memento)
|
bitReaderSaveState(br, &memento)
|
||||||
if !SafeReadSymbol(s.htree_command, br, &cmd_code) {
|
if !SafeReadSymbol(s.htree_command, br, &cmd_code) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -1686,13 +1686,13 @@ func ReadCommandInternal(safe int, s *Reader, br *BrotliBitReader, insert_length
|
||||||
*insert_length = int(v.insert_len_offset)
|
*insert_length = int(v.insert_len_offset)
|
||||||
if safe == 0 {
|
if safe == 0 {
|
||||||
if v.insert_len_extra_bits != 0 {
|
if v.insert_len_extra_bits != 0 {
|
||||||
insert_len_extra = BrotliReadBits(br, uint32(v.insert_len_extra_bits))
|
insert_len_extra = readBits(br, uint32(v.insert_len_extra_bits))
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_length = BrotliReadBits(br, uint32(v.copy_len_extra_bits))
|
copy_length = readBits(br, uint32(v.copy_len_extra_bits))
|
||||||
} else {
|
} else {
|
||||||
if !SafeReadBits(br, uint32(v.insert_len_extra_bits), &insert_len_extra) || !SafeReadBits(br, uint32(v.copy_len_extra_bits), ©_length) {
|
if !SafeReadBits(br, uint32(v.insert_len_extra_bits), &insert_len_extra) || !SafeReadBits(br, uint32(v.copy_len_extra_bits), ©_length) {
|
||||||
BrotliBitReaderRestoreState(br, &memento)
|
bitReaderRestoreState(br, &memento)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1703,27 +1703,27 @@ func ReadCommandInternal(safe int, s *Reader, br *BrotliBitReader, insert_length
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadCommand(s *Reader, br *BrotliBitReader, insert_length *int) {
|
func ReadCommand(s *Reader, br *bitReader, insert_length *int) {
|
||||||
ReadCommandInternal(0, s, br, insert_length)
|
ReadCommandInternal(0, s, br, insert_length)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SafeReadCommand(s *Reader, br *BrotliBitReader, insert_length *int) bool {
|
func SafeReadCommand(s *Reader, br *bitReader, insert_length *int) bool {
|
||||||
return ReadCommandInternal(1, s, br, insert_length)
|
return ReadCommandInternal(1, s, br, insert_length)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CheckInputAmount(safe int, br *BrotliBitReader, num uint) bool {
|
func CheckInputAmount(safe int, br *bitReader, num uint) bool {
|
||||||
if safe != 0 {
|
if safe != 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
return BrotliCheckInputAmount(br, num)
|
return checkInputAmount(br, num)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProcessCommandsInternal(safe int, s *Reader) int {
|
func ProcessCommandsInternal(safe int, s *Reader) int {
|
||||||
var pos int = s.pos
|
var pos int = s.pos
|
||||||
var i int = s.loop_counter
|
var i int = s.loop_counter
|
||||||
var result int = BROTLI_DECODER_SUCCESS
|
var result int = BROTLI_DECODER_SUCCESS
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
var hc []HuffmanCode
|
var hc []HuffmanCode
|
||||||
|
|
||||||
if !CheckInputAmount(safe, br, 28) {
|
if !CheckInputAmount(safe, br, 28) {
|
||||||
|
@ -1732,7 +1732,7 @@ func ProcessCommandsInternal(safe int, s *Reader) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
if safe == 0 {
|
if safe == 0 {
|
||||||
BrotliWarmupBitReader(br)
|
warmupBitReader(br)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Jump into state machine. */
|
/* Jump into state machine. */
|
||||||
|
@ -1970,7 +1970,7 @@ CommandPostDecodeLiterals:
|
||||||
var transforms *BrotliTransforms = s.transforms
|
var transforms *BrotliTransforms = s.transforms
|
||||||
var offset int = int(s.dictionary.offsets_by_length[i])
|
var offset int = int(s.dictionary.offsets_by_length[i])
|
||||||
var shift uint32 = uint32(s.dictionary.size_bits_by_length[i])
|
var shift uint32 = uint32(s.dictionary.size_bits_by_length[i])
|
||||||
var mask int = int(BitMask(shift))
|
var mask int = int(bitMask(shift))
|
||||||
var word_idx int = address & mask
|
var word_idx int = address & mask
|
||||||
var transform_idx int = address >> shift
|
var transform_idx int = address >> shift
|
||||||
|
|
||||||
|
@ -2125,7 +2125,7 @@ func BrotliMaxDistanceSymbol(ndirect uint32, npostfix uint32) uint32 {
|
||||||
buffer; this is possible because the invariant is held on enter */
|
buffer; this is possible because the invariant is held on enter */
|
||||||
func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byte, available_out *uint, next_out *[]byte) int {
|
func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byte, available_out *uint, next_out *[]byte) int {
|
||||||
var result int = BROTLI_DECODER_SUCCESS
|
var result int = BROTLI_DECODER_SUCCESS
|
||||||
var br *BrotliBitReader = &s.br
|
var br *bitReader = &s.br
|
||||||
|
|
||||||
/* Do not try to process further in a case of unrecoverable error. */
|
/* Do not try to process further in a case of unrecoverable error. */
|
||||||
if int(s.error_code) < 0 {
|
if int(s.error_code) < 0 {
|
||||||
|
@ -2227,7 +2227,7 @@ func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byt
|
||||||
/* Using input stream in last iteration. When decoder switches to input
|
/* Using input stream in last iteration. When decoder switches to input
|
||||||
stream it has less than 8 bits in accumulator, so it is safe to
|
stream it has less than 8 bits in accumulator, so it is safe to
|
||||||
return unused accumulator bits there. */
|
return unused accumulator bits there. */
|
||||||
BrotliBitReaderUnload(br)
|
bitReaderUnload(br)
|
||||||
|
|
||||||
*available_in = br.input_len - br.byte_pos
|
*available_in = br.input_len - br.byte_pos
|
||||||
*next_in = br.input[br.byte_pos:]
|
*next_in = br.input[br.byte_pos:]
|
||||||
|
@ -2239,7 +2239,7 @@ func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byt
|
||||||
switch s.state {
|
switch s.state {
|
||||||
/* Prepare to the first read. */
|
/* Prepare to the first read. */
|
||||||
case BROTLI_STATE_UNINITED:
|
case BROTLI_STATE_UNINITED:
|
||||||
if !BrotliWarmupBitReader(br) {
|
if !warmupBitReader(br) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -2258,7 +2258,7 @@ func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byt
|
||||||
s.state = BROTLI_STATE_INITIALIZE
|
s.state = BROTLI_STATE_INITIALIZE
|
||||||
|
|
||||||
case BROTLI_STATE_LARGE_WINDOW_BITS:
|
case BROTLI_STATE_LARGE_WINDOW_BITS:
|
||||||
if !BrotliSafeReadBits(br, 6, &s.window_bits) {
|
if !safeReadBits(br, 6, &s.window_bits) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -2305,7 +2305,7 @@ func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byt
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.is_metadata != 0 || s.is_uncompressed != 0 {
|
if s.is_metadata != 0 || s.is_uncompressed != 0 {
|
||||||
if !BrotliJumpToByteBoundary(br) {
|
if !jumpToByteBoundary(br) {
|
||||||
result = BROTLI_DECODER_ERROR_FORMAT_PADDING_1
|
result = BROTLI_DECODER_ERROR_FORMAT_PADDING_1
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -2346,7 +2346,7 @@ func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byt
|
||||||
var bits uint32
|
var bits uint32
|
||||||
|
|
||||||
/* Read one byte and ignore it. */
|
/* Read one byte and ignore it. */
|
||||||
if !BrotliSafeReadBits(br, 8, &bits) {
|
if !safeReadBits(br, 8, &bits) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -2420,15 +2420,15 @@ func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byt
|
||||||
case BROTLI_STATE_METABLOCK_HEADER_2:
|
case BROTLI_STATE_METABLOCK_HEADER_2:
|
||||||
{
|
{
|
||||||
var bits uint32
|
var bits uint32
|
||||||
if !BrotliSafeReadBits(br, 6, &bits) {
|
if !safeReadBits(br, 6, &bits) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
s.distance_postfix_bits = bits & BitMask(2)
|
s.distance_postfix_bits = bits & bitMask(2)
|
||||||
bits >>= 2
|
bits >>= 2
|
||||||
s.num_direct_distance_codes = BROTLI_NUM_DISTANCE_SHORT_CODES + (bits << s.distance_postfix_bits)
|
s.num_direct_distance_codes = BROTLI_NUM_DISTANCE_SHORT_CODES + (bits << s.distance_postfix_bits)
|
||||||
s.distance_postfix_mask = int(BitMask(s.distance_postfix_bits))
|
s.distance_postfix_mask = int(bitMask(s.distance_postfix_bits))
|
||||||
s.context_modes = make([]byte, uint(s.num_block_types[0]))
|
s.context_modes = make([]byte, uint(s.num_block_types[0]))
|
||||||
if s.context_modes == nil {
|
if s.context_modes == nil {
|
||||||
result = BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES
|
result = BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES
|
||||||
|
@ -2607,13 +2607,13 @@ func BrotliDecoderDecompressStream(s *Reader, available_in *uint, next_in *[]byt
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if !BrotliJumpToByteBoundary(br) {
|
if !jumpToByteBoundary(br) {
|
||||||
result = BROTLI_DECODER_ERROR_FORMAT_PADDING_2
|
result = BROTLI_DECODER_ERROR_FORMAT_PADDING_2
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.buffer_length == 0 {
|
if s.buffer_length == 0 {
|
||||||
BrotliBitReaderUnload(br)
|
bitReaderUnload(br)
|
||||||
*available_in = br.input_len - br.byte_pos
|
*available_in = br.input_len - br.byte_pos
|
||||||
*next_in = br.input[br.byte_pos:]
|
*next_in = br.input[br.byte_pos:]
|
||||||
}
|
}
|
||||||
|
@ -2681,7 +2681,7 @@ func BrotliDecoderTakeOutput(s *Reader, size *uint) []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliDecoderIsUsed(s *Reader) bool {
|
func BrotliDecoderIsUsed(s *Reader) bool {
|
||||||
return s.state != BROTLI_STATE_UNINITED || BrotliGetAvailableBits(&s.br) != 0
|
return s.state != BROTLI_STATE_UNINITED || getAvailableBits(&s.br) != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func BrotliDecoderIsFinished(s *Reader) bool {
|
func BrotliDecoderIsFinished(s *Reader) bool {
|
||||||
|
|
26
encode.go
26
encode.go
|
@ -710,11 +710,11 @@ func ChooseContextMap(quality int, bigram_histo []uint32, num_literal_contexts *
|
||||||
two_prefix_histo[i%6] += bigram_histo[i]
|
two_prefix_histo[i%6] += bigram_histo[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
entropy[1] = ShannonEntropy(monogram_histo[:], 3, &dummy)
|
entropy[1] = shannonEntropy(monogram_histo[:], 3, &dummy)
|
||||||
entropy[2] = (ShannonEntropy(two_prefix_histo[:], 3, &dummy) + ShannonEntropy(two_prefix_histo[3:], 3, &dummy))
|
entropy[2] = (shannonEntropy(two_prefix_histo[:], 3, &dummy) + shannonEntropy(two_prefix_histo[3:], 3, &dummy))
|
||||||
entropy[3] = 0
|
entropy[3] = 0
|
||||||
for i = 0; i < 3; i++ {
|
for i = 0; i < 3; i++ {
|
||||||
entropy[3] += ShannonEntropy(bigram_histo[3*i:], 3, &dummy)
|
entropy[3] += shannonEntropy(bigram_histo[3*i:], 3, &dummy)
|
||||||
}
|
}
|
||||||
|
|
||||||
total = uint(monogram_histo[0] + monogram_histo[1] + monogram_histo[2])
|
total = uint(monogram_histo[0] + monogram_histo[1] + monogram_histo[2])
|
||||||
|
@ -848,10 +848,10 @@ func ShouldUseComplexStaticContextMap(input []byte, start_pos uint, length uint,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
entropy[1] = ShannonEntropy(combined_histo[:], 32, &dummy)
|
entropy[1] = shannonEntropy(combined_histo[:], 32, &dummy)
|
||||||
entropy[2] = 0
|
entropy[2] = 0
|
||||||
for i = 0; i < 13; i++ {
|
for i = 0; i < 13; i++ {
|
||||||
entropy[2] += ShannonEntropy(context_histo[i][0:], 32, &dummy)
|
entropy[2] += shannonEntropy(context_histo[i][0:], 32, &dummy)
|
||||||
}
|
}
|
||||||
|
|
||||||
entropy[0] = 1.0 / float64(total)
|
entropy[0] = 1.0 / float64(total)
|
||||||
|
@ -922,7 +922,7 @@ func ShouldCompress_encode(data []byte, mask uint, last_flush_pos uint64, bytes
|
||||||
pos += kSampleRate
|
pos += kSampleRate
|
||||||
}
|
}
|
||||||
|
|
||||||
if BitsEntropy(literal_histo[:], 256) > bit_cost_threshold {
|
if bitsEntropy(literal_histo[:], 256) > bit_cost_threshold {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1348,12 +1348,12 @@ func EncodeData(s *Writer, is_last bool, force_flush bool, out_size *uint, outpu
|
||||||
|
|
||||||
if s.params.quality == ZOPFLIFICATION_QUALITY {
|
if s.params.quality == ZOPFLIFICATION_QUALITY {
|
||||||
assert(s.params.hasher.type_ == 10)
|
assert(s.params.hasher.type_ == 10)
|
||||||
BrotliCreateZopfliBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_.(*H10), s.dist_cache_[:], &s.last_insert_len_, s.commands_[s.num_commands_:], &s.num_commands_, &s.num_literals_)
|
createZopfliBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_.(*H10), s.dist_cache_[:], &s.last_insert_len_, s.commands_[s.num_commands_:], &s.num_commands_, &s.num_literals_)
|
||||||
} else if s.params.quality == HQ_ZOPFLIFICATION_QUALITY {
|
} else if s.params.quality == HQ_ZOPFLIFICATION_QUALITY {
|
||||||
assert(s.params.hasher.type_ == 10)
|
assert(s.params.hasher.type_ == 10)
|
||||||
BrotliCreateHqZopfliBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_, s.dist_cache_[:], &s.last_insert_len_, s.commands_[s.num_commands_:], &s.num_commands_, &s.num_literals_)
|
createHqZopfliBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_, s.dist_cache_[:], &s.last_insert_len_, s.commands_[s.num_commands_:], &s.num_commands_, &s.num_literals_)
|
||||||
} else {
|
} else {
|
||||||
BrotliCreateBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_, s.dist_cache_[:], &s.last_insert_len_, s.commands_[s.num_commands_:], &s.num_commands_, &s.num_literals_)
|
createBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_, s.dist_cache_[:], &s.last_insert_len_, s.commands_[s.num_commands_:], &s.num_commands_, &s.num_literals_)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var max_length uint = MaxMetablockSize(&s.params)
|
var max_length uint = MaxMetablockSize(&s.params)
|
||||||
|
@ -1517,12 +1517,12 @@ func BrotliCompressBufferQuality10(lgwin int, input_size uint, input_buffer []by
|
||||||
var block_start uint
|
var block_start uint
|
||||||
for block_start = metablock_start; block_start < metablock_end; {
|
for block_start = metablock_start; block_start < metablock_end; {
|
||||||
var block_size uint = brotli_min_size_t(metablock_end-block_start, max_block_size)
|
var block_size uint = brotli_min_size_t(metablock_end-block_start, max_block_size)
|
||||||
var nodes []ZopfliNode = make([]ZopfliNode, (block_size + 1))
|
var nodes []zopfliNode = make([]zopfliNode, (block_size + 1))
|
||||||
var path_size uint
|
var path_size uint
|
||||||
var new_cmd_alloc_size uint
|
var new_cmd_alloc_size uint
|
||||||
BrotliInitZopfliNodes(nodes, block_size+1)
|
initZopfliNodes(nodes, block_size+1)
|
||||||
hasher.StitchToPreviousBlock(block_size, block_start, input_buffer, mask)
|
hasher.StitchToPreviousBlock(block_size, block_start, input_buffer, mask)
|
||||||
path_size = BrotliZopfliComputeShortestPath(block_size, block_start, input_buffer, mask, ¶ms, dist_cache[:], hasher.(*H10), nodes)
|
path_size = zopfliComputeShortestPath(block_size, block_start, input_buffer, mask, ¶ms, dist_cache[:], hasher.(*H10), nodes)
|
||||||
|
|
||||||
/* We allocate a command buffer in the first iteration of this loop that
|
/* We allocate a command buffer in the first iteration of this loop that
|
||||||
will be likely big enough for the whole metablock, so that for most
|
will be likely big enough for the whole metablock, so that for most
|
||||||
|
@ -1545,7 +1545,7 @@ func BrotliCompressBufferQuality10(lgwin int, input_size uint, input_buffer []by
|
||||||
commands = new_commands
|
commands = new_commands
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliZopfliCreateCommands(block_size, block_start, nodes[0:], dist_cache[:], &last_insert_len, ¶ms, commands[num_commands:], &num_literals)
|
zopfliCreateCommands(block_size, block_start, nodes[0:], dist_cache[:], &last_insert_len, ¶ms, commands[num_commands:], &num_literals)
|
||||||
num_commands += path_size
|
num_commands += path_size
|
||||||
block_start += block_size
|
block_start += block_size
|
||||||
metablock_size += block_size
|
metablock_size += block_size
|
||||||
|
|
|
@ -161,7 +161,7 @@ func ComputeDistanceCost(cmds []Command, num_commands uint, orig_params *BrotliD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*cost = BrotliPopulationCostDistance(&histo) + extra_bits
|
*cost = populationCostDistance(&histo) + extra_bits
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -363,7 +363,7 @@ func ContextBlockSplitterFinishBlock(self *ContextBlockSplitter, is_final bool)
|
||||||
split.types[0] = 0
|
split.types[0] = 0
|
||||||
|
|
||||||
for i = 0; i < num_contexts; i++ {
|
for i = 0; i < num_contexts; i++ {
|
||||||
last_entropy[i] = BitsEntropy(histograms[i].data_[:], self.alphabet_size_)
|
last_entropy[i] = bitsEntropy(histograms[i].data_[:], self.alphabet_size_)
|
||||||
last_entropy[num_contexts+i] = last_entropy[i]
|
last_entropy[num_contexts+i] = last_entropy[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,13 +389,13 @@ func ContextBlockSplitterFinishBlock(self *ContextBlockSplitter, is_final bool)
|
||||||
for i = 0; i < num_contexts; i++ {
|
for i = 0; i < num_contexts; i++ {
|
||||||
var curr_histo_ix uint = self.curr_histogram_ix_ + i
|
var curr_histo_ix uint = self.curr_histogram_ix_ + i
|
||||||
var j uint
|
var j uint
|
||||||
entropy[i] = BitsEntropy(histograms[curr_histo_ix].data_[:], self.alphabet_size_)
|
entropy[i] = bitsEntropy(histograms[curr_histo_ix].data_[:], self.alphabet_size_)
|
||||||
for j = 0; j < 2; j++ {
|
for j = 0; j < 2; j++ {
|
||||||
var jx uint = j*num_contexts + i
|
var jx uint = j*num_contexts + i
|
||||||
var last_histogram_ix uint = self.last_histogram_ix_[j] + i
|
var last_histogram_ix uint = self.last_histogram_ix_[j] + i
|
||||||
combined_histo[jx] = histograms[curr_histo_ix]
|
combined_histo[jx] = histograms[curr_histo_ix]
|
||||||
HistogramAddHistogramLiteral(&combined_histo[jx], &histograms[last_histogram_ix])
|
HistogramAddHistogramLiteral(&combined_histo[jx], &histograms[last_histogram_ix])
|
||||||
combined_entropy[jx] = BitsEntropy(combined_histo[jx].data_[0:], self.alphabet_size_)
|
combined_entropy[jx] = bitsEntropy(combined_histo[jx].data_[0:], self.alphabet_size_)
|
||||||
diff[j] += combined_entropy[jx] - entropy[i] - last_entropy[jx]
|
diff[j] += combined_entropy[jx] - entropy[i] - last_entropy[jx]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ func BlockSplitterFinishBlockCommand(self *BlockSplitterCommand, is_final bool)
|
||||||
split.lengths[0] = uint32(self.block_size_)
|
split.lengths[0] = uint32(self.block_size_)
|
||||||
|
|
||||||
split.types[0] = 0
|
split.types[0] = 0
|
||||||
last_entropy[0] = BitsEntropy(histograms[0].data_[:], self.alphabet_size_)
|
last_entropy[0] = bitsEntropy(histograms[0].data_[:], self.alphabet_size_)
|
||||||
last_entropy[1] = last_entropy[0]
|
last_entropy[1] = last_entropy[0]
|
||||||
self.num_blocks_++
|
self.num_blocks_++
|
||||||
split.num_types++
|
split.num_types++
|
||||||
|
@ -80,7 +80,7 @@ func BlockSplitterFinishBlockCommand(self *BlockSplitterCommand, is_final bool)
|
||||||
}
|
}
|
||||||
self.block_size_ = 0
|
self.block_size_ = 0
|
||||||
} else if self.block_size_ > 0 {
|
} else if self.block_size_ > 0 {
|
||||||
var entropy float64 = BitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
|
var entropy float64 = bitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
|
||||||
var combined_histo [2]HistogramCommand
|
var combined_histo [2]HistogramCommand
|
||||||
var combined_entropy [2]float64
|
var combined_entropy [2]float64
|
||||||
var diff [2]float64
|
var diff [2]float64
|
||||||
|
@ -89,7 +89,7 @@ func BlockSplitterFinishBlockCommand(self *BlockSplitterCommand, is_final bool)
|
||||||
var last_histogram_ix uint = self.last_histogram_ix_[j]
|
var last_histogram_ix uint = self.last_histogram_ix_[j]
|
||||||
combined_histo[j] = histograms[self.curr_histogram_ix_]
|
combined_histo[j] = histograms[self.curr_histogram_ix_]
|
||||||
HistogramAddHistogramCommand(&combined_histo[j], &histograms[last_histogram_ix])
|
HistogramAddHistogramCommand(&combined_histo[j], &histograms[last_histogram_ix])
|
||||||
combined_entropy[j] = BitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
|
combined_entropy[j] = bitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
|
||||||
diff[j] = combined_entropy[j] - entropy - last_entropy[j]
|
diff[j] = combined_entropy[j] - entropy - last_entropy[j]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ func BlockSplitterFinishBlockDistance(self *BlockSplitterDistance, is_final bool
|
||||||
split.lengths[0] = uint32(self.block_size_)
|
split.lengths[0] = uint32(self.block_size_)
|
||||||
|
|
||||||
split.types[0] = 0
|
split.types[0] = 0
|
||||||
last_entropy[0] = BitsEntropy(histograms[0].data_[:], self.alphabet_size_)
|
last_entropy[0] = bitsEntropy(histograms[0].data_[:], self.alphabet_size_)
|
||||||
last_entropy[1] = last_entropy[0]
|
last_entropy[1] = last_entropy[0]
|
||||||
self.num_blocks_++
|
self.num_blocks_++
|
||||||
split.num_types++
|
split.num_types++
|
||||||
|
@ -80,7 +80,7 @@ func BlockSplitterFinishBlockDistance(self *BlockSplitterDistance, is_final bool
|
||||||
}
|
}
|
||||||
self.block_size_ = 0
|
self.block_size_ = 0
|
||||||
} else if self.block_size_ > 0 {
|
} else if self.block_size_ > 0 {
|
||||||
var entropy float64 = BitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
|
var entropy float64 = bitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
|
||||||
var combined_histo [2]HistogramDistance
|
var combined_histo [2]HistogramDistance
|
||||||
var combined_entropy [2]float64
|
var combined_entropy [2]float64
|
||||||
var diff [2]float64
|
var diff [2]float64
|
||||||
|
@ -89,7 +89,7 @@ func BlockSplitterFinishBlockDistance(self *BlockSplitterDistance, is_final bool
|
||||||
var last_histogram_ix uint = self.last_histogram_ix_[j]
|
var last_histogram_ix uint = self.last_histogram_ix_[j]
|
||||||
combined_histo[j] = histograms[self.curr_histogram_ix_]
|
combined_histo[j] = histograms[self.curr_histogram_ix_]
|
||||||
HistogramAddHistogramDistance(&combined_histo[j], &histograms[last_histogram_ix])
|
HistogramAddHistogramDistance(&combined_histo[j], &histograms[last_histogram_ix])
|
||||||
combined_entropy[j] = BitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
|
combined_entropy[j] = bitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
|
||||||
diff[j] = combined_entropy[j] - entropy - last_entropy[j]
|
diff[j] = combined_entropy[j] - entropy - last_entropy[j]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ func BlockSplitterFinishBlockLiteral(self *BlockSplitterLiteral, is_final bool)
|
||||||
split.lengths[0] = uint32(self.block_size_)
|
split.lengths[0] = uint32(self.block_size_)
|
||||||
|
|
||||||
split.types[0] = 0
|
split.types[0] = 0
|
||||||
last_entropy[0] = BitsEntropy(histograms[0].data_[:], self.alphabet_size_)
|
last_entropy[0] = bitsEntropy(histograms[0].data_[:], self.alphabet_size_)
|
||||||
last_entropy[1] = last_entropy[0]
|
last_entropy[1] = last_entropy[0]
|
||||||
self.num_blocks_++
|
self.num_blocks_++
|
||||||
split.num_types++
|
split.num_types++
|
||||||
|
@ -80,7 +80,7 @@ func BlockSplitterFinishBlockLiteral(self *BlockSplitterLiteral, is_final bool)
|
||||||
}
|
}
|
||||||
self.block_size_ = 0
|
self.block_size_ = 0
|
||||||
} else if self.block_size_ > 0 {
|
} else if self.block_size_ > 0 {
|
||||||
var entropy float64 = BitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
|
var entropy float64 = bitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
|
||||||
var combined_histo [2]HistogramLiteral
|
var combined_histo [2]HistogramLiteral
|
||||||
var combined_entropy [2]float64
|
var combined_entropy [2]float64
|
||||||
var diff [2]float64
|
var diff [2]float64
|
||||||
|
@ -89,7 +89,7 @@ func BlockSplitterFinishBlockLiteral(self *BlockSplitterLiteral, is_final bool)
|
||||||
var last_histogram_ix uint = self.last_histogram_ix_[j]
|
var last_histogram_ix uint = self.last_histogram_ix_[j]
|
||||||
combined_histo[j] = histograms[self.curr_histogram_ix_]
|
combined_histo[j] = histograms[self.curr_histogram_ix_]
|
||||||
HistogramAddHistogramLiteral(&combined_histo[j], &histograms[last_histogram_ix])
|
HistogramAddHistogramLiteral(&combined_histo[j], &histograms[last_histogram_ix])
|
||||||
combined_entropy[j] = BitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
|
combined_entropy[j] = bitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
|
||||||
diff[j] = combined_entropy[j] - entropy - last_entropy[j]
|
diff[j] = combined_entropy[j] - entropy - last_entropy[j]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
state.go
4
state.go
|
@ -98,7 +98,7 @@ type Reader struct {
|
||||||
|
|
||||||
state int
|
state int
|
||||||
loop_counter int
|
loop_counter int
|
||||||
br BrotliBitReader
|
br bitReader
|
||||||
buffer struct {
|
buffer struct {
|
||||||
u64 uint64
|
u64 uint64
|
||||||
u8 [8]byte
|
u8 [8]byte
|
||||||
|
@ -186,7 +186,7 @@ type Reader struct {
|
||||||
func BrotliDecoderStateInit(s *Reader) bool {
|
func BrotliDecoderStateInit(s *Reader) bool {
|
||||||
s.error_code = 0 /* BROTLI_DECODER_NO_ERROR */
|
s.error_code = 0 /* BROTLI_DECODER_NO_ERROR */
|
||||||
|
|
||||||
BrotliInitBitReader(&s.br)
|
initBitReader(&s.br)
|
||||||
s.state = BROTLI_STATE_UNINITED
|
s.state = BROTLI_STATE_UNINITED
|
||||||
s.large_window = false
|
s.large_window = false
|
||||||
s.substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE
|
s.substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE
|
||||||
|
|
Loading…
Reference in New Issue