MaxEncodedSize returns the expected maximum size of an encoded block or stream.
(size int)
| 841 | // MaxEncodedSize returns the expected maximum |
| 842 | // size of an encoded block or stream. |
| 843 | func (e *Encoder) MaxEncodedSize(size int) int { |
| 844 | frameHeader := 4 + 2 // magic + frame header & window descriptor |
| 845 | if e.o.dict != nil { |
| 846 | frameHeader += 4 |
| 847 | } |
| 848 | // Frame content size: |
| 849 | if size < 256 { |
| 850 | frameHeader++ |
| 851 | } else if size < 65536+256 { |
| 852 | frameHeader += 2 |
| 853 | } else if size < math.MaxInt32 { |
| 854 | frameHeader += 4 |
| 855 | } else { |
| 856 | frameHeader += 8 |
| 857 | } |
| 858 | // Final crc |
| 859 | if e.o.crc { |
| 860 | frameHeader += 4 |
| 861 | } |
| 862 | |
| 863 | // Max overhead is 3 bytes/block. |
| 864 | // There cannot be 0 blocks. |
| 865 | blocks := (size + e.o.blockSize) / e.o.blockSize |
| 866 | |
| 867 | // Combine, add padding. |
| 868 | maxSz := frameHeader + 3*blocks + size |
| 869 | if e.o.pad > 1 { |
| 870 | maxSz += calcSkippableFrame(int64(maxSz), int64(e.o.pad)) |
| 871 | } |
| 872 | return maxSz |
| 873 | } |