1 // SPDX-License-Identifier: 0BSD 2 3 /////////////////////////////////////////////////////////////////////////////// 4 // 5 /// \file lzma_encoder.c 6 /// \brief LZMA encoder 7 /// 8 // Authors: Igor Pavlov 9 // Lasse Collin 10 // 11 /////////////////////////////////////////////////////////////////////////////// 12 13 #include "lzma2_encoder.h" 14 #include "lzma_encoder_private.h" 15 #include "fastpos.h" 16 17 18 ///////////// 19 // Literal // 20 ///////////// 21 22 static inline void 23 literal_matched(lzma_range_encoder *rc, probability *subcoder, 24 uint32_t match_byte, uint32_t symbol) 25 { 26 uint32_t offset = 0x100; 27 symbol += UINT32_C(1) << 8; 28 29 do { 30 match_byte <<= 1; 31 const uint32_t match_bit = match_byte & offset; 32 const uint32_t subcoder_index 33 = offset + match_bit + (symbol >> 8); 34 const uint32_t bit = (symbol >> 7) & 1; 35 rc_bit(rc, &subcoder[subcoder_index], bit); 36 37 symbol <<= 1; 38 offset &= ~(match_byte ^ symbol); 39 40 } while (symbol < (UINT32_C(1) << 16)); 41 } 42 43 44 static inline void 45 literal(lzma_lzma1_encoder *coder, lzma_mf *mf, uint32_t position) 46 { 47 // Locate the literal byte to be encoded and the subcoder. 48 const uint8_t cur_byte = mf->buffer[ 49 mf->read_pos - mf->read_ahead]; 50 probability *subcoder = literal_subcoder(coder->literal, 51 coder->literal_context_bits, coder->literal_mask, 52 position, mf->buffer[mf->read_pos - mf->read_ahead - 1]); 53 54 if (is_literal_state(coder->state)) { 55 // Previous LZMA-symbol was a literal. Encode a normal 56 // literal without a match byte. 57 update_literal_normal(coder->state); 58 rc_bittree(&coder->rc, subcoder, 8, cur_byte); 59 } else { 60 // Previous LZMA-symbol was a match. Use the last byte of 61 // the match as a "match byte". That is, compare the bits 62 // of the current literal and the match byte. 63 update_literal_matched(coder->state); 64 const uint8_t match_byte = mf->buffer[ 65 mf->read_pos - coder->reps[0] - 1 66 - mf->read_ahead]; 67 literal_matched(&coder->rc, subcoder, match_byte, cur_byte); 68 } 69 } 70 71 72 ////////////////// 73 // Match length // 74 ////////////////// 75 76 static void 77 length_update_prices(lzma_length_encoder *lc, const uint32_t pos_state) 78 { 79 const uint32_t table_size = lc->table_size; 80 lc->counters[pos_state] = table_size; 81 82 const uint32_t a0 = rc_bit_0_price(lc->choice); 83 const uint32_t a1 = rc_bit_1_price(lc->choice); 84 const uint32_t b0 = a1 + rc_bit_0_price(lc->choice2); 85 const uint32_t b1 = a1 + rc_bit_1_price(lc->choice2); 86 uint32_t *const prices = lc->prices[pos_state]; 87 88 uint32_t i; 89 for (i = 0; i < table_size && i < LEN_LOW_SYMBOLS; ++i) 90 prices[i] = a0 + rc_bittree_price(lc->low[pos_state], 91 LEN_LOW_BITS, i); 92 93 for (; i < table_size && i < LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS; ++i) 94 prices[i] = b0 + rc_bittree_price(lc->mid[pos_state], 95 LEN_MID_BITS, i - LEN_LOW_SYMBOLS); 96 97 for (; i < table_size; ++i) 98 prices[i] = b1 + rc_bittree_price(lc->high, LEN_HIGH_BITS, 99 i - LEN_LOW_SYMBOLS - LEN_MID_SYMBOLS); 100 101 return; 102 } 103 104 105 static inline void 106 length(lzma_range_encoder *rc, lzma_length_encoder *lc, 107 const uint32_t pos_state, uint32_t len, const bool fast_mode) 108 { 109 assert(len <= MATCH_LEN_MAX); 110 len -= MATCH_LEN_MIN; 111 112 if (len < LEN_LOW_SYMBOLS) { 113 rc_bit(rc, &lc->choice, 0); 114 rc_bittree(rc, lc->low[pos_state], LEN_LOW_BITS, len); 115 } else { 116 rc_bit(rc, &lc->choice, 1); 117 len -= LEN_LOW_SYMBOLS; 118 119 if (len < LEN_MID_SYMBOLS) { 120 rc_bit(rc, &lc->choice2, 0); 121 rc_bittree(rc, lc->mid[pos_state], LEN_MID_BITS, len); 122 } else { 123 rc_bit(rc, &lc->choice2, 1); 124 len -= LEN_MID_SYMBOLS; 125 rc_bittree(rc, lc->high, LEN_HIGH_BITS, len); 126 } 127 } 128 129 // Only getoptimum uses the prices so don't update the table when 130 // in fast mode. 131 if (!fast_mode) 132 if (--lc->counters[pos_state] == 0) 133 length_update_prices(lc, pos_state); 134 } 135 136 137 /////////// 138 // Match // 139 /////////// 140 141 static inline void 142 match(lzma_lzma1_encoder *coder, const uint32_t pos_state, 143 const uint32_t distance, const uint32_t len) 144 { 145 update_match(coder->state); 146 147 length(&coder->rc, &coder->match_len_encoder, pos_state, len, 148 coder->fast_mode); 149 150 const uint32_t dist_slot = get_dist_slot(distance); 151 const uint32_t dist_state = get_dist_state(len); 152 rc_bittree(&coder->rc, coder->dist_slot[dist_state], 153 DIST_SLOT_BITS, dist_slot); 154 155 if (dist_slot >= DIST_MODEL_START) { 156 const uint32_t footer_bits = (dist_slot >> 1) - 1; 157 const uint32_t base = (2 | (dist_slot & 1)) << footer_bits; 158 const uint32_t dist_reduced = distance - base; 159 160 if (dist_slot < DIST_MODEL_END) { 161 // Careful here: base - dist_slot - 1 can be -1, but 162 // rc_bittree_reverse starts at probs[1], not probs[0]. 163 rc_bittree_reverse(&coder->rc, 164 coder->dist_special + base - dist_slot - 1, 165 footer_bits, dist_reduced); 166 } else { 167 rc_direct(&coder->rc, dist_reduced >> ALIGN_BITS, 168 footer_bits - ALIGN_BITS); 169 rc_bittree_reverse( 170 &coder->rc, coder->dist_align, 171 ALIGN_BITS, dist_reduced & ALIGN_MASK); 172 ++coder->align_price_count; 173 } 174 } 175 176 coder->reps[3] = coder->reps[2]; 177 coder->reps[2] = coder->reps[1]; 178 coder->reps[1] = coder->reps[0]; 179 coder->reps[0] = distance; 180 ++coder->match_price_count; 181 } 182 183 184 //////////////////// 185 // Repeated match // 186 //////////////////// 187 188 static inline void 189 rep_match(lzma_lzma1_encoder *coder, const uint32_t pos_state, 190 const uint32_t rep, const uint32_t len) 191 { 192 if (rep == 0) { 193 rc_bit(&coder->rc, &coder->is_rep0[coder->state], 0); 194 rc_bit(&coder->rc, 195 &coder->is_rep0_long[coder->state][pos_state], 196 len != 1); 197 } else { 198 const uint32_t distance = coder->reps[rep]; 199 rc_bit(&coder->rc, &coder->is_rep0[coder->state], 1); 200 201 if (rep == 1) { 202 rc_bit(&coder->rc, &coder->is_rep1[coder->state], 0); 203 } else { 204 rc_bit(&coder->rc, &coder->is_rep1[coder->state], 1); 205 rc_bit(&coder->rc, &coder->is_rep2[coder->state], 206 rep - 2); 207 208 if (rep == 3) 209 coder->reps[3] = coder->reps[2]; 210 211 coder->reps[2] = coder->reps[1]; 212 } 213 214 coder->reps[1] = coder->reps[0]; 215 coder->reps[0] = distance; 216 } 217 218 if (len == 1) { 219 update_short_rep(coder->state); 220 } else { 221 length(&coder->rc, &coder->rep_len_encoder, pos_state, len, 222 coder->fast_mode); 223 update_long_rep(coder->state); 224 } 225 } 226 227 228 ////////// 229 // Main // 230 ////////// 231 232 static void 233 encode_symbol(lzma_lzma1_encoder *coder, lzma_mf *mf, 234 uint32_t back, uint32_t len, uint32_t position) 235 { 236 const uint32_t pos_state = position & coder->pos_mask; 237 238 if (back == UINT32_MAX) { 239 // Literal i.e. eight-bit byte 240 assert(len == 1); 241 rc_bit(&coder->rc, 242 &coder->is_match[coder->state][pos_state], 0); 243 literal(coder, mf, position); 244 } else { 245 // Some type of match 246 rc_bit(&coder->rc, 247 &coder->is_match[coder->state][pos_state], 1); 248 249 if (back < REPS) { 250 // It's a repeated match i.e. the same distance 251 // has been used earlier. 252 rc_bit(&coder->rc, &coder->is_rep[coder->state], 1); 253 rep_match(coder, pos_state, back, len); 254 } else { 255 // Normal match 256 rc_bit(&coder->rc, &coder->is_rep[coder->state], 0); 257 match(coder, pos_state, back - REPS, len); 258 } 259 } 260 261 assert(mf->read_ahead >= len); 262 mf->read_ahead -= len; 263 } 264 265 266 static bool 267 encode_init(lzma_lzma1_encoder *coder, lzma_mf *mf) 268 { 269 assert(mf_position(mf) == 0); 270 assert(coder->uncomp_size == 0); 271 272 if (mf->read_pos == mf->read_limit) { 273 if (mf->action == LZMA_RUN) 274 return false; // We cannot do anything. 275 276 // We are finishing (we cannot get here when flushing). 277 assert(mf->write_pos == mf->read_pos); 278 assert(mf->action == LZMA_FINISH); 279 } else { 280 // Do the actual initialization. The first LZMA symbol must 281 // always be a literal. 282 mf_skip(mf, 1); 283 mf->read_ahead = 0; 284 rc_bit(&coder->rc, &coder->is_match[0][0], 0); 285 rc_bittree(&coder->rc, coder->literal + 0, 8, mf->buffer[0]); 286 ++coder->uncomp_size; 287 } 288 289 // Initialization is done (except if empty file). 290 coder->is_initialized = true; 291 292 return true; 293 } 294 295 296 static void 297 encode_eopm(lzma_lzma1_encoder *coder, uint32_t position) 298 { 299 const uint32_t pos_state = position & coder->pos_mask; 300 rc_bit(&coder->rc, &coder->is_match[coder->state][pos_state], 1); 301 rc_bit(&coder->rc, &coder->is_rep[coder->state], 0); 302 match(coder, pos_state, UINT32_MAX, MATCH_LEN_MIN); 303 } 304 305 306 /// Number of bytes that a single encoding loop in lzma_lzma_encode() can 307 /// consume from the dictionary. This limit comes from lzma_lzma_optimum() 308 /// and may need to be updated if that function is significantly modified. 309 #define LOOP_INPUT_MAX (OPTS + 1) 310 311 312 extern lzma_ret 313 lzma_lzma_encode(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf, 314 uint8_t *restrict out, size_t *restrict out_pos, 315 size_t out_size, uint32_t limit) 316 { 317 // Initialize the stream if no data has been encoded yet. 318 if (!coder->is_initialized && !encode_init(coder, mf)) 319 return LZMA_OK; 320 321 // Encode pending output bytes from the range encoder. 322 // At the start of the stream, encode_init() encodes one literal. 323 // Later there can be pending output only with LZMA1 because LZMA2 324 // ensures that there is always enough output space. Thus when using 325 // LZMA2, rc_encode() calls in this function will always return false. 326 if (rc_encode(&coder->rc, out, out_pos, out_size)) { 327 // We don't get here with LZMA2. 328 assert(limit == UINT32_MAX); 329 return LZMA_OK; 330 } 331 332 // If the range encoder was flushed in an earlier call to this 333 // function but there wasn't enough output buffer space, those 334 // bytes would have now been encoded by the above rc_encode() call 335 // and the stream has now been finished. This can only happen with 336 // LZMA1 as LZMA2 always provides enough output buffer space. 337 if (coder->is_flushed) { 338 assert(limit == UINT32_MAX); 339 return LZMA_STREAM_END; 340 } 341 342 while (true) { 343 // With LZMA2 we need to take care that compressed size of 344 // a chunk doesn't get too big. 345 // FIXME? Check if this could be improved. 346 if (limit != UINT32_MAX 347 && (mf->read_pos - mf->read_ahead >= limit 348 || *out_pos + rc_pending(&coder->rc) 349 >= LZMA2_CHUNK_MAX 350 - LOOP_INPUT_MAX)) 351 break; 352 353 // Check that there is some input to process. 354 if (mf->read_pos >= mf->read_limit) { 355 if (mf->action == LZMA_RUN) 356 return LZMA_OK; 357 358 if (mf->read_ahead == 0) 359 break; 360 } 361 362 // Get optimal match (repeat position and length). 363 // Value ranges for pos: 364 // - [0, REPS): repeated match 365 // - [REPS, UINT32_MAX): 366 // match at (pos - REPS) 367 // - UINT32_MAX: not a match but a literal 368 // Value ranges for len: 369 // - [MATCH_LEN_MIN, MATCH_LEN_MAX] 370 uint32_t len; 371 uint32_t back; 372 373 if (coder->fast_mode) 374 lzma_lzma_optimum_fast(coder, mf, &back, &len); 375 else 376 lzma_lzma_optimum_normal(coder, mf, &back, &len, 377 (uint32_t)(coder->uncomp_size)); 378 379 encode_symbol(coder, mf, back, len, 380 (uint32_t)(coder->uncomp_size)); 381 382 // If output size limiting is active (out_limit != 0), check 383 // if encoding this LZMA symbol would make the output size 384 // exceed the specified limit. 385 if (coder->out_limit != 0 && rc_encode_dummy( 386 &coder->rc, coder->out_limit)) { 387 // The most recent LZMA symbol would make the output 388 // too big. Throw it away. 389 rc_forget(&coder->rc); 390 391 // FIXME: Tell the LZ layer to not read more input as 392 // it would be waste of time. This doesn't matter if 393 // output-size-limited encoding is done with a single 394 // call though. 395 396 break; 397 } 398 399 // This symbol will be encoded so update the uncompressed size. 400 coder->uncomp_size += len; 401 402 // Encode the LZMA symbol. 403 if (rc_encode(&coder->rc, out, out_pos, out_size)) { 404 // Once again, this can only happen with LZMA1. 405 assert(limit == UINT32_MAX); 406 return LZMA_OK; 407 } 408 } 409 410 // Make the uncompressed size available to the application. 411 if (coder->uncomp_size_ptr != NULL) 412 *coder->uncomp_size_ptr = coder->uncomp_size; 413 414 // LZMA2 doesn't use EOPM at LZMA level. 415 // 416 // Plain LZMA streams without EOPM aren't supported except when 417 // output size limiting is enabled. 418 if (coder->use_eopm) 419 encode_eopm(coder, (uint32_t)(coder->uncomp_size)); 420 421 // Flush the remaining bytes from the range encoder. 422 rc_flush(&coder->rc); 423 424 // Copy the remaining bytes to the output buffer. If there 425 // isn't enough output space, we will copy out the remaining 426 // bytes on the next call to this function. 427 if (rc_encode(&coder->rc, out, out_pos, out_size)) { 428 // This cannot happen with LZMA2. 429 assert(limit == UINT32_MAX); 430 431 coder->is_flushed = true; 432 return LZMA_OK; 433 } 434 435 return LZMA_STREAM_END; 436 } 437 438 439 static lzma_ret 440 lzma_encode(void *coder, lzma_mf *restrict mf, 441 uint8_t *restrict out, size_t *restrict out_pos, 442 size_t out_size) 443 { 444 // Plain LZMA has no support for sync-flushing. 445 if (unlikely(mf->action == LZMA_SYNC_FLUSH)) 446 return LZMA_OPTIONS_ERROR; 447 448 return lzma_lzma_encode(coder, mf, out, out_pos, out_size, UINT32_MAX); 449 } 450 451 452 static lzma_ret 453 lzma_lzma_set_out_limit( 454 void *coder_ptr, uint64_t *uncomp_size, uint64_t out_limit) 455 { 456 // Minimum output size is 5 bytes but that cannot hold any output 457 // so we use 6 bytes. 458 if (out_limit < 6) 459 return LZMA_BUF_ERROR; 460 461 lzma_lzma1_encoder *coder = coder_ptr; 462 coder->out_limit = out_limit; 463 coder->uncomp_size_ptr = uncomp_size; 464 coder->use_eopm = false; 465 return LZMA_OK; 466 } 467 468 469 //////////////////// 470 // Initialization // 471 //////////////////// 472 473 static bool 474 is_options_valid(const lzma_options_lzma *options) 475 { 476 // Validate some of the options. LZ encoder validates nice_len too 477 // but we need a valid value here earlier. 478 return is_lclppb_valid(options) 479 && options->nice_len >= MATCH_LEN_MIN 480 && options->nice_len <= MATCH_LEN_MAX 481 && (options->mode == LZMA_MODE_FAST 482 || options->mode == LZMA_MODE_NORMAL); 483 } 484 485 486 static void 487 set_lz_options(lzma_lz_options *lz_options, const lzma_options_lzma *options) 488 { 489 // LZ encoder initialization does the validation for these so we 490 // don't need to validate here. 491 lz_options->before_size = OPTS; 492 lz_options->dict_size = options->dict_size; 493 lz_options->after_size = LOOP_INPUT_MAX; 494 lz_options->match_len_max = MATCH_LEN_MAX; 495 lz_options->nice_len = my_max(mf_get_hash_bytes(options->mf), 496 options->nice_len); 497 lz_options->match_finder = options->mf; 498 lz_options->depth = options->depth; 499 lz_options->preset_dict = options->preset_dict; 500 lz_options->preset_dict_size = options->preset_dict_size; 501 return; 502 } 503 504 505 static void 506 length_encoder_reset(lzma_length_encoder *lencoder, 507 const uint32_t num_pos_states, const bool fast_mode) 508 { 509 bit_reset(lencoder->choice); 510 bit_reset(lencoder->choice2); 511 512 for (size_t pos_state = 0; pos_state < num_pos_states; ++pos_state) { 513 bittree_reset(lencoder->low[pos_state], LEN_LOW_BITS); 514 bittree_reset(lencoder->mid[pos_state], LEN_MID_BITS); 515 } 516 517 bittree_reset(lencoder->high, LEN_HIGH_BITS); 518 519 if (!fast_mode) 520 for (uint32_t pos_state = 0; pos_state < num_pos_states; 521 ++pos_state) 522 length_update_prices(lencoder, pos_state); 523 524 return; 525 } 526 527 528 extern lzma_ret 529 lzma_lzma_encoder_reset(lzma_lzma1_encoder *coder, 530 const lzma_options_lzma *options) 531 { 532 if (!is_options_valid(options)) 533 return LZMA_OPTIONS_ERROR; 534 535 coder->pos_mask = (1U << options->pb) - 1; 536 coder->literal_context_bits = options->lc; 537 coder->literal_mask = literal_mask_calc(options->lc, options->lp); 538 539 // Range coder 540 rc_reset(&coder->rc); 541 542 // State 543 coder->state = STATE_LIT_LIT; 544 for (size_t i = 0; i < REPS; ++i) 545 coder->reps[i] = 0; 546 547 literal_init(coder->literal, options->lc, options->lp); 548 549 // Bit encoders 550 for (size_t i = 0; i < STATES; ++i) { 551 for (size_t j = 0; j <= coder->pos_mask; ++j) { 552 bit_reset(coder->is_match[i][j]); 553 bit_reset(coder->is_rep0_long[i][j]); 554 } 555 556 bit_reset(coder->is_rep[i]); 557 bit_reset(coder->is_rep0[i]); 558 bit_reset(coder->is_rep1[i]); 559 bit_reset(coder->is_rep2[i]); 560 } 561 562 for (size_t i = 0; i < FULL_DISTANCES - DIST_MODEL_END; ++i) 563 bit_reset(coder->dist_special[i]); 564 565 // Bit tree encoders 566 for (size_t i = 0; i < DIST_STATES; ++i) 567 bittree_reset(coder->dist_slot[i], DIST_SLOT_BITS); 568 569 bittree_reset(coder->dist_align, ALIGN_BITS); 570 571 // Length encoders 572 length_encoder_reset(&coder->match_len_encoder, 573 1U << options->pb, coder->fast_mode); 574 575 length_encoder_reset(&coder->rep_len_encoder, 576 1U << options->pb, coder->fast_mode); 577 578 // Price counts are incremented every time appropriate probabilities 579 // are changed. price counts are set to zero when the price tables 580 // are updated, which is done when the appropriate price counts have 581 // big enough value, and lzma_mf.read_ahead == 0 which happens at 582 // least every OPTS (a few thousand) possible price count increments. 583 // 584 // By resetting price counts to UINT32_MAX / 2, we make sure that the 585 // price tables will be initialized before they will be used (since 586 // the value is definitely big enough), and that it is OK to increment 587 // price counts without risk of integer overflow (since UINT32_MAX / 2 588 // is small enough). The current code doesn't increment price counts 589 // before initializing price tables, but it maybe done in future if 590 // we add support for saving the state between LZMA2 chunks. 591 coder->match_price_count = UINT32_MAX / 2; 592 coder->align_price_count = UINT32_MAX / 2; 593 594 coder->opts_end_index = 0; 595 coder->opts_current_index = 0; 596 597 return LZMA_OK; 598 } 599 600 601 extern lzma_ret 602 lzma_lzma_encoder_create(void **coder_ptr, const lzma_allocator *allocator, 603 lzma_vli id, const lzma_options_lzma *options, 604 lzma_lz_options *lz_options) 605 { 606 assert(id == LZMA_FILTER_LZMA1 || id == LZMA_FILTER_LZMA1EXT 607 || id == LZMA_FILTER_LZMA2); 608 609 // Allocate lzma_lzma1_encoder if it wasn't already allocated. 610 if (*coder_ptr == NULL) { 611 *coder_ptr = lzma_alloc(sizeof(lzma_lzma1_encoder), allocator); 612 if (*coder_ptr == NULL) 613 return LZMA_MEM_ERROR; 614 } 615 616 lzma_lzma1_encoder *coder = *coder_ptr; 617 618 // Set compression mode. Note that we haven't validated the options 619 // yet. Invalid options will get rejected by lzma_lzma_encoder_reset() 620 // call at the end of this function. 621 switch (options->mode) { 622 case LZMA_MODE_FAST: 623 coder->fast_mode = true; 624 break; 625 626 case LZMA_MODE_NORMAL: { 627 coder->fast_mode = false; 628 629 // Set dist_table_size. 630 // Round the dictionary size up to next 2^n. 631 // 632 // Currently the maximum encoder dictionary size 633 // is 1.5 GiB due to lz_encoder.c and here we need 634 // to be below 2 GiB to make the rounded up value 635 // fit in an uint32_t and avoid an infinite while-loop 636 // (and undefined behavior due to a too large shift). 637 // So do the same check as in LZ encoder, 638 // limiting to 1.5 GiB. 639 if (options->dict_size > (UINT32_C(1) << 30) 640 + (UINT32_C(1) << 29)) 641 return LZMA_OPTIONS_ERROR; 642 643 uint32_t log_size = 0; 644 while ((UINT32_C(1) << log_size) < options->dict_size) 645 ++log_size; 646 647 coder->dist_table_size = log_size * 2; 648 649 // Length encoders' price table size 650 const uint32_t nice_len = my_max( 651 mf_get_hash_bytes(options->mf), 652 options->nice_len); 653 654 coder->match_len_encoder.table_size 655 = nice_len + 1 - MATCH_LEN_MIN; 656 coder->rep_len_encoder.table_size 657 = nice_len + 1 - MATCH_LEN_MIN; 658 break; 659 } 660 661 default: 662 return LZMA_OPTIONS_ERROR; 663 } 664 665 // We don't need to write the first byte as literal if there is 666 // a non-empty preset dictionary. encode_init() wouldn't even work 667 // if there is a non-empty preset dictionary, because encode_init() 668 // assumes that position is zero and previous byte is also zero. 669 coder->is_initialized = options->preset_dict != NULL 670 && options->preset_dict_size > 0; 671 coder->is_flushed = false; 672 coder->uncomp_size = 0; 673 coder->uncomp_size_ptr = NULL; 674 675 // Output size limiting is disabled by default. 676 coder->out_limit = 0; 677 678 // Determine if end marker is wanted: 679 // - It is never used with LZMA2. 680 // - It is always used with LZMA_FILTER_LZMA1 (unless 681 // lzma_lzma_set_out_limit() is called later). 682 // - LZMA_FILTER_LZMA1EXT has a flag for it in the options. 683 coder->use_eopm = (id == LZMA_FILTER_LZMA1); 684 if (id == LZMA_FILTER_LZMA1EXT) { 685 // Check if unsupported flags are present. 686 if (options->ext_flags & ~LZMA_LZMA1EXT_ALLOW_EOPM) 687 return LZMA_OPTIONS_ERROR; 688 689 coder->use_eopm = (options->ext_flags 690 & LZMA_LZMA1EXT_ALLOW_EOPM) != 0; 691 692 // TODO? As long as there are no filters that change the size 693 // of the data, it is enough to look at lzma_stream.total_in 694 // after encoding has been finished to know the uncompressed 695 // size of the LZMA1 stream. But in the future there could be 696 // filters that change the size of the data and then total_in 697 // doesn't work as the LZMA1 stream size might be different 698 // due to another filter in the chain. The problem is simple 699 // to solve: Add another flag to ext_flags and then set 700 // coder->uncomp_size_ptr to the address stored in 701 // lzma_options_lzma.reserved_ptr2 (or _ptr1). 702 } 703 704 set_lz_options(lz_options, options); 705 706 return lzma_lzma_encoder_reset(coder, options); 707 } 708 709 710 static lzma_ret 711 lzma_encoder_init(lzma_lz_encoder *lz, const lzma_allocator *allocator, 712 lzma_vli id, const void *options, lzma_lz_options *lz_options) 713 { 714 if (options == NULL) 715 return LZMA_PROG_ERROR; 716 717 lz->code = &lzma_encode; 718 lz->set_out_limit = &lzma_lzma_set_out_limit; 719 return lzma_lzma_encoder_create( 720 &lz->coder, allocator, id, options, lz_options); 721 } 722 723 724 extern lzma_ret 725 lzma_lzma_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, 726 const lzma_filter_info *filters) 727 { 728 return lzma_lz_encoder_init( 729 next, allocator, filters, &lzma_encoder_init); 730 } 731 732 733 extern uint64_t 734 lzma_lzma_encoder_memusage(const void *options) 735 { 736 if (!is_options_valid(options)) 737 return UINT64_MAX; 738 739 lzma_lz_options lz_options; 740 set_lz_options(&lz_options, options); 741 742 const uint64_t lz_memusage = lzma_lz_encoder_memusage(&lz_options); 743 if (lz_memusage == UINT64_MAX) 744 return UINT64_MAX; 745 746 return (uint64_t)(sizeof(lzma_lzma1_encoder)) + lz_memusage; 747 } 748 749 750 extern bool 751 lzma_lzma_lclppb_encode(const lzma_options_lzma *options, uint8_t *byte) 752 { 753 if (!is_lclppb_valid(options)) 754 return true; 755 756 *byte = (options->pb * 5 + options->lp) * 9 + options->lc; 757 assert(*byte <= (4 * 5 + 4) * 9 + 8); 758 759 return false; 760 } 761 762 763 #ifdef HAVE_ENCODER_LZMA1 764 extern lzma_ret 765 lzma_lzma_props_encode(const void *options, uint8_t *out) 766 { 767 if (options == NULL) 768 return LZMA_PROG_ERROR; 769 770 const lzma_options_lzma *const opt = options; 771 772 if (lzma_lzma_lclppb_encode(opt, out)) 773 return LZMA_PROG_ERROR; 774 775 write32le(out + 1, opt->dict_size); 776 777 return LZMA_OK; 778 } 779 #endif 780 781 782 extern LZMA_API(lzma_bool) 783 lzma_mode_is_supported(lzma_mode mode) 784 { 785 return mode == LZMA_MODE_FAST || mode == LZMA_MODE_NORMAL; 786 } 787