@@ -6,14 +6,39 @@ use std::{
66} ;
77
88use countio:: Counter ;
9- use liblzma:: { read:: XzDecoder , write:: XzEncoder } ;
9+ use liblzma:: {
10+ read:: XzDecoder ,
11+ stream:: { Check , Filters , LzmaOptions , MtStreamBuilder } ,
12+ write:: XzEncoder ,
13+ } ;
1014use log:: * ;
1115
1216use crate :: { util, Error , FileInfo } ;
1317
1418// level index, file index, total files, file name
1519pub type CompressionCallback = fn ( usize , usize , usize , String ) ;
1620
21+ fn get_lzma_encoder < W : Write > ( writer : & mut W , level : u32 ) -> Result < XzEncoder < & mut W > , Error > {
22+ let mut options = LzmaOptions :: new_preset ( level) ?;
23+ options
24+ . literal_context_bits ( 3 )
25+ . literal_position_bits ( 0 )
26+ . position_bits ( 2 )
27+ . dict_size ( 1 << 19 ) ;
28+
29+ let mut filters = Filters :: new ( ) ;
30+ filters. lzma2 ( & options) ;
31+
32+ let stream = MtStreamBuilder :: new ( )
33+ . preset ( level)
34+ . check ( Check :: Crc64 )
35+ . threads ( num_cpus:: get ( ) as u32 )
36+ . filters ( filters)
37+ . encoder ( )
38+ . unwrap ( ) ;
39+ Ok ( XzEncoder :: new_stream ( writer, stream) )
40+ }
41+
1742fn read_u32 < T : Read > ( reader : & mut T ) -> Result < u32 , Error > {
1843 let mut buf = [ 0 ; 4 ] ;
1944 reader. read_exact ( & mut buf) ?;
@@ -351,7 +376,7 @@ impl Level {
351376 level_idx : usize ,
352377 callback : Option < CompressionCallback > ,
353378 ) -> Result < usize , Error > {
354- let mut writer = Counter :: new ( XzEncoder :: new_parallel ( writer, compression) ) ;
379+ let mut writer = Counter :: new ( get_lzma_encoder ( writer, compression) ? ) ;
355380 let header = self . gen_header ( ) ;
356381 header. write ( & mut writer) ?;
357382
0 commit comments