diff --git a/Cargo.toml b/Cargo.toml index 46151bef..f2bd9a3f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "brotli" -version = "3.1.0" +version = "3.1.1" authors = ["Daniel Reiter Horn ", "The Brotli Authors"] description = "A brotli compressor and decompressor that with an interface avoiding the rust stdlib. This makes it suitable for embedded devices and kernels. It is designed with a pluggable allocator so that the standard lib's allocator may be employed. The default build also includes a stdlib allocator and stream interface. Disable this with --features=no-stdlib. All included code is safe." license = "BSD-3-Clause/MIT" diff --git a/c/Cargo.toml b/c/Cargo.toml index 3c6ec764..f96e2205 100644 --- a/c/Cargo.toml +++ b/c/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "brotli-ffi" -version = "1.1.0" +version = "1.1.1" authors = ["Daniel Reiter Horn ", "The Brotli Authors"] description = "A brotli compressor and decompressor that with an interface exactly matching https://github.com/google/brotli. All included code is safe except the thin exported C-compatible functions." license = "BSD-3-Clause/MIT" diff --git a/src/enc/encode.rs b/src/enc/encode.rs index 3bd995bd..43385113 100755 --- a/src/enc/encode.rs +++ b/src/enc/encode.rs @@ -676,319 +676,23 @@ fn InitCommandPrefixCodes(cmd_depths: &mut [u8], cmd_bits: &mut [u16], cmd_code: &mut [u8], cmd_code_numbits: &mut usize) { - static kDefaultCommandDepths: [u8; 128] = [0i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 5i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 8i32 as (u8), - 8i32 as (u8), - 8i32 as (u8), - 8i32 as (u8), - 8i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 0i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 7i32 as (u8), - 8i32 as (u8), - 8i32 as (u8), - 9i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 10i32 as (u8), - 5i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 4i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 5i32 as (u8), - 6i32 as (u8), - 6i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 7i32 as (u8), - 8i32 as (u8), - 10i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 12i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8), - 0i32 as (u8)]; - static kDefaultCommandBits: [u16; 128] = [0i32 as (u16), - 0i32 as (u16), - 8i32 as (u16), - 9i32 as (u16), - 3i32 as (u16), - 35i32 as (u16), - 7i32 as (u16), - 71i32 as (u16), - 39i32 as (u16), - 103i32 as (u16), - 23i32 as (u16), - 47i32 as (u16), - 175i32 as (u16), - 111i32 as (u16), - 239i32 as (u16), - 31i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 4i32 as (u16), - 12i32 as (u16), - 2i32 as (u16), - 10i32 as (u16), - 6i32 as (u16), - 13i32 as (u16), - 29i32 as (u16), - 11i32 as (u16), - 43i32 as (u16), - 27i32 as (u16), - 59i32 as (u16), - 87i32 as (u16), - 55i32 as (u16), - 15i32 as (u16), - 79i32 as (u16), - 319i32 as (u16), - 831i32 as (u16), - 191i32 as (u16), - 703i32 as (u16), - 447i32 as (u16), - 959i32 as (u16), - 0i32 as (u16), - 14i32 as (u16), - 1i32 as (u16), - 25i32 as (u16), - 5i32 as (u16), - 21i32 as (u16), - 19i32 as (u16), - 51i32 as (u16), - 119i32 as (u16), - 159i32 as (u16), - 95i32 as (u16), - 223i32 as (u16), - 479i32 as (u16), - 991i32 as (u16), - 63i32 as (u16), - 575i32 as (u16), - 127i32 as (u16), - 639i32 as (u16), - 383i32 as (u16), - 895i32 as (u16), - 255i32 as (u16), - 767i32 as (u16), - 511i32 as (u16), - 1023i32 as (u16), - 14i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 27i32 as (u16), - 59i32 as (u16), - 7i32 as (u16), - 39i32 as (u16), - 23i32 as (u16), - 55i32 as (u16), - 30i32 as (u16), - 1i32 as (u16), - 17i32 as (u16), - 9i32 as (u16), - 25i32 as (u16), - 5i32 as (u16), - 0i32 as (u16), - 8i32 as (u16), - 4i32 as (u16), - 12i32 as (u16), - 2i32 as (u16), - 10i32 as (u16), - 6i32 as (u16), - 21i32 as (u16), - 13i32 as (u16), - 29i32 as (u16), - 3i32 as (u16), - 19i32 as (u16), - 11i32 as (u16), - 15i32 as (u16), - 47i32 as (u16), - 31i32 as (u16), - 95i32 as (u16), - 63i32 as (u16), - 127i32 as (u16), - 255i32 as (u16), - 767i32 as (u16), - 2815i32 as (u16), - 1791i32 as (u16), - 3839i32 as (u16), - 511i32 as (u16), - 2559i32 as (u16), - 1535i32 as (u16), - 3583i32 as (u16), - 1023i32 as (u16), - 3071i32 as (u16), - 2047i32 as (u16), - 4095i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16), - 0i32 as (u16)]; - static kDefaultCommandCode: [u8; 57] = [0xffi32 as (u8), - 0x77i32 as (u8), - 0xd5i32 as (u8), - 0xbfi32 as (u8), - 0xe7i32 as (u8), - 0xdei32 as (u8), - 0xeai32 as (u8), - 0x9ei32 as (u8), - 0x51i32 as (u8), - 0x5di32 as (u8), - 0xdei32 as (u8), - 0xc6i32 as (u8), - 0x70i32 as (u8), - 0x57i32 as (u8), - 0xbci32 as (u8), - 0x58i32 as (u8), - 0x58i32 as (u8), - 0x58i32 as (u8), - 0xd8i32 as (u8), - 0xd8i32 as (u8), - 0x58i32 as (u8), - 0xd5i32 as (u8), - 0xcbi32 as (u8), - 0x8ci32 as (u8), - 0xeai32 as (u8), - 0xe0i32 as (u8), - 0xc3i32 as (u8), - 0x87i32 as (u8), - 0x1fi32 as (u8), - 0x83i32 as (u8), - 0xc1i32 as (u8), - 0x60i32 as (u8), - 0x1ci32 as (u8), - 0x67i32 as (u8), - 0xb2i32 as (u8), - 0xaai32 as (u8), - 0x6i32 as (u8), - 0x83i32 as (u8), - 0xc1i32 as (u8), - 0x60i32 as (u8), - 0x30i32 as (u8), - 0x18i32 as (u8), - 0xcci32 as (u8), - 0xa1i32 as (u8), - 0xcei32 as (u8), - 0x88i32 as (u8), - 0x54i32 as (u8), - 0x94i32 as (u8), - 0x46i32 as (u8), - 0xe1i32 as (u8), - 0xb0i32 as (u8), - 0xd0i32 as (u8), - 0x4ei32 as (u8), - 0xb2i32 as (u8), - 0xf7i32 as (u8), - 0x4i32 as (u8), - 0x0i32 as (u8)]; + static kDefaultCommandDepths: [u8; 128] = [ + 0,4,4,5,6,6,7,7,7,7,7,8,8,8,8,8,0,0,0,4,4,4,4,4,5,5,6,6,6,6,7,7,7,7, + 10,10,10,10,10,10,0,4,4,5,5,5,6,6,7,8,8,9,10,10,10,10,10,10,10,10,10,10,10,10, + 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,5,5,5,5,5,5,4,4,4,4,4,4,4,5,5,5,5,5,5, + 6,6,7,7,7,8,10,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0]; + static kDefaultCommandBits: [u16; 128] = [ + 0,0,8,9,3,35,7,71,39,103,23,47,175,111,239,31,0,0,0,4,12,2,10,6,13,29, + 11,43,27,59,87,55,15,79,319,831,191,703,447,959,0,14,1,25,5,21,19,51, + 119,159,95,223,479,991,63,575,127,639,383,895,255,767,511,1023,14, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,59,7,39,23,55,30,1,17,9,25,5,0,8,4,12, + 2,10,6,21,13,29,3,19,11,15,47,31,95,63,127,255,767,2815,1791,3839, + 511,2559,1535,3583,1023,3071,2047,4095,0,0,0,0]; + static kDefaultCommandCode: [u8; 57] = [ + 0xff,0x77,0xd5,0xbf,0xe7,0xde,0xea,0x9e,0x51,0x5d,0xde,0xc6,0x70,0x57, + 0xbc,0x58,0x58,0x58,0xd8,0xd8,0x58,0xd5,0xcb,0x8c,0xea,0xe0,0xc3,0x87, + 0x1f,0x83,0xc1,0x60,0x1c,0x67,0xb2,0xaa,0x6,0x83,0xc1,0x60,0x30,0x18, + 0xcc,0xa1,0xce,0x88,0x54,0x94,0x46,0xe1,0xb0,0xd0,0x4e,0xb2,0xf7,0x4,0x0]; static kDefaultCommandCodeNumBits: usize = 448usize; cmd_depths[..].clone_from_slice(&kDefaultCommandDepths[..]); cmd_bits[..].clone_from_slice(&kDefaultCommandBits[..]); @@ -1609,336 +1313,6 @@ fn ChooseContextMode(params: &BrotliEncoderParams, } -/* -fn BrotliCompressBufferQuality10(mut lgwin: i32, - mut input_size: usize, - mut input_buffer: &[u8], - mut encoded_size: &mut [usize], - mut encoded_buffer: &mut [u8]) - -> i32 { - let mut memory_manager: MemoryManager; - let mut m: *mut MemoryManager = &mut memory_manager; - let mask: usize = !(0usize) >> 1i32; - let max_backward_limit: usize = (1usize << lgwin).wrapping_sub(16usize); - let mut dist_cache: [i32; 4] = [4i32, 11i32, 15i32, 16i32]; - let saved_dist_cache: [i32; 4] = [4i32, 11i32, 15i32, 16i32]; - let mut ok: i32 = 1i32; - let max_out_size: usize = *encoded_size; - let mut total_out_size: usize = 0usize; - let mut last_byte: u8; - let mut last_byte_bits: u8; - let mut hasher: *mut u8 = 0i32; - let hasher_eff_size: usize = brotli_min_size_t(input_size, - max_backward_limit.wrapping_add(16usize)); - let mut params: BrotliEncoderParams; - let mut dictionary: *const BrotliDictionary = BrotliGetDictionary(); - let lgmetablock: i32 = brotli_min_int(24i32, lgwin + 1i32); - let mut max_block_size: usize; - let max_metablock_size: usize = 1usize << lgmetablock; - let max_literals_per_metablock: usize = max_metablock_size.wrapping_div(8usize); - let max_commands_per_metablock: usize = max_metablock_size.wrapping_div(8usize); - let mut metablock_start: usize = 0usize; - let mut prev_byte: u8 = 0i32 as (u8); - let mut prev_byte2: u8 = 0i32 as (u8); - BrotliEncoderInitParams(&mut params); - params.quality = 10i32; - params.lgwin = lgwin; - SanitizeParams(&mut params); - params.lgblock = ComputeLgBlock(&mut params); - max_block_size = 1usize << params.lgblock; - BrotliInitMemoryManager(m, - 0i32 as - (fn(*mut ::std::os::raw::c_void, usize) -> *mut ::std::os::raw::c_void), - 0i32 as (fn(*mut ::std::os::raw::c_void, *mut ::std::os::raw::c_void)), - 0i32); - 0i32; - EncodeWindowBits(lgwin, &mut last_byte, &mut last_byte_bits); - InitOrStitchToPreviousBlock(m, - &mut hasher, - input_buffer, - mask, - &mut params, - 0usize, - hasher_eff_size, - 1i32); - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - while ok != 0 && (metablock_start < input_size) { - let metablock_end: usize = brotli_min_size_t(input_size, - metablock_start.wrapping_add(max_metablock_size)); - let expected_num_commands: usize = - metablock_end.wrapping_sub(metablock_start).wrapping_div(12usize).wrapping_add(16usize); - let mut commands: *mut Command = 0i32; - let mut num_commands: usize = 0usize; - let mut last_insert_len: usize = 0usize; - let mut num_literals: usize = 0usize; - let mut metablock_size: usize = 0usize; - let mut cmd_alloc_size: usize = 0usize; - let mut is_last: i32; - let mut storage: *mut u8; - let mut storage_ix: usize; - let mut block_start: usize; - block_start = metablock_start; - while block_start < metablock_end { - let mut block_size: usize = brotli_min_size_t(metablock_end.wrapping_sub(block_start), - max_block_size); - let mut nodes: *mut ZopfliNode = if block_size.wrapping_add(1usize) != 0 { - BrotliAllocate(m, - block_size.wrapping_add(1usize) - .wrapping_mul(::std::mem::size_of::())) - } else { - 0i32 - }; - let mut path_size: usize; - let mut new_cmd_alloc_size: usize; - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - BrotliInitZopfliNodes(nodes, block_size.wrapping_add(1usize)); - StitchToPreviousBlockH10(hasher, block_size, block_start, input_buffer, mask); - path_size = BrotliZopfliComputeShortestPath(m, - dictionary, - block_size, - block_start, - input_buffer, - mask, - &mut params, - max_backward_limit, - dist_cache.as_mut_ptr(), - hasher, - nodes); - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - new_cmd_alloc_size = brotli_max_size_t(expected_num_commands, - num_commands.wrapping_add(path_size) - .wrapping_add(1usize)); - if cmd_alloc_size != new_cmd_alloc_size { - let mut new_commands: *mut Command = if new_cmd_alloc_size != 0 { - BrotliAllocate(m, - new_cmd_alloc_size.wrapping_mul(::std::mem::size_of::())) - } else { - 0i32 - }; - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - cmd_alloc_size = new_cmd_alloc_size; - if !commands.is_null() { - memcpy(new_commands, - commands, - ::std::mem::size_of::().wrapping_mul(num_commands)); - { - BrotliFree(m, commands); - commands = 0i32; - } - } - commands = new_commands; - } - BrotliZopfliCreateCommands(block_size, - block_start, - max_backward_limit, - &mut nodes[(0usize)], - dist_cache.as_mut_ptr(), - &mut last_insert_len, - &mut commands[(num_commands as (usize))], - &mut num_literals); - num_commands = num_commands.wrapping_add(path_size); - block_start = block_start.wrapping_add(block_size); - metablock_size = metablock_size.wrapping_add(block_size); - { - BrotliFree(m, nodes); - nodes = 0i32; - } - if num_literals > max_literals_per_metablock || num_commands > max_commands_per_metablock { - { - break; - } - } - } - if last_insert_len > 0usize { - InitInsertCommand(&mut commands[({ - let _old = num_commands; - num_commands = num_commands.wrapping_add(1 as (usize)); - _old - } as (usize))], - last_insert_len); - num_literals = num_literals.wrapping_add(last_insert_len); - } - is_last = if !!(metablock_start.wrapping_add(metablock_size) == input_size) { - 1i32 - } else { - 0i32 - }; - storage = 0i32; - storage_ix = last_byte_bits as (usize); - if metablock_size == 0usize { - storage = if 16i32 != 0 { - BrotliAllocate(m, (16usize).wrapping_mul(::std::mem::size_of::())) - } else { - 0i32 - }; - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - storage[(0usize)] = last_byte; - BrotliWriteBits(2usize, 3usize, &mut storage_ix, storage); - storage_ix = storage_ix.wrapping_add(7u32 as (usize)) & !7u32 as (usize); - } else if ShouldCompress(input_buffer, - mask, - metablock_start, - metablock_size, - num_literals, - num_commands) == 0 { - memcpy(dist_cache.as_mut_ptr(), - saved_dist_cache.as_mut_ptr(), - (4usize).wrapping_mul(::std::mem::size_of::())); - storage = if metablock_size.wrapping_add(16usize) != 0 { - BrotliAllocate(m, - metablock_size.wrapping_add(16usize) - .wrapping_mul(::std::mem::size_of::())) - } else { - 0i32 - }; - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - storage[(0usize)] = last_byte; - BrotliStoreUncompressedMetaBlock(is_last, - input_buffer, - metablock_start, - mask, - metablock_size, - &mut storage_ix, - storage, - false); - } else { - let mut num_direct_distance_codes: u32 = 0u32; - let mut distance_postfix_bits: u32 = 0u32; - let mut literal_context_mode: ContextType = ContextType::CONTEXT_UTF8; - let mut mb: MetaBlockSplit; - InitMetaBlockSplit(&mut mb); - if BrotliIsMostlyUTF8(input_buffer, - metablock_start, - mask, - metablock_size, - kMinUTF8Ratio) == 0 { - literal_context_mode = ContextType::CONTEXT_SIGNED; - } - BrotliBuildMetaBlock(m, - input_buffer, - metablock_start, - mask, - &mut params, - prev_byte, - prev_byte2, - commands, - num_commands, - literal_context_mode, - lit_scratch_space, - cmd_scratch_space, - dst_scratch_space, - &mut mb); - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - BrotliOptimizeHistograms(num_direct_distance_codes as (usize), - distance_postfix_bits as (usize), - &mut mb); - storage = if (2usize).wrapping_mul(metablock_size).wrapping_add(502usize) != 0 { - BrotliAllocate(m, - (2usize) - .wrapping_mul(metablock_size) - .wrapping_add(502usize) - .wrapping_mul(::std::mem::size_of::())) - } else { - 0i32 - }; - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - storage[(0usize)] = last_byte; - BrotliStoreMetaBlock(m, - input_buffer, - metablock_start, - metablock_size, - mask, - prev_byte, - prev_byte2, - is_last, - num_direct_distance_codes, - distance_postfix_bits, - literal_context_mode, - commands, - num_commands, - &mut mb, - &mut storage_ix, - storage); - if !(0i32 == 0) { - BrotliWipeOutMemoryManager(m); - return 0i32; - } - if metablock_size.wrapping_add(4usize) < storage_ix >> 3i32 { - memcpy(dist_cache.as_mut_ptr(), - saved_dist_cache.as_mut_ptr(), - (4usize).wrapping_mul(::std::mem::size_of::())); - storage[(0usize)] = last_byte; - storage_ix = last_byte_bits as (usize); - BrotliStoreUncompressedMetaBlock(is_last, - input_buffer, - metablock_start, - mask, - metablock_size, - &mut storage_ix, - storage, - true); - } - DestroyMetaBlockSplit(m, &mut mb); - } - last_byte = storage[((storage_ix >> 3i32) as (usize))]; - last_byte_bits = (storage_ix & 7u32 as (usize)) as (u8); - metablock_start = metablock_start.wrapping_add(metablock_size); - prev_byte = input_buffer[(metablock_start.wrapping_sub(1usize) as (usize))]; - prev_byte2 = input_buffer[(metablock_start.wrapping_sub(2usize) as (usize))]; - memcpy(saved_dist_cache.as_mut_ptr(), - dist_cache.as_mut_ptr(), - (4usize).wrapping_mul(::std::mem::size_of::())); - { - let out_size: usize = storage_ix >> 3i32; - total_out_size = total_out_size.wrapping_add(out_size as u64); - if total_out_size <= max_out_size as u64 { - memcpy(encoded_buffer, storage, out_size); - encoded_buffer = encoded_buffer[(out_size as (usize))..]; - } else { - ok = 0i32; - } - } - { - BrotliFree(m, storage); - storage = 0i32; - } - { - BrotliFree(m, commands); - commands = 0i32; - } - } - *encoded_size = total_out_size; - DestroyHasher(m, &mut hasher); - return ok; - BrotliWipeOutMemoryManager(m); - 0i32 -} -*/ - #[derive(PartialEq, Eq, Copy, Clone)] pub enum BrotliEncoderOperation { BROTLI_OPERATION_PROCESS = 0, @@ -2046,19 +1420,8 @@ pub fn BrotliEncoderCompress max_out_size) { - // is_fallback = 1i32; - //} else { - // return 1i32; - //} + if quality == 10i32 { + panic!("Unimplemented: need to set 9.5 here"); } if is_fallback == 0 { @@ -3085,7 +2448,6 @@ fn EncodeData> 3i32; 1i32