2 /*-------------------------------------------------------------*/
3 /*--- Compression machinery (not incl block sorting) ---*/
5 /*-------------------------------------------------------------*/
8 This file is a part of bzip2 and/or libbzip2, a program and
9 library for lossless, block-sorting data compression.
11 Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
13 Redistribution and use in source and binary forms, with or without
14 modification, are permitted provided that the following conditions
17 1. Redistributions of source code must retain the above copyright
18 notice, this list of conditions and the following disclaimer.
20 2. The origin of this software must not be misrepresented; you must
21 not claim that you wrote the original software. If you use this
22 software in a product, an acknowledgment in the product
23 documentation would be appreciated but is not required.
25 3. Altered source versions must be plainly marked as such, and must
26 not be misrepresented as being the original software.
28 4. The name of the author may not be used to endorse or promote
29 products derived from this software without specific prior written
32 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
33 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
34 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
36 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
38 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
39 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
40 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
41 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44 Julian Seward, Cambridge, UK.
46 bzip2/libbzip2 version 1.0 of 21 March 2000
48 This program is based on (at least) the work of:
58 For more information on these sources, see the manual.
64 0.9.0 -- original version.
66 0.9.0a/b -- no changes in this file.
69 * changed setting of nGroups in sendMTFValues() so as to
70 do a bit better on small files
73 #include "bzlib_private.h"
76 /*---------------------------------------------------*/
77 /*--- Bit stream I/O ---*/
78 /*---------------------------------------------------*/
80 /*---------------------------------------------------*/
81 void BZ2_bsInitWrite ( EState
* s
)
88 /*---------------------------------------------------*/
90 void bsFinishWrite ( EState
* s
)
92 while (s
->bsLive
> 0) {
93 s
->zbits
[s
->numZ
] = (UChar
)(s
->bsBuff
>> 24);
101 /*---------------------------------------------------*/
102 #define bsNEEDW(nz) \
104 while (s->bsLive >= 8) { \
106 = (UChar)(s->bsBuff >> 24); \
114 /*---------------------------------------------------*/
117 void bsW ( EState
* s
, Int32 n
, UInt32 v
)
120 s
->bsBuff
|= (v
<< (32 - s
->bsLive
- n
));
125 /*---------------------------------------------------*/
127 void bsPutUInt32 ( EState
* s
, UInt32 u
)
129 bsW ( s
, 8, (u
>> 24) & 0xffL
);
130 bsW ( s
, 8, (u
>> 16) & 0xffL
);
131 bsW ( s
, 8, (u
>> 8) & 0xffL
);
132 bsW ( s
, 8, u
& 0xffL
);
136 /*---------------------------------------------------*/
138 void bsPutUChar ( EState
* s
, UChar c
)
140 bsW( s
, 8, (UInt32
)c
);
144 /*---------------------------------------------------*/
145 /*--- The back end proper ---*/
146 /*---------------------------------------------------*/
148 /*---------------------------------------------------*/
150 void makeMaps_e ( EState
* s
)
154 for (i
= 0; i
< 256; i
++)
156 s
->unseqToSeq
[i
] = s
->nInUse
;
162 /*---------------------------------------------------*/
164 void generateMTFValues ( EState
* s
)
173 After sorting (eg, here),
174 s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
176 ((UChar*)s->arr2) [ 0 .. s->nblock-1 ]
177 holds the original block data.
179 The first thing to do is generate the MTF values,
181 ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
182 Because there are strictly fewer or equal MTF values
183 than block values, ptr values in this area are overwritten
184 with MTF values only when they are no longer needed.
186 The final compressed bitstream is generated into the
188 (UChar*) (&((UChar*)s->arr2)[s->nblock])
190 These storage aliases are set up in bzCompressInit(),
191 except for the last one, which is arranged in
194 UInt32
* ptr
= s
->ptr
;
195 UChar
* block
= s
->block
;
196 UInt16
* mtfv
= s
->mtfv
;
201 for (i
= 0; i
<= EOB
; i
++) s
->mtfFreq
[i
] = 0;
205 for (i
= 0; i
< s
->nInUse
; i
++) yy
[i
] = (UChar
) i
;
207 for (i
= 0; i
< s
->nblock
; i
++) {
209 AssertD ( wr
<= i
, "generateMTFValues(1)" );
210 j
= ptr
[i
]-1; if (j
< 0) j
+= s
->nblock
;
211 ll_i
= s
->unseqToSeq
[block
[j
]];
212 AssertD ( ll_i
< s
->nInUse
, "generateMTFValues(2a)" );
222 mtfv
[wr
] = BZ_RUNB
; wr
++;
223 s
->mtfFreq
[BZ_RUNB
]++;
225 mtfv
[wr
] = BZ_RUNA
; wr
++;
226 s
->mtfFreq
[BZ_RUNA
]++;
228 if (zPend
< 2) break;
229 zPend
= (zPend
- 2) / 2;
235 register UChar
* ryy_j
;
236 register UChar rll_i
;
241 while ( rll_i
!= rtmp
) {
242 register UChar rtmp2
;
249 j
= ryy_j
- &(yy
[0]);
250 mtfv
[wr
] = j
+1; wr
++; s
->mtfFreq
[j
+1]++;
260 mtfv
[wr
] = BZ_RUNB
; wr
++;
261 s
->mtfFreq
[BZ_RUNB
]++;
263 mtfv
[wr
] = BZ_RUNA
; wr
++;
264 s
->mtfFreq
[BZ_RUNA
]++;
266 if (zPend
< 2) break;
267 zPend
= (zPend
- 2) / 2;
272 mtfv
[wr
] = EOB
; wr
++; s
->mtfFreq
[EOB
]++;
278 /*---------------------------------------------------*/
279 #define BZ_LESSER_ICOST 0
280 #define BZ_GREATER_ICOST 15
283 void sendMTFValues ( EState
* s
)
285 Int32 v
, t
, i
, j
, gs
, ge
, totc
, bt
, bc
, iter
;
286 Int32 nSelectors
, alphaSize
, minLen
, maxLen
, selCtr
;
287 Int32 nGroups
, nBytes
;
290 UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
291 is a global since the decoder also needs it.
293 Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
294 Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
295 are also globals only used in this proc.
296 Made global to keep stack frame size small.
300 UInt16 cost
[BZ_N_GROUPS
];
301 Int32 fave
[BZ_N_GROUPS
];
303 UInt16
* mtfv
= s
->mtfv
;
305 if (s
->verbosity
>= 3)
306 VPrintf3( " %d in block, %d after MTF & 1-2 coding, "
307 "%d+2 syms in use\n",
308 s
->nblock
, s
->nMTF
, s
->nInUse
);
310 alphaSize
= s
->nInUse
+2;
311 for (t
= 0; t
< BZ_N_GROUPS
; t
++)
312 for (v
= 0; v
< alphaSize
; v
++)
313 s
->len
[t
][v
] = BZ_GREATER_ICOST
;
315 /*--- Decide how many coding tables to use ---*/
316 AssertH ( s
->nMTF
> 0, 3001 );
317 if (s
->nMTF
< 200) nGroups
= 2; else
318 if (s
->nMTF
< 600) nGroups
= 3; else
319 if (s
->nMTF
< 1200) nGroups
= 4; else
320 if (s
->nMTF
< 2400) nGroups
= 5; else
323 /*--- Generate an initial set of coding tables ---*/
325 Int32 nPart
, remF
, tFreq
, aFreq
;
331 tFreq
= remF
/ nPart
;
334 while (aFreq
< tFreq
&& ge
< alphaSize
-1) {
336 aFreq
+= s
->mtfFreq
[ge
];
340 && nPart
!= nGroups
&& nPart
!= 1
341 && ((nGroups
-nPart
) % 2 == 1)) {
342 aFreq
-= s
->mtfFreq
[ge
];
346 if (s
->verbosity
>= 3)
347 VPrintf5( " initial group %d, [%d .. %d], "
348 "has %d syms (%4.1f%%)\n",
349 nPart
, gs
, ge
, aFreq
,
350 (100.0 * (float)aFreq
) / (float)(s
->nMTF
) );
352 for (v
= 0; v
< alphaSize
; v
++)
353 if (v
>= gs
&& v
<= ge
)
354 s
->len
[nPart
-1][v
] = BZ_LESSER_ICOST
; else
355 s
->len
[nPart
-1][v
] = BZ_GREATER_ICOST
;
364 Iterate up to BZ_N_ITERS times to improve the tables.
366 for (iter
= 0; iter
< BZ_N_ITERS
; iter
++) {
368 for (t
= 0; t
< nGroups
; t
++) fave
[t
] = 0;
370 for (t
= 0; t
< nGroups
; t
++)
371 for (v
= 0; v
< alphaSize
; v
++)
375 Set up an auxiliary length table which is used to fast-track
376 the common case (nGroups == 6).
379 for (v
= 0; v
< alphaSize
; v
++) {
380 s
->len_pack
[v
][0] = (s
->len
[1][v
] << 16) | s
->len
[0][v
];
381 s
->len_pack
[v
][1] = (s
->len
[3][v
] << 16) | s
->len
[2][v
];
382 s
->len_pack
[v
][2] = (s
->len
[5][v
] << 16) | s
->len
[4][v
];
391 /*--- Set group start & end marks. --*/
392 if (gs
>= s
->nMTF
) break;
393 ge
= gs
+ BZ_G_SIZE
- 1;
394 if (ge
>= s
->nMTF
) ge
= s
->nMTF
-1;
397 Calculate the cost of this group as coded
398 by each of the coding tables.
400 for (t
= 0; t
< nGroups
; t
++) cost
[t
] = 0;
402 if (nGroups
== 6 && 50 == ge
-gs
+1) {
403 /*--- fast track the common case ---*/
404 register UInt32 cost01
, cost23
, cost45
;
406 cost01
= cost23
= cost45
= 0;
408 # define BZ_ITER(nn) \
409 icv = mtfv[gs+(nn)]; \
410 cost01 += s->len_pack[icv][0]; \
411 cost23 += s->len_pack[icv][1]; \
412 cost45 += s->len_pack[icv][2]; \
414 BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4);
415 BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9);
416 BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
417 BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
418 BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
419 BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
420 BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
421 BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
422 BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
423 BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
427 cost
[0] = cost01
& 0xffff; cost
[1] = cost01
>> 16;
428 cost
[2] = cost23
& 0xffff; cost
[3] = cost23
>> 16;
429 cost
[4] = cost45
& 0xffff; cost
[5] = cost45
>> 16;
432 /*--- slow version which correctly handles all situations ---*/
433 for (i
= gs
; i
<= ge
; i
++) {
434 UInt16 icv
= mtfv
[i
];
435 for (t
= 0; t
< nGroups
; t
++) cost
[t
] += s
->len
[t
][icv
];
440 Find the coding table which is best for this group,
441 and record its identity in the selector table.
443 bc
= 999999999; bt
= -1;
444 for (t
= 0; t
< nGroups
; t
++)
445 if (cost
[t
] < bc
) { bc
= cost
[t
]; bt
= t
; };
448 s
->selector
[nSelectors
] = bt
;
452 Increment the symbol frequencies for the selected table.
454 if (nGroups
== 6 && 50 == ge
-gs
+1) {
455 /*--- fast track the common case ---*/
457 # define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
459 BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4);
460 BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9);
461 BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
462 BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
463 BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
464 BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
465 BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
466 BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
467 BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
468 BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
473 /*--- slow version which correctly handles all situations ---*/
474 for (i
= gs
; i
<= ge
; i
++)
475 s
->rfreq
[bt
][ mtfv
[i
] ]++;
480 if (s
->verbosity
>= 3) {
481 VPrintf2 ( " pass %d: size is %d, grp uses are ",
483 for (t
= 0; t
< nGroups
; t
++)
484 VPrintf1 ( "%d ", fave
[t
] );
489 Recompute the tables based on the accumulated frequencies.
491 for (t
= 0; t
< nGroups
; t
++)
492 BZ2_hbMakeCodeLengths ( &(s
->len
[t
][0]), &(s
->rfreq
[t
][0]),
497 AssertH( nGroups
< 8, 3002 );
498 AssertH( nSelectors
< 32768 &&
499 nSelectors
<= (2 + (900000 / BZ_G_SIZE
)),
503 /*--- Compute MTF values for the selectors. ---*/
505 UChar pos
[BZ_N_GROUPS
], ll_i
, tmp2
, tmp
;
506 for (i
= 0; i
< nGroups
; i
++) pos
[i
] = i
;
507 for (i
= 0; i
< nSelectors
; i
++) {
508 ll_i
= s
->selector
[i
];
511 while ( ll_i
!= tmp
) {
518 s
->selectorMtf
[i
] = j
;
522 /*--- Assign actual codes for the tables. --*/
523 for (t
= 0; t
< nGroups
; t
++) {
526 for (i
= 0; i
< alphaSize
; i
++) {
527 if (s
->len
[t
][i
] > maxLen
) maxLen
= s
->len
[t
][i
];
528 if (s
->len
[t
][i
] < minLen
) minLen
= s
->len
[t
][i
];
530 AssertH ( !(maxLen
> 20), 3004 );
531 AssertH ( !(minLen
< 1), 3005 );
532 BZ2_hbAssignCodes ( &(s
->code
[t
][0]), &(s
->len
[t
][0]),
533 minLen
, maxLen
, alphaSize
);
536 /*--- Transmit the mapping table. ---*/
539 for (i
= 0; i
< 16; i
++) {
541 for (j
= 0; j
< 16; j
++)
542 if (s
->inUse
[i
* 16 + j
]) inUse16
[i
] = True
;
546 for (i
= 0; i
< 16; i
++)
547 if (inUse16
[i
]) bsW(s
,1,1); else bsW(s
,1,0);
549 for (i
= 0; i
< 16; i
++)
551 for (j
= 0; j
< 16; j
++) {
552 if (s
->inUse
[i
* 16 + j
]) bsW(s
,1,1); else bsW(s
,1,0);
555 if (s
->verbosity
>= 3)
556 VPrintf1( " bytes: mapping %d, ", s
->numZ
-nBytes
);
559 /*--- Now the selectors. ---*/
561 bsW ( s
, 3, nGroups
);
562 bsW ( s
, 15, nSelectors
);
563 for (i
= 0; i
< nSelectors
; i
++) {
564 for (j
= 0; j
< s
->selectorMtf
[i
]; j
++) bsW(s
,1,1);
567 if (s
->verbosity
>= 3)
568 VPrintf1( "selectors %d, ", s
->numZ
-nBytes
);
570 /*--- Now the coding tables. ---*/
573 for (t
= 0; t
< nGroups
; t
++) {
574 Int32 curr
= s
->len
[t
][0];
576 for (i
= 0; i
< alphaSize
; i
++) {
577 while (curr
< s
->len
[t
][i
]) { bsW(s
,2,2); curr
++; /* 10 */ };
578 while (curr
> s
->len
[t
][i
]) { bsW(s
,2,3); curr
--; /* 11 */ };
583 if (s
->verbosity
>= 3)
584 VPrintf1 ( "code lengths %d, ", s
->numZ
-nBytes
);
586 /*--- And finally, the block data proper ---*/
591 if (gs
>= s
->nMTF
) break;
592 ge
= gs
+ BZ_G_SIZE
- 1;
593 if (ge
>= s
->nMTF
) ge
= s
->nMTF
-1;
594 AssertH ( s
->selector
[selCtr
] < nGroups
, 3006 );
596 if (nGroups
== 6 && 50 == ge
-gs
+1) {
597 /*--- fast track the common case ---*/
599 UChar
* s_len_sel_selCtr
600 = &(s
->len
[s
->selector
[selCtr
]][0]);
601 Int32
* s_code_sel_selCtr
602 = &(s
->code
[s
->selector
[selCtr
]][0]);
604 # define BZ_ITAH(nn) \
605 mtfv_i = mtfv[gs+(nn)]; \
607 s_len_sel_selCtr[mtfv_i], \
608 s_code_sel_selCtr[mtfv_i] )
610 BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4);
611 BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9);
612 BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
613 BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
614 BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
615 BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
616 BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
617 BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
618 BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
619 BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
624 /*--- slow version which correctly handles all situations ---*/
625 for (i
= gs
; i
<= ge
; i
++) {
627 s
->len
[s
->selector
[selCtr
]] [mtfv
[i
]],
628 s
->code
[s
->selector
[selCtr
]] [mtfv
[i
]] );
636 AssertH( selCtr
== nSelectors
, 3007 );
638 if (s
->verbosity
>= 3)
639 VPrintf1( "codes %d\n", s
->numZ
-nBytes
);
643 /*---------------------------------------------------*/
644 void BZ2_compressBlock ( EState
* s
, Bool is_last_block
)
648 BZ_FINALISE_CRC ( s
->blockCRC
);
649 s
->combinedCRC
= (s
->combinedCRC
<< 1) | (s
->combinedCRC
>> 31);
650 s
->combinedCRC
^= s
->blockCRC
;
651 if (s
->blockNo
> 1) s
->numZ
= 0;
653 if (s
->verbosity
>= 2)
654 VPrintf4( " block %d: crc = 0x%8x, "
655 "combined CRC = 0x%8x, size = %d\n",
656 s
->blockNo
, s
->blockCRC
, s
->combinedCRC
, s
->nblock
);
661 s
->zbits
= (UChar
*) (&((UChar
*)s
->arr2
)[s
->nblock
]);
663 /*-- If this is the first block, create the stream header. --*/
664 if (s
->blockNo
== 1) {
665 BZ2_bsInitWrite ( s
);
666 bsPutUChar ( s
, BZ_HDR_B
);
667 bsPutUChar ( s
, BZ_HDR_Z
);
668 bsPutUChar ( s
, BZ_HDR_h
);
669 bsPutUChar ( s
, (UChar
)(BZ_HDR_0
+ s
->blockSize100k
) );
674 bsPutUChar ( s
, 0x31 ); bsPutUChar ( s
, 0x41 );
675 bsPutUChar ( s
, 0x59 ); bsPutUChar ( s
, 0x26 );
676 bsPutUChar ( s
, 0x53 ); bsPutUChar ( s
, 0x59 );
678 /*-- Now the block's CRC, so it is in a known place. --*/
679 bsPutUInt32 ( s
, s
->blockCRC
);
682 Now a single bit indicating (non-)randomisation.
683 As of version 0.9.5, we use a better sorting algorithm
684 which makes randomisation unnecessary. So always set
685 the randomised bit to 'no'. Of course, the decoder
686 still needs to be able to handle randomised blocks
687 so as to maintain backwards compatibility with
688 older versions of bzip2.
692 bsW ( s
, 24, s
->origPtr
);
693 generateMTFValues ( s
);
698 /*-- If this is the last block, add the stream trailer. --*/
701 bsPutUChar ( s
, 0x17 ); bsPutUChar ( s
, 0x72 );
702 bsPutUChar ( s
, 0x45 ); bsPutUChar ( s
, 0x38 );
703 bsPutUChar ( s
, 0x50 ); bsPutUChar ( s
, 0x90 );
704 bsPutUInt32 ( s
, s
->combinedCRC
);
705 if (s
->verbosity
>= 2)
706 VPrintf1( " final combined CRC = 0x%x\n ", s
->combinedCRC
);
712 /*-------------------------------------------------------------*/
713 /*--- end compress.c ---*/
714 /*-------------------------------------------------------------*/