nextBlock will synchronize and start compressing input in e.state.filling. If an error has occurred during encoding it will be returned.
(final bool)
| 283 | // nextBlock will synchronize and start compressing input in e.state.filling. |
| 284 | // If an error has occurred during encoding it will be returned. |
| 285 | func (e *Encoder) nextBlock(final bool) error { |
| 286 | s := &e.state |
| 287 | // Wait for current block. |
| 288 | s.wg.Wait() |
| 289 | if s.err != nil { |
| 290 | return s.err |
| 291 | } |
| 292 | if len(s.filling) > e.o.blockSize { |
| 293 | return fmt.Errorf("block > maxStoreBlockSize") |
| 294 | } |
| 295 | if !s.headerWritten { |
| 296 | // If we have a single block encode, do a sync compression. |
| 297 | if final && len(s.filling) == 0 && !e.o.fullZero { |
| 298 | s.headerWritten = true |
| 299 | s.fullFrameWritten = true |
| 300 | s.eofWritten = true |
| 301 | return nil |
| 302 | } |
| 303 | if final && len(s.filling) > 0 { |
| 304 | s.current = e.encodeAll(s.encoder, s.filling, s.current[:0]) |
| 305 | var n2 int |
| 306 | n2, s.err = s.w.Write(s.current) |
| 307 | if s.err != nil { |
| 308 | return s.err |
| 309 | } |
| 310 | s.nWritten += int64(n2) |
| 311 | s.nInput += int64(len(s.filling)) |
| 312 | s.current = s.current[:0] |
| 313 | s.filling = s.filling[:0] |
| 314 | s.headerWritten = true |
| 315 | s.fullFrameWritten = true |
| 316 | s.eofWritten = true |
| 317 | return nil |
| 318 | } |
| 319 | |
| 320 | var tmp [maxHeaderSize]byte |
| 321 | fh := frameHeader{ |
| 322 | ContentSize: uint64(s.frameContentSize), |
| 323 | WindowSize: uint32(s.encoder.WindowSize(s.frameContentSize)), |
| 324 | SingleSegment: false, |
| 325 | Checksum: e.o.crc, |
| 326 | DictID: e.o.dict.ID(), |
| 327 | } |
| 328 | |
| 329 | dst := fh.appendTo(tmp[:0]) |
| 330 | s.headerWritten = true |
| 331 | s.wWg.Wait() |
| 332 | var n2 int |
| 333 | n2, s.err = s.w.Write(dst) |
| 334 | if s.err != nil { |
| 335 | return s.err |
| 336 | } |
| 337 | s.nWritten += int64(n2) |
| 338 | } |
| 339 | if s.eofWritten { |
| 340 | // Ensure we only write it once. |
| 341 | final = false |
| 342 | } |