You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

decode29_lz.go 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package rardecode
  2. const (
  3. mainSize = 299
  4. offsetSize = 60
  5. lowOffsetSize = 17
  6. lengthSize = 28
  7. tableSize = mainSize + offsetSize + lowOffsetSize + lengthSize
  8. )
  9. var (
  10. lengthBase = [28]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20,
  11. 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224}
  12. lengthExtraBits = [28]uint{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2,
  13. 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5}
  14. offsetBase = [60]int{0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96,
  15. 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096,
  16. 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304,
  17. 131072, 196608, 262144, 327680, 393216, 458752, 524288,
  18. 589824, 655360, 720896, 786432, 851968, 917504, 983040,
  19. 1048576, 1310720, 1572864, 1835008, 2097152, 2359296, 2621440,
  20. 2883584, 3145728, 3407872, 3670016, 3932160}
  21. offsetExtraBits = [60]uint{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6,
  22. 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14,
  23. 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  24. 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}
  25. shortOffsetBase = [8]int{0, 4, 8, 16, 32, 64, 128, 192}
  26. shortOffsetExtraBits = [8]uint{2, 2, 3, 4, 5, 6, 6, 6}
  27. )
  28. type lz29Decoder struct {
  29. codeLength [tableSize]byte
  30. mainDecoder huffmanDecoder
  31. offsetDecoder huffmanDecoder
  32. lowOffsetDecoder huffmanDecoder
  33. lengthDecoder huffmanDecoder
  34. offset [4]int // history of previous offsets
  35. length int // previous length
  36. lowOffset int
  37. lowOffsetRepeats int
  38. br *rarBitReader
  39. }
  40. func (d *lz29Decoder) reset() {
  41. for i := range d.offset {
  42. d.offset[i] = 0
  43. }
  44. d.length = 0
  45. for i := range d.codeLength {
  46. d.codeLength[i] = 0
  47. }
  48. }
  49. func (d *lz29Decoder) init(br *rarBitReader) error {
  50. d.br = br
  51. d.lowOffset = 0
  52. d.lowOffsetRepeats = 0
  53. n, err := d.br.readBits(1)
  54. if err != nil {
  55. return err
  56. }
  57. addOld := n > 0
  58. cl := d.codeLength[:]
  59. if err = readCodeLengthTable(d.br, cl, addOld); err != nil {
  60. return err
  61. }
  62. d.mainDecoder.init(cl[:mainSize])
  63. cl = cl[mainSize:]
  64. d.offsetDecoder.init(cl[:offsetSize])
  65. cl = cl[offsetSize:]
  66. d.lowOffsetDecoder.init(cl[:lowOffsetSize])
  67. cl = cl[lowOffsetSize:]
  68. d.lengthDecoder.init(cl)
  69. return nil
  70. }
  71. func (d *lz29Decoder) readFilterData() (b []byte, err error) {
  72. flags, err := d.br.ReadByte()
  73. if err != nil {
  74. return nil, err
  75. }
  76. n := (int(flags) & 7) + 1
  77. switch n {
  78. case 7:
  79. n, err = d.br.readBits(8)
  80. n += 7
  81. if err != nil {
  82. return nil, err
  83. }
  84. case 8:
  85. n, err = d.br.readBits(16)
  86. if err != nil {
  87. return nil, err
  88. }
  89. }
  90. buf := make([]byte, n+1)
  91. buf[0] = flags
  92. err = d.br.readFull(buf[1:])
  93. return buf, err
  94. }
  95. func (d *lz29Decoder) readEndOfBlock() error {
  96. n, err := d.br.readBits(1)
  97. if err != nil {
  98. return err
  99. }
  100. if n > 0 {
  101. return endOfBlock
  102. }
  103. n, err = d.br.readBits(1)
  104. if err != nil {
  105. return err
  106. }
  107. if n > 0 {
  108. return endOfBlockAndFile
  109. }
  110. return endOfFile
  111. }
  112. func (d *lz29Decoder) decode(win *window) ([]byte, error) {
  113. sym, err := d.mainDecoder.readSym(d.br)
  114. if err != nil {
  115. return nil, err
  116. }
  117. switch {
  118. case sym < 256:
  119. // literal
  120. win.writeByte(byte(sym))
  121. return nil, nil
  122. case sym == 256:
  123. return nil, d.readEndOfBlock()
  124. case sym == 257:
  125. return d.readFilterData()
  126. case sym == 258:
  127. // use previous offset and length
  128. case sym < 263:
  129. i := sym - 259
  130. offset := d.offset[i]
  131. copy(d.offset[1:i+1], d.offset[:i])
  132. d.offset[0] = offset
  133. i, err := d.lengthDecoder.readSym(d.br)
  134. if err != nil {
  135. return nil, err
  136. }
  137. d.length = lengthBase[i] + 2
  138. bits := lengthExtraBits[i]
  139. if bits > 0 {
  140. n, err := d.br.readBits(bits)
  141. if err != nil {
  142. return nil, err
  143. }
  144. d.length += n
  145. }
  146. case sym < 271:
  147. i := sym - 263
  148. copy(d.offset[1:], d.offset[:])
  149. offset := shortOffsetBase[i] + 1
  150. bits := shortOffsetExtraBits[i]
  151. if bits > 0 {
  152. n, err := d.br.readBits(bits)
  153. if err != nil {
  154. return nil, err
  155. }
  156. offset += n
  157. }
  158. d.offset[0] = offset
  159. d.length = 2
  160. default:
  161. i := sym - 271
  162. d.length = lengthBase[i] + 3
  163. bits := lengthExtraBits[i]
  164. if bits > 0 {
  165. n, err := d.br.readBits(bits)
  166. if err != nil {
  167. return nil, err
  168. }
  169. d.length += n
  170. }
  171. i, err = d.offsetDecoder.readSym(d.br)
  172. if err != nil {
  173. return nil, err
  174. }
  175. offset := offsetBase[i] + 1
  176. bits = offsetExtraBits[i]
  177. switch {
  178. case bits >= 4:
  179. if bits > 4 {
  180. n, err := d.br.readBits(bits - 4)
  181. if err != nil {
  182. return nil, err
  183. }
  184. offset += n << 4
  185. }
  186. if d.lowOffsetRepeats > 0 {
  187. d.lowOffsetRepeats--
  188. offset += d.lowOffset
  189. } else {
  190. n, err := d.lowOffsetDecoder.readSym(d.br)
  191. if err != nil {
  192. return nil, err
  193. }
  194. if n == 16 {
  195. d.lowOffsetRepeats = 15
  196. offset += d.lowOffset
  197. } else {
  198. offset += n
  199. d.lowOffset = n
  200. }
  201. }
  202. case bits > 0:
  203. n, err := d.br.readBits(bits)
  204. if err != nil {
  205. return nil, err
  206. }
  207. offset += n
  208. }
  209. if offset >= 0x2000 {
  210. d.length++
  211. if offset >= 0x40000 {
  212. d.length++
  213. }
  214. }
  215. copy(d.offset[1:], d.offset[:])
  216. d.offset[0] = offset
  217. }
  218. win.copyBytes(d.length, d.offset[0])
  219. return nil, nil
  220. }