treecodecs.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2014-2022 Ulrich Kunitz. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package lzma
  5. // treeCodec encodes or decodes values with a fixed bit size. It is using a
  6. // tree of probability value. The root of the tree is the most-significant bit.
  7. type treeCodec struct {
  8. probTree
  9. }
  10. // makeTreeCodec makes a tree codec. The bits value must be inside the range
  11. // [1,32].
  12. func makeTreeCodec(bits int) treeCodec {
  13. return treeCodec{makeProbTree(bits)}
  14. }
  15. // deepcopy initializes tc as a deep copy of the source.
  16. func (tc *treeCodec) deepcopy(src *treeCodec) {
  17. tc.probTree.deepcopy(&src.probTree)
  18. }
  19. // Encode uses the range encoder to encode a fixed-bit-size value.
  20. func (tc *treeCodec) Encode(e *rangeEncoder, v uint32) (err error) {
  21. m := uint32(1)
  22. for i := int(tc.bits) - 1; i >= 0; i-- {
  23. b := (v >> uint(i)) & 1
  24. if err := e.EncodeBit(b, &tc.probs[m]); err != nil {
  25. return err
  26. }
  27. m = (m << 1) | b
  28. }
  29. return nil
  30. }
  31. // Decodes uses the range decoder to decode a fixed-bit-size value. Errors may
  32. // be caused by the range decoder.
  33. func (tc *treeCodec) Decode(d *rangeDecoder) (v uint32, err error) {
  34. m := uint32(1)
  35. for j := 0; j < int(tc.bits); j++ {
  36. b, err := d.DecodeBit(&tc.probs[m])
  37. if err != nil {
  38. return 0, err
  39. }
  40. m = (m << 1) | b
  41. }
  42. return m - (1 << uint(tc.bits)), nil
  43. }
  44. // treeReverseCodec is another tree codec, where the least-significant bit is
  45. // the start of the probability tree.
  46. type treeReverseCodec struct {
  47. probTree
  48. }
  49. // deepcopy initializes the treeReverseCodec as a deep copy of the
  50. // source.
  51. func (tc *treeReverseCodec) deepcopy(src *treeReverseCodec) {
  52. tc.probTree.deepcopy(&src.probTree)
  53. }
  54. // makeTreeReverseCodec creates treeReverseCodec value. The bits argument must
  55. // be in the range [1,32].
  56. func makeTreeReverseCodec(bits int) treeReverseCodec {
  57. return treeReverseCodec{makeProbTree(bits)}
  58. }
  59. // Encode uses range encoder to encode a fixed-bit-size value. The range
  60. // encoder may cause errors.
  61. func (tc *treeReverseCodec) Encode(v uint32, e *rangeEncoder) (err error) {
  62. m := uint32(1)
  63. for i := uint(0); i < uint(tc.bits); i++ {
  64. b := (v >> i) & 1
  65. if err := e.EncodeBit(b, &tc.probs[m]); err != nil {
  66. return err
  67. }
  68. m = (m << 1) | b
  69. }
  70. return nil
  71. }
  72. // Decodes uses the range decoder to decode a fixed-bit-size value. Errors
  73. // returned by the range decoder will be returned.
  74. func (tc *treeReverseCodec) Decode(d *rangeDecoder) (v uint32, err error) {
  75. m := uint32(1)
  76. for j := uint(0); j < uint(tc.bits); j++ {
  77. b, err := d.DecodeBit(&tc.probs[m])
  78. if err != nil {
  79. return 0, err
  80. }
  81. m = (m << 1) | b
  82. v |= b << j
  83. }
  84. return v, nil
  85. }
  86. // probTree stores enough probability values to be used by the treeEncode and
  87. // treeDecode methods of the range coder types.
  88. type probTree struct {
  89. probs []prob
  90. bits byte
  91. }
  92. // deepcopy initializes the probTree value as a deep copy of the source.
  93. func (t *probTree) deepcopy(src *probTree) {
  94. if t == src {
  95. return
  96. }
  97. t.probs = make([]prob, len(src.probs))
  98. copy(t.probs, src.probs)
  99. t.bits = src.bits
  100. }
  101. // makeProbTree initializes a probTree structure.
  102. func makeProbTree(bits int) probTree {
  103. if !(1 <= bits && bits <= 32) {
  104. panic("bits outside of range [1,32]")
  105. }
  106. t := probTree{
  107. bits: byte(bits),
  108. probs: make([]prob, 1<<uint(bits)),
  109. }
  110. for i := range t.probs {
  111. t.probs[i] = probInit
  112. }
  113. return t
  114. }
  115. // Bits provides the number of bits for the values to de- or encode.
  116. func (t *probTree) Bits() int {
  117. return int(t.bits)
  118. }