mirror of
https://github.com/schnaader/precomp-cpp
synced 2026-08-23 00:23:04 -04:00
LZMA executable filter parameter
WIP completed, LZMA filters can now be used
This commit is contained in:
parent
3895fbc17d
commit
79a785d928
3 changed files with 53 additions and 39 deletions
|
|
@ -52,8 +52,10 @@ lzma_filter get_filter(lzma_vli filter_id) {
|
|||
return result;
|
||||
}
|
||||
|
||||
bool init_encoder_mt(lzma_stream *strm, int threads, uint64_t max_memory, uint64_t &memory_usage, uint64_t &block_size)
|
||||
bool init_encoder_mt(lzma_stream *strm, int threads, uint64_t max_memory, uint64_t &memory_usage, uint64_t &block_size, bool* filter_enabled, bool filter_delta_enabled, int filter_delta_distance, int filter_count)
|
||||
{
|
||||
lzma_vli filter_to_lzma_vli[6] = { LZMA_FILTER_X86, LZMA_FILTER_POWERPC, LZMA_FILTER_IA64, LZMA_FILTER_ARM, LZMA_FILTER_ARMTHUMB, LZMA_FILTER_SPARC };
|
||||
|
||||
// The threaded encoder takes the options as pointer to
|
||||
// a lzma_mt structure.
|
||||
lzma_mt mt;
|
||||
|
|
@ -114,16 +116,36 @@ bool init_encoder_mt(lzma_stream *strm, int threads, uint64_t max_memory, uint64
|
|||
filterLzma2.id = LZMA_FILTER_LZMA2;
|
||||
filterLzma2.options = &opt_lzma2;
|
||||
|
||||
const lzma_filter filters[] = {
|
||||
get_filter(LZMA_FILTER_X86),
|
||||
get_filter(LZMA_FILTER_POWERPC),
|
||||
//get_filter(LZMA_FILTER_IA64),
|
||||
get_filter(LZMA_FILTER_ARM),
|
||||
//get_filter(LZMA_FILTER_ARMTHUMB),
|
||||
//get_filter(LZMA_FILTER_SPARC),
|
||||
filterLzma2,
|
||||
get_filter(LZMA_VLI_UNKNOWN)
|
||||
};
|
||||
lzma_filter filterDelta;
|
||||
lzma_options_delta delta_options;
|
||||
delta_options.type = LZMA_DELTA_TYPE_BYTE;
|
||||
delta_options.dist = filter_delta_distance;
|
||||
filterDelta.id = LZMA_FILTER_DELTA;
|
||||
filterDelta.options = &delta_options;
|
||||
|
||||
lzma_filter* filters;
|
||||
if (filter_count == 0) {
|
||||
filters = new lzma_filter[2] {
|
||||
filterLzma2,
|
||||
get_filter(LZMA_VLI_UNKNOWN)
|
||||
};
|
||||
} else {
|
||||
filters = new lzma_filter[filter_count + 2];
|
||||
int filter_idx = 0;
|
||||
if (filter_delta_enabled) {
|
||||
|
||||
filters[filter_idx] = filterDelta;
|
||||
filter_idx++;
|
||||
}
|
||||
for (int i = 0; i < 6; i++) {
|
||||
if (filter_enabled[i]) {
|
||||
filters[filter_idx] = get_filter(filter_to_lzma_vli[i]);
|
||||
filter_idx++;
|
||||
}
|
||||
}
|
||||
filters[filter_count] = filterLzma2;
|
||||
filters[filter_count + 1] = get_filter(LZMA_VLI_UNKNOWN);
|
||||
}
|
||||
|
||||
mt.filters = filters;
|
||||
|
||||
|
|
@ -133,5 +155,7 @@ bool init_encoder_mt(lzma_stream *strm, int threads, uint64_t max_memory, uint64
|
|||
// Determine memory usage and block size
|
||||
memory_usage = lzma_stream_encoder_mt_memusage(&mt, &block_size);
|
||||
|
||||
delete[] filters;
|
||||
|
||||
return check(ret);
|
||||
}
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
#include "api/lzma.h"
|
||||
|
||||
bool init_encoder_mt(lzma_stream *strm, int threads, uint64_t max_memory, uint64_t &memory_usage, uint64_t &block_size);
|
||||
bool init_encoder_mt(lzma_stream *strm, int threads, uint64_t max_memory, uint64_t &memory_usage, uint64_t &block_size, bool* filter_enabled, bool filter_delta_enabled, int filter_delta_distance, int filter_count);
|
||||
|
||||
bool init_decoder(lzma_stream *strm);
|
||||
|
||||
|
|
|
|||
44
precomp.cpp
44
precomp.cpp
|
|
@ -773,29 +773,24 @@ int init(int argc, char* argv[]) {
|
|||
case 'D':
|
||||
{
|
||||
argindex++;
|
||||
if ((argv[i][argindex]) == 0) {
|
||||
char nextchar = argv[i][argindex];
|
||||
if ((nextchar < '0') || (nextchar > '9')) {
|
||||
printf("ERROR: LZMA delta filter must be followed by a distance (1..256)\n");
|
||||
exit(1);
|
||||
}
|
||||
otf_xz_filter_delta_enabled = true;
|
||||
int multiplicator = 1;
|
||||
for (j = strlen(argv[i]) - (argindex + 1); j >= 0; j--) {
|
||||
if ((argv[i][j + argindex] < '0') || (argv[i][j + argindex] > '9')) {
|
||||
printf("ERROR: Only numbers allowed for LZMA delta filter distance\n");
|
||||
exit(1);
|
||||
}
|
||||
otf_xz_filter_delta_distance += ((unsigned int)(argv[i][j + argindex]) - '0') * multiplicator;
|
||||
if ((multiplicator * 10) < multiplicator) {
|
||||
exit(1);
|
||||
}
|
||||
multiplicator *= 10;
|
||||
while ((argv[i][argindex] > '0') && (argv[i][argindex] < '9')) {
|
||||
otf_xz_filter_delta_distance *= 10;
|
||||
otf_xz_filter_delta_distance += (argv[i][argindex] - '0');
|
||||
argindex++;
|
||||
}
|
||||
if ((otf_xz_filter_delta_distance < 1) || (otf_xz_filter_delta_distance > 256)) {
|
||||
printf("ERROR: LZMA delta filter distance must be in range 1..256\n");
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
argindex--;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("ERROR: Unknown LZMA filter type \"%c\"\n", argv[i][argindex]);
|
||||
exit(1);
|
||||
|
|
@ -1646,27 +1641,22 @@ int init_comfort(int argc, char* argv[]) {
|
|||
break;
|
||||
case 'D':
|
||||
j++;
|
||||
if ((argv[i][j]) == 0) {
|
||||
char nextchar = argv[i][j];
|
||||
if ((nextchar < '0') || (nextchar > '9')) {
|
||||
printf("ERROR: LZMA delta filter must be followed by a distance (1..256)\n");
|
||||
exit(1);
|
||||
}
|
||||
otf_xz_filter_delta_enabled = true;
|
||||
int multiplicator = 1;
|
||||
for (k = (strlen(value) - (j + 1); k >= 0; k--) {
|
||||
if ((argv[i][j + k] < '0') || (argv[i][j + k] > '9')) {
|
||||
printf("ERROR: Only numbers allowed for LZMA delta filter distance\n");
|
||||
exit(1);
|
||||
}
|
||||
otf_xz_filter_delta_distance += ((unsigned int)(argv[i][j + k]) - '0') * multiplicator;
|
||||
if (multiplicator * 10) < multiplicator) {
|
||||
exit(1);
|
||||
}
|
||||
multiplicator *= 10;
|
||||
while ((argv[i][j] > '0') && (argv[i][j] < '9')) {
|
||||
otf_xz_filter_delta_distance *= 10;
|
||||
otf_xz_filter_delta_distance += (argv[i][j] - '0');
|
||||
j++;
|
||||
}
|
||||
if ((otf_xz_filter_delta_distance < 1) || (otf_xz_filter_delta_distance > 256)) {
|
||||
printf("ERROR: LZMA delta filter distance must be in range 1..256\n);
|
||||
printf("ERROR: LZMA delta filter distance must be in range 1..256\n");
|
||||
exit(1);
|
||||
}
|
||||
j--;
|
||||
break;
|
||||
default:
|
||||
printf("ERROR: Unknown LZMA filter type \"%c\"\n", argv[i][j]);
|
||||
|
|
@ -9746,7 +9736,7 @@ void init_compress_otf() {
|
|||
threads = auto_detected_thread_count();
|
||||
}
|
||||
|
||||
if (!init_encoder_mt(&otf_xz_stream_c, threads, max_memory, memory_usage, block_size)) {
|
||||
if (!init_encoder_mt(&otf_xz_stream_c, threads, max_memory, memory_usage, block_size, otf_xz_filter_enabled, otf_xz_filter_delta_enabled, otf_xz_filter_delta_distance, otf_xz_filter_used_count)) {
|
||||
printf("ERROR: xz Multi-Threaded init failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue