]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - src/ppmc/ppmc.c
Se agrega documentación y una implementación de prueba de PPMC.
[z.facultad/75.06/jacu.git] / src / ppmc / ppmc.c
1 /*
2  Copyright (C) Arturo San Emeterio Campos 1999. All rights reserved.
3  Permission is granted to make verbatim copies of this file for private 
4  use only. There is ABSOLUTELY NO WARRANTY. Use it at your OWN RISK.
5
6  This file is: "ppmc.c"
7  Email: arturo@arturocampos.com
8  Web: http://www.arturocampos.com
9
10  Part of the ppmc encoder and decoder.
11
12  This module contains the whole ppmc encoder. It uses hash tables for
13  managing most of the orders. And a maximum order of 4. It codes bytes.
14  Order-1-0-(-1) are all handled in tables. Order-2 has a table with
15  direct hashing with pointers to the linked lists. Order-4 and order-3
16  both have hash tables with pointers to contexts in a linked lists which
17  finally have a pointer to the start of the linked list with the
18  probability distribution. Update exclusion is used, but exclusion is not.
19
20  Please, note that if the machine where the decoder is run doesn't has as
21  much memory as the computer where the encoder was ran, the decoder will
22  not be able to properly decode the file, because it will not be able to
23  keep track of new statistics, in this case it will just exit.
24
25  For applications where the loss of data is not admisible, I suggest you to
26  limit both encoder and decoder's memory requeriments to a given minimum
27  which both machines have.
28 */
29
30
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include "range.h"
34 #include "ppmcdata.h"
35
36
37
38 // Ruotines used by ppmc. Not including the range coder.
39 //
40 // They are for initializing of both encoder and decoder, and unless there
41 // are two version, both encoder and decoder use the same routines. Like
42 // "ppmc_initialize_contexts".
43
44
45 // This one allocs the memory needed by ppmc, and adjust some pointers used
46 // for allocating elements in the linked lists. The mempool arrays must be
47 // initialized now.
48 void ppmc_alloc_memory(void)
49 {
50  unsigned long counter;
51
52
53  // Init mempool buffers
54
55  for(counter=0;counter!=_mempool_max_index;++counter)
56    {
57    _bytes_pool_array[counter]=0;
58    _context_pool_array[counter]=0;
59    }
60
61  _bytes_pool_index=1;   //first entry will be used now
62  _context_pool_index=1;
63
64
65  // Allocate memory for ppmc structures and adjust some variables
66  if((_bytes_pool=(struct _byte_and_freq *)malloc
67    (sizeof(struct _byte_and_freq)*_bytes_pool_elements))==NULL)
68    {
69    printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
70    ppmc_out_of_memory=1;    //flush
71    return;
72    }
73
74  if((_context_pool=(struct context *)malloc
75    (sizeof(struct context)*_context_pool_elements))==NULL)
76    {
77    printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
78    ppmc_out_of_memory=1;    //flush
79    return;
80    }
81
82
83  //save pointers in the array for freeing
84  _bytes_pool_array[0]=_bytes_pool;
85  _context_pool_array[0]=_context_pool;
86
87
88  //adjust variables
89  _bytes_pool_max=_bytes_pool+_bytes_pool_elements;
90  _context_pool_max=_context_pool+_context_pool_elements;
91
92  ppmc_out_of_memory=0;  //we still have memory
93 }
94
95
96 // This routine initializes all the contexts, and all the tables including
97 // those who care about the number of bytes defined in a context.
98 void ppmc_initialize_contexts(void)
99 {
100  unsigned long counter, counter2;
101
102
103  // Order-0
104  for(counter=0;counter!=256;++counter) //clear table
105    order0_array[counter]=0;
106
107  order0_defined_bytes=0;       //adjust variables
108  order0_max_cump=0;
109
110
111  // Order-1
112  for(counter=0;counter!=256;++counter)  //erase every table of every context
113    for(counter2=0;counter2!=256;++counter2)
114      order1_array[counter][counter2]=0;
115
116  for(counter=0;counter!=256;++counter) //adjust variables
117    {
118    order1_defined_bytes_array[counter]=0;
119    order1_max_cump_array[counter]=0;
120    }
121
122
123  // Order-2
124  for(counter=0;counter!=65536;++counter)
125    {
126    //order2_array[counter].prob=0;     //clear pointer to bytes and frequencies
127    //order2_array[counter].max_cump=0;
128    order2_array[counter].defined_bytes=0;
129    }
130
131
132  // Order-4-3
133  for(counter=0;counter!=65536;++counter) //order-4-3
134    {
135    order4_hasht[counter]=0;
136    order3_hasht[counter]=0;
137    }
138 }
139
140
141 // This routine initializes the encode model by outputting as many bytes as
142 // needed to prepare the models. This should be called before the main loop
143 // and after the memory has been allocated and tables initialized.
144 //
145 // It does not need uses the range coder. It output the first 1 bytes.
146 void ppmc_encoder_initialize(void)
147 {
148
149  // Initialize order-0 and prepare different bytes for orders
150  fputc((byte=fgetc(file_input)),file_output);
151  o4_byte=byte;    //order-4
152
153  fputc((byte=fgetc(file_input)),file_output);
154  o3_byte=byte;    //order-3
155
156  fputc((byte=fgetc(file_input)),file_output);
157  o2_byte=byte;    //order-2
158  ppmc_update_order0();
159
160  fputc((byte=fgetc(file_input)),file_output);
161  o1_byte=byte;
162
163 }
164
165
166 // This routine initializes the decoder model, should be called to do the same
167 // changes as "ppmc_encoder_initialize()" did.
168 void ppmc_decoder_initialize(void)
169 {
170
171  // Initialize order-0 and context bytes
172  byte=fgetc(file_input);
173  o4_byte=byte;    //order-4
174  fputc(byte,file_output);
175
176  byte=fgetc(file_input);
177  o3_byte=byte;    //order-3
178  fputc(byte,file_output);
179
180  byte=fgetc(file_input);
181  o2_byte=byte;    //order-2
182
183  fputc(byte,file_output);   //output first byte
184  ppmc_update_order0();
185
186  byte=fgetc(file_input);
187  o1_byte=byte;    //order-1
188  fputc(byte,file_output);
189 }
190
191
192 // Once coding or decoding is finished you have to call this routine.
193 // It must be called when done.
194 void ppmc_free_memory(void)
195 {
196  unsigned long counter;
197
198  // Free the memory buffers
199
200  for(counter=0;counter!=_mempool_max_index;++counter)
201    {
202    if(_bytes_pool_array[counter]!=0)
203      free(_bytes_pool_array[counter]);
204
205    if(_context_pool_array[counter]!=0)
206      free(_context_pool_array[counter]);
207    }
208
209 }
210
211
212 // This routine flushes the memory and restarts all the tables of
213 // probabilities, current order bytes are not modified, this function
214 // is called when we ran out of memory. We have to output the code
215 // number 256 which means memory flushing, for doing this we have to go
216 // to order-(-1) so we have to output an escape code in all the orders
217 // till we reach order-(-1) where we can code it. Then we free all the
218 // memory, alloc it again, and reinitialize all the orders.
219 //
220 // However we may find the case when the current order is not initialized,
221 // in this case we don't need to output an escape code.
222 void ppmc_flush_mem_enc(void)
223 {
224
225  // Code an escape code in order-4
226  if(ppmc_get_totf_order4()!=0)  //if 0 no need of escape code
227    {
228
229    ppmc_get_escape_prob_order4();       //get prob and cump
230    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
231
232    }
233
234
235  // Code an escape code in order-3
236  if(ppmc_get_totf_order3()!=0)  //if 0 no need of escape code
237    {
238
239    ppmc_get_escape_prob_order3();       //get prob and cump
240    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
241
242    }
243
244
245  // Code an escape code in order-2
246
247  o2_cntxt=ppmc_order2_hash_key(o1_byte,o2_byte);
248
249  // First check if current order-2 context is empty
250  if(order2_array[o2_cntxt].defined_bytes!=0)  //it's not empty
251    {
252    ppmc_get_totf_order2();
253    ppmc_get_escape_prob_order2();
254    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
255    }
256
257
258  // Code an escape code in order-1
259
260  // First check if current order-1 table is empty
261  if(order1_defined_bytes_array[o1_byte]!=0)  //it's not empty
262    {
263    ppmc_get_totf_order1();
264    ppmc_get_escape_prob_order1();
265    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
266    }
267
268
269  // Code an escape code in order-0. Order-0 always has at least one symbol
270
271  ppmc_get_totf_order0();
272  ppmc_get_escape_prob_order0();
273  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
274
275
276
277  // Now we can code the code 256
278
279  symb_prob=1;
280  symb_cump=256;
281  total_cump=257;
282  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
283
284
285  // Now that decoder knows the flushing, free memory and reinit
286
287  ppmc_free_memory();
288  ppmc_alloc_memory();
289  ppmc_initialize_contexts();
290
291
292  // Be sure that order-0 has at least one probability
293
294  order0_array[o1_byte]++;
295  order0_max_cump++;
296  order0_defined_bytes++;
297
298 }
299
300
301 // When the decoder gets the symbol of flushing, most of the job is done
302 // because we already got all the escape codes, so we only have to reinit.
303 void ppmc_flush_mem_dec(void)
304 {
305
306  // Free memory and reinit
307
308  ppmc_free_memory();
309  ppmc_alloc_memory();
310  ppmc_initialize_contexts();
311
312
313  // Be sure that order-0 has at least one probability
314
315  order0_array[o1_byte]++;
316  order0_max_cump++;
317  order0_defined_bytes++;
318
319
320 }
321
322
323
324 // ORDER-(-1) functions, also called ordern1 (Negative1) in functions
325 //
326 // Because order-(-1) does not need to update its probability tables, it
327 // has no tables, and relies on the fact that the cump of byte is its own
328 // value, and the probability is fixed, 1, and the total cump is 257.
329 //
330 // The alphabet has the following distribution: 0-255 the bytes. 256 is
331 // an special symbol which means that we have flushed the encoder tables,
332 // and thus the encoder must flush its tables too.
333 //
334 // The rest of the tables only have 256 symbols, because we have no need
335 // of assign a symbol to the flush code (which already is the order-(-1)
336 // table) nor to the escape code.
337
338
339 // Gets the probability for a given symbol in the order-(-1) (ordern1)
340 void ppmc_get_prob_ordern1(void)
341 {
342  symb_cump=byte;    //its value
343  symb_prob=1;      //flat probability
344  total_cump=257;   //total cump
345 }
346
347
348 // Returns in the variable "total_cump" the current total cump of
349 // order-(-1)
350 void ppmc_get_totf_ordern1(void)
351 {
352  total_cump=257;        //this is fixed
353 }
354
355
356 // Returns the symbol for a given cump under order-(-1)
357 unsigned long ppmc_get_symbol_ordern1 (void)
358 {
359  return symb_cump;
360 }
361
362
363
364 // ORDER-0 functions
365 //
366 // Due to the fact that order-0 has no context, I use an array for all the
367 // probabilities under order-0, just as you could do in a basic model for
368 // arithmetic coding.
369 //
370 // The main array is: order0_array. Where order0_array[byte] contains the
371 // probability for a given byte. The same applies to order-1.
372 //
373 // To ensure that the updating and coding is done correctly, "byte" can't
374 // be changed till all the coding and updating is done.
375
376
377 // Returns in the variable "total_cump" the current total cump of
378 // order-0
379 void ppmc_get_totf_order0(void)
380 {
381  // Total cump is current total cump plus the escape for the escape code
382  total_cump=order0_defined_bytes+order0_max_cump;
383 }
384
385
386 // Codes a byte under order-0 and returns 1, otherwise it returns a 0 and
387 // has coded an escape code. In this case further coding is needed.
388 //
389 // Returns: 1 in case a byte was coded. 0 in case of escape code.
390 char ppmc_code_byte_order0(void)
391 {
392  unsigned long counter;
393
394  ppmc_get_totf_order0();      //get total cump
395
396  // See if the byte is present
397  if(order0_array[byte]==0)      //a probability of 0
398    {
399
400    // Because it was not present, output an escape code, prepare variables
401
402    symb_cump=order0_max_cump;   //obviously its cump is current max_cump
403                                 //without escape code's space
404
405    symb_prob=order0_defined_bytes;  //the number of defined bytes
406
407    // Code the escape code
408    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
409
410    return 0;    //byte not coded
411    }
412  else
413    {
414
415    coded_in_order=0;
416
417    // The symbol is present, code it under order-0
418
419    symb_prob=order0_array[byte];        //get probability directly
420
421    // Make cump for current symbol
422
423    symb_cump=0;         //for first symbol is 0
424    for(counter=0; counter!=byte ; ++counter)
425      symb_cump+=order0_array[counter];  //sum probabilities before our symbol
426
427    // Code the symbol
428    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
429
430    return 1;    //symbol coded under order-0
431    }
432 }
433
434
435 // This functions update order-0 probabilities with current byte, also takes
436 // care about updating variables, and renormalizing.
437 void ppmc_update_order0(void)
438 {
439  if(order0_array[byte]==0)
440    {
441    // It had a zero probability
442    order0_array[byte]++;       //increment symbol probability
443    ++order0_defined_bytes;     //new byte defined
444    ++order0_max_cump;          //total cump
445    return;
446    }
447  else
448    {
449    // It had a non-zero probability
450
451    // Increment its probability
452    order0_array[byte]++;      //increment symbol probability
453    ++order0_max_cump;         //total cump
454
455    // Check to see if its the maximum in this case renormalize
456    if(order0_array[byte]==255)
457      ppmc_renormalize_order0();
458
459    return;
460    }
461 }
462
463
464 // This functions renormalizes the probabilities at order-0 updating variables
465 void ppmc_renormalize_order0(void)
466 {
467  unsigned long counter;
468
469  // Initialize variables
470  order0_defined_bytes=0;        //clear them
471  order0_max_cump=0;
472
473  // Loop over all probabilities, divide them by a factor of 2 and update variables
474  for(counter=0 ; counter!=256 ; ++counter)
475    {
476    order0_array[counter]>>=1;   //divide by a factor of 2
477
478    if(order0_array[counter]!=0) //see if it has a non zero probability
479      order0_defined_bytes++;
480
481    order0_max_cump+=order0_array[counter];      //sum to the total cump
482    }
483 }
484
485
486 // Decodes the symbol correspoding to the current order, it returns the byte
487 // or in case of a escape code it returns -1
488 void ppmc_decode_order0(void)
489 {
490  unsigned long current_cump, counter;
491
492
493  // Get the total cump needed for decoding symbol
494  ppmc_get_totf_order0();      //total cump needed for decoding
495  symb_cump=range_decoder_decode(&rc_decoder,total_cump);        //decode it
496
497  // Now check if it's an escape code
498  if(symb_cump>=order0_max_cump)     //the defined code space for the escape code
499    {
500
501    // Update coding values
502
503    ppmc_get_escape_prob_order0();
504    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
505
506    // Mark as escape code
507
508    byte=-1;
509
510    return;   //an escape code
511    }
512  else
513    {
514    // Now we have to check what symbol it is
515
516    current_cump=0;      //cump of the current symbol
517
518    for(counter=0 ; counter!= 256 ; ++counter)
519      {
520      if(symb_cump<current_cump)
521        break;                  //symbol found, break search loop
522      current_cump+=order0_array[counter];       //update cump
523      }
524
525    counter--;           //-1 (see ac_ppmc.html, searching for a given symbol)
526
527    byte=counter;        //update the variable with the found symbol
528
529
530    // Get the cump and prob of byte
531
532    symb_prob=order0_array[byte];        //the probabilty
533    symb_cump=current_cump-order0_array[byte]; //using the cump which was
534                                               //already made
535
536    // Update coding state
537
538    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
539
540    coded_in_order=0;    //decoded under order-0
541
542    return;
543    }
544
545 }
546
547
548 // This function returns the probability for the escape codes in the variables
549 void ppmc_get_escape_prob_order0(void)
550 {
551  // To understand that remember that the escape allocated for the escape code
552  // is above the current maximum cump and that it has a probability determined
553  // by the scheme C.
554  symb_prob=order0_defined_bytes;
555  symb_cump=order0_max_cump;
556  total_cump=order0_defined_bytes+order0_max_cump;
557 }
558
559
560
561 // ORDER-1 functions
562 //
563 // Order-1 uses 256 arrays one for every context, obviously they are accessed
564 // like that: order1_array[o1_byte][byte]
565 //
566 // Also for computing the value of the current escape code in a given context
567 // we need to know how many bytes are defined in a given context, they are
568 // stored in an array, and you use them like that:
569 // order1_defined_bytes_array[o1_byte]
570 //
571 // The same goes for the maximum cump of a given context:
572 // order1_max_cump_array[o1_byte]
573 //
574 // Read the order-0 explanation.
575 //
576 // To ensure that the updating and coding is done correctly, "byte" and
577 // "o1_byte" can't be changed till all the coding and updating is done.
578
579
580 // Returns in the variable "total_cump" the current total cump of
581 // order-1. o1_byte should contain the order-1
582 void ppmc_get_totf_order1(void)
583 {
584  // Total cump is current total cump plus the escape for the escape code
585  total_cump=order1_defined_bytes_array[o1_byte]+order1_max_cump_array[o1_byte];
586 }
587
588
589 // Codes a byte under order-1 and returns 1.
590 // Otherwise it returns a 0 it may be that it has coded an escape code, or
591 // that current table was empty, in this case nothing is outputted
592 // In both cases further coding is needed.
593 //
594 // Returns: 1 in case a byte was coded. 0 in case of escape code or empty table.
595 // In case the byte is coded under this context, coded_in_order=1.
596 char ppmc_code_byte_order1(void)
597 {
598  unsigned long counter;
599
600
601  // First check if current order-1 table is empty
602  if(order1_defined_bytes_array[o1_byte]==0)  //it's empty
603    {
604    return 0;    //byte not coded, nothing done
605    }
606
607
608  // Now try to code this byte under order-1
609
610  ppmc_get_totf_order1();      //get total cump
611
612  // See if the byte is present
613  if(order1_array[o1_byte][byte]==0)      //a probability of 0
614    {
615
616    // Because it was not present, output an escape code, prepare variables
617
618    symb_cump=order1_max_cump_array[o1_byte];//obviously its cump is current max_cump
619                                             //without escape code's space
620
621    symb_prob=order1_defined_bytes_array[o1_byte];//the number of defined bytes
622
623    // Code the escape code
624    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
625
626    return 0;    //byte not coded, escape coded
627    }
628  else
629    {
630
631    coded_in_order=1;            //because we coded it under order-1
632
633    // The symbol is present, code it under order-1
634
635    symb_prob=order1_array[o1_byte][byte];        //get probability directly
636
637    // Make cump for current symbol
638
639    symb_cump=0;         //for first symbol is 0
640    for(counter=0; counter!=byte ; ++counter)
641      symb_cump+=order1_array[o1_byte][counter];  //sum probabilities before our symbol
642
643    // Code the symbol
644    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
645
646    return 1;    //symbol coded under order-1
647    }
648 }
649
650
651 // This functions update order-1 probabilities with current byte, also takes
652 // care about updating variables, and renormalizing. o1_byte must be filled.
653 void ppmc_update_order1(void)
654 {
655  if(order1_array[o1_byte][byte]==0)
656    {
657    // It had a zero probability
658    order1_array[o1_byte][byte]++;       //increment symbol probability
659    ++order1_defined_bytes_array[o1_byte];     //new byte defined
660    ++order1_max_cump_array[o1_byte];          //total cump
661    return;
662    }
663  else
664    {
665    // It had a non-zero probability
666
667    // Increment its probability
668    order1_array[o1_byte][byte]++;      //increment symbol probability
669    ++order1_max_cump_array[o1_byte];         //total cump
670
671    // Check to see if its the maximum in this case renormalize
672    if(order1_array[o1_byte][byte]==255)
673      ppmc_renormalize_order1();
674
675    return;
676    }
677 }
678
679
680 // This functions renormalizes the probabilities at order-1 updating variables
681 void ppmc_renormalize_order1(void)
682 {
683  unsigned long counter;
684
685  // Initialize variables
686  order1_defined_bytes_array[o1_byte]=0;        //clear them
687  order1_max_cump_array[o1_byte]=0;
688
689  // Loop over all probabilities, divide them by a factor of 2 and update variables
690  for(counter=0 ; counter!=256 ; ++counter)
691    {
692    order1_array[o1_byte][counter]>>=1;   //divide by a factor of 2
693
694    if(order1_array[o1_byte][counter]!=0) //see if it has a non zero probability
695      order1_defined_bytes_array[o1_byte]++;
696
697    order1_max_cump_array[o1_byte]+=order1_array[o1_byte][counter];      //sum to the total cump
698    }
699 }
700
701
702 // Decodes the symbol correspoding to the current order, it returns the byte
703 // or in case of an escape code or empty table it returns -1.
704 // It updates "coded_in_order".
705 void ppmc_decode_order1(void)
706 {
707  unsigned long current_cump, counter;
708
709
710  // First check if current order-1 table is empty
711  if(order1_defined_bytes_array[o1_byte]==0)  //it's empty
712    {
713    byte=-1;   //byte not coded, nothing done
714    return;
715    }
716
717
718  // Get the total cump needed for decoding symbol
719  ppmc_get_totf_order1();      //total cump needed for decoding
720  symb_cump=range_decoder_decode(&rc_decoder,total_cump);        //decode it
721
722  // Now check if it's an escape code
723  if(symb_cump>=order1_max_cump_array[o1_byte])     //the defined code space for the escape code
724    {
725
726    // Update coding values
727
728    ppmc_get_escape_prob_order1();
729    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
730
731    // Mark as escape code
732
733    byte=-1;
734
735    return;   //an escape code
736    }
737  else
738    {
739    // Now we have to check what symbol it is
740
741    current_cump=0;      //cump of the current symbol
742
743    for(counter=0 ; counter!= 256 ; ++counter)
744      {
745      if(symb_cump<current_cump)
746        break;                  //symbol found, break search loop
747      current_cump+=order1_array[o1_byte][counter];       //update cump
748      }
749
750    counter--;           //-1 (see ac_ppmc.html, searching for a given symbol)
751
752    byte=counter;        //update the variable with the found symbol
753
754
755    // Get the cump and prob of byte
756
757    symb_prob=order1_array[o1_byte][byte];        //the probabilty
758    symb_cump=current_cump-order1_array[o1_byte][byte]; //using the cump which was
759                                               //already made
760
761    // Update coding state
762
763    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
764
765
766    // Update coded_in_order used for update exclusion
767
768    coded_in_order=1;
769
770    return;
771    }
772
773 }
774
775
776 // This function returns the probability for the escape codes in the variables
777 void ppmc_get_escape_prob_order1(void)
778 {
779  // To understand that remember that the escape allocated for the escape code
780  // is above the current maximum cump and that it has a probability determined
781  // by the scheme C.
782  symb_prob=order1_defined_bytes_array[o1_byte];
783  symb_cump=order1_max_cump_array[o1_byte];
784  total_cump=order1_defined_bytes_array[o1_byte]+order1_max_cump_array[o1_byte];
785 }
786
787
788
789 // ORDER-2 functions
790 //
791 // Order-2 uses a table which holds the contexts data structure of every
792 // structure, its accessed with "ppmc_order2_hash_key(o1_byte, o2_byte)"
793 // and because it uses direct addressing there's no need to check for hash
794 // collisions, which makes it faster. The variable "o2_cntxt" contains o1_byte
795 // and o2_byte used directly to index the order-2 array.
796 //
797 // Though order-2 uses the same routines as lower orders they are rather
798 // different, because we can't allocate memory for all the probabilities
799 // tables, we have to use linked lists for the bytes and probabilities.
800 //
801 // Under order-2 we don't let a probability to be lower than 1, that is,
802 // there can't be a symbol in a linked list with a 0 probability, I choosed
803 // this for three factors: the code is easier to read (it isn't messy)
804 // we gain some speed, and the loss of compression seems little.
805 //
806 // To ensure that the updating is done correctly, "o2_cntxt" and
807 // "o2_ll_node" must not be modified by any routine except those who manage
808 // order-2.
809
810
811 // Returns in the variable "total_cump" the current total cump of
812 // order-2. cntxt must have o1_byte and o2_byte hashed with the hash key
813 // for order-2.
814 void ppmc_get_totf_order2(void)
815 {
816  // Total cump is current total cump plus the escape for the escape code
817  total_cump=order2_array[o2_cntxt].defined_bytes+order2_array[o2_cntxt].max_cump;
818 }
819
820
821 // Codes a byte under order-2 and returns 1.
822 // Otherwise it returns a 0. It may be that it has coded an escape code, or
823 // that current table was empty.
824 //
825 // Returns: 1 in case a byte was coded. 0 in case of escape code or empty table.
826 // In case the byte is coded under this context, coded_in_order=2.
827 char ppmc_code_byte_order2(void)
828 {
829  unsigned long counter;
830  struct _byte_and_freq *node;
831
832
833  // Initialize o2_cntxt
834
835  o2_cntxt=ppmc_order2_hash_key(o1_byte,o2_byte);
836
837
838  // First check if current order-2 context is empty
839  if(order2_array[o2_cntxt].defined_bytes==0)  //it's empty
840    {
841    return 0;   //byte not coded, nothing done
842    }
843
844
845  // Now try to code this byte under order-2
846
847  ppmc_get_totf_order2();      //get total cump
848
849
850  // See if the byte is present and compute its cump at the same time
851
852  node=order2_array[o2_cntxt].prob; //pointer to first element in the linked list
853
854  symb_cump=0;   //the first symbol always has a 0 cump
855
856
857  // Now search the byte in the linked list
858
859  do{
860    if(node->byte==byte)
861      goto ppmc_o2_byte_found;   //bad thing, I know, anyone has a better idea?
862    symb_cump+=node->freq;       //add the probability of this byte to the cump
863    if(node->next==0)
864      break;
865    node=node->next;             //next element in the linked list
866    }while(1);
867
868
869  // If we reach that point, the byte was not found in the linked list
870  // so we don't need the cump, we have to output an escape code, whose
871  // probabilities are know using the context structure in the table.
872
873  // Byte was not present in the linked list, current node is the last one,
874  // and that's the node needed for creating a new node, save it.
875
876  o2_ll_node=node;
877
878  // Now get the probability and cump of the escape code
879
880  symb_cump=order2_array[o2_cntxt].max_cump;
881  symb_prob=order2_array[o2_cntxt].defined_bytes;
882
883  // Code the escape code
884  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
885
886  return 0;
887
888
889  // That code is executed when the byte is found in the linked list
890
891  ppmc_o2_byte_found:
892
893
894  // Everything has been tested, now we can feel free to code the byte,
895  // the symb_cump is already computed, now get its probability and code
896  // the byte, also save pointer to this element in the linked lists for
897  // updating.
898
899  coded_in_order=2;      //successfully coded under order-2
900
901  o2_ll_node=node;       //save it for updating
902
903  symb_prob=node->freq;  //get the probability of the byte
904
905  // Code it.
906
907  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
908
909  return 1;      //byte coded under order-2
910 }
911
912
913 // This functions update order-2 probabilities with current byte, also takes
914 // care about updating variables, and renormalizing.
915 // Of course "o2_ll_node" must point to the element to update or the last one,
916 // based on the "coded_in_order" and checking the pointer of the element we
917 // can decide what to do.
918 //
919 // This updating is only for encoding.
920 void ppmc_update_order2(void)
921 {
922
923  // First of all check if that's the first byte in this context, in that case
924  // we have to initialize some variables in the context structure.
925
926  if(order2_array[o2_cntxt].defined_bytes==0)    //no byte defined yet
927    {
928
929    if(ppmc_out_of_memory==1)
930     return;                //exit this function, we can't allocate memory
931
932    order2_array[o2_cntxt].defined_bytes=1;
933    order2_array[o2_cntxt].max_cump=1;
934    order2_array[o2_cntxt].prob=_bytes_pool;
935
936    _bytes_pool->byte=byte;          //initialize byte to current one
937    _bytes_pool->freq=1;             //it appeared once
938    _bytes_pool->next=0;             //now this is last element in ll
939
940    // Do update of linked list variables and memory use
941
942    ++_bytes_pool;           //next time use next entry (this is a pointer)
943
944    if(_bytes_pool==_bytes_pool_max)    //maximum reached
945      {
946
947      // First check to see that we still have entries in the array
948
949      if(_bytes_pool_index==_mempool_max_index)
950        {
951        ppmc_out_of_memory=1;    //flush
952        return;
953        }
954
955      // Allocate memory for new buffer
956
957      if((_bytes_pool=(struct _byte_and_freq *)malloc
958        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
959        {
960        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
961        ppmc_out_of_memory=1;    //flush
962        return;
963        }
964
965      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
966
967      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
968
969      _bytes_pool_index++;
970
971      }
972
973    return;      //nothing else to do
974    }
975
976
977  // The byte was coded under order two, otherwise it was coded under a
978  // lower order (never higher ones, remember that we are using update
979  // exclusion) in this case we have to create a new node in the list.
980
981  if(coded_in_order==2)  //coded under order-2
982    {
983
984    // Update its count and variables of this context and check for renormalization
985
986    o2_ll_node->freq++;  //increment its frequency (rather probability)
987
988    order2_array[o2_cntxt].max_cump++;   //total cump
989
990    if(o2_ll_node->freq==255)    //do we have to renormalize?
991      ppmc_renormalize_order2(); //renormalize
992
993    }
994  else
995    {
996
997    // Once every paranoid check has been done we are sure that this byte
998    // did not existed and so we have to create a new node in the linked
999    // list. Also we have to take care of memory issues.
1000
1001    if(ppmc_out_of_memory==1)
1002      return;                //exit this function, we can't allocate mem
1003
1004    o2_ll_node->next=_bytes_pool;    //put it in the next free entry
1005    _bytes_pool->byte=byte;          //initialize byte to current one
1006    _bytes_pool->freq=1;             //it appeared once
1007    _bytes_pool->next=0;             //now this is last element in ll
1008
1009    order2_array[o2_cntxt].max_cump++;   //total cump
1010    order2_array[o2_cntxt].defined_bytes++;   //total cump
1011
1012    // Do update of linked list variables and memory use
1013
1014    ++_bytes_pool;           //next time use next entry (this is a pointer)
1015
1016    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1017      {
1018
1019      // First check to see that we still have entries in the array
1020
1021      if(_bytes_pool_index==_mempool_max_index)
1022        {
1023        ppmc_out_of_memory=1;    //flush
1024        return;
1025        }
1026
1027      // Allocate memory for new buffer
1028
1029      if((_bytes_pool=(struct _byte_and_freq *)malloc
1030        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1031        {
1032        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1033        ppmc_out_of_memory=1;    //flush
1034        return;
1035        }
1036
1037      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1038
1039      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1040
1041      _bytes_pool_index++;
1042
1043      }
1044
1045  }
1046
1047 }
1048
1049
1050 // This functions renormalizes the probabilities at order-2 updating context
1051 // variables.
1052 void ppmc_renormalize_order2(void)
1053 {
1054  unsigned long counter;
1055  struct _byte_and_freq *node;
1056
1057  // Initialize variables. Defined bytes remain the same.
1058  order2_array[o2_cntxt].max_cump=0;        //clear them
1059
1060  node=order2_array[o2_cntxt].prob;      //get pointer to lined lists
1061
1062  // Divide all the probabilities by 2 and update context variables
1063  while(1)
1064    {
1065    node->freq>>=1;                      //divide by a factor of 2
1066
1067    if(node->freq==0)    //don't allow a probability to be 0
1068      node->freq=1;
1069
1070    order2_array[o2_cntxt].max_cump+=node->freq; //sum to the total cump
1071
1072    if(node->next==0)    //last element
1073      break;
1074    node=node->next;
1075    }
1076
1077
1078  //printf("\nRenormalization, context:%c%c",o2_byte,o1_byte);
1079
1080 }
1081
1082
1083 // Decodes the symbol correspoding to the current order, it returns the byte
1084 // or in case of an escape code or empty table it returns -1.
1085 // It updates "coded_in_order".
1086 //
1087 // If we decode an escape code, we don't modify "o2_ll_node" and thus its
1088 // work of the updating routine to read till the end of the linked list
1089 // (for adding a new element) however if we decode a byte, we save on
1090 // "o2_ll_node" the pointer to its node. (so updating is faster)
1091 void ppmc_decode_order2(void)
1092 {
1093  unsigned long current_cump, counter;
1094  struct _byte_and_freq *node;
1095
1096  // Initialize o2_cntxt
1097
1098  o2_cntxt=ppmc_order2_hash_key(o1_byte,o2_byte);
1099
1100
1101  // First check if current order-2 context is empty
1102  if(order2_array[o2_cntxt].defined_bytes==0)  //it's empty
1103    {
1104    byte=-1;   //byte not coded, nothing done
1105    return;
1106    }
1107
1108
1109  // Get the total cump needed for decoding symbol
1110  ppmc_get_totf_order2();      //total cump needed for decoding
1111  symb_cump=range_decoder_decode(&rc_decoder,total_cump);        //decode it
1112
1113  // Now check if it's an escape code
1114  if(symb_cump>=order2_array[o2_cntxt].max_cump)     //the defined code space for the escape code
1115    {
1116
1117    // Update coding values
1118
1119    ppmc_get_escape_prob_order2();
1120    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
1121
1122    // Mark as escape code
1123
1124    byte=-1;
1125
1126    return;   //an escape code
1127    }
1128  else
1129    {
1130    // Now we have to check what symbol it is
1131
1132    current_cump=0;      //cump of the current symbol
1133
1134    node=order2_array[o2_cntxt].prob;    //get pointer to linked lists
1135
1136    while(1)
1137      {
1138      current_cump+=node->freq; //update cump
1139      if(symb_cump<current_cump)
1140        break;                  //symbol found, break search loop
1141
1142      node=node->next;          //next element
1143      //we have no need to check for the last symbol, we'll never read further
1144      //the end of the linked lists, before we'll found the last byte.
1145      }
1146
1147
1148    //read byte value and probability
1149
1150    symb_prob=node->freq;     //get the probability for updating the state
1151    byte=node->byte;          //get byte
1152    o2_ll_node=node;          //used for updating
1153
1154
1155    // Get the cump of byte
1156
1157    symb_cump=current_cump-symb_prob;
1158
1159    // Update coding state
1160
1161    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
1162
1163    // Update coded_in_order used for update exclusion
1164
1165    coded_in_order=2;
1166
1167    return;
1168    }
1169
1170 }
1171
1172
1173 // This is the routine for updating while decoding. We have to search the byte
1174 // in the linked list, if it's present, update its count, otherwise we have
1175 // hitted the end of the linked list, and there we have to create a new node.
1176 //
1177 // Of course if the byte was matched in order-2 we'll have a pointer to it
1178 // in "o2_ll_node" so we don't need to read the linked list. (we already did
1179 // in decoding)
1180 //
1181 // Another case which we also have to specially deal with, this is the case
1182 // when the context has not been initalized yet.
1183 void ppmc_update_dec_order2(void)
1184 {
1185  struct _byte_and_freq *node;
1186
1187
1188  // Handle the case when the context is not initialized
1189  // This code is the same as the one for the encoding.
1190
1191  if(order2_array[o2_cntxt].defined_bytes==0)    //no byte defined yet
1192    {
1193
1194    if(ppmc_out_of_memory==1)
1195     return;                //exit this function, we can't allocate memory
1196
1197    order2_array[o2_cntxt].defined_bytes=1;
1198    order2_array[o2_cntxt].max_cump=1;
1199    order2_array[o2_cntxt].prob=_bytes_pool;
1200
1201    _bytes_pool->byte=byte;          //initialize byte to current one
1202    _bytes_pool->freq=1;             //it appeared once
1203    _bytes_pool->next=0;             //now this is last element in ll
1204
1205    // Do update of linked list variables and memory use
1206
1207    ++_bytes_pool;           //next time use next entry (this is a pointer)
1208
1209    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1210      {
1211
1212      // First check to see that we still have entries in the array
1213
1214      if(_bytes_pool_index==_mempool_max_index)
1215        {
1216        ppmc_out_of_memory=1;    //flush
1217        return;
1218        }
1219
1220      // Allocate memory for new buffer
1221
1222      if((_bytes_pool=(struct _byte_and_freq *)malloc
1223        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1224        {
1225        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1226        ppmc_out_of_memory=1;    //flush
1227        return;
1228        }
1229
1230      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1231
1232      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1233
1234      _bytes_pool_index++;
1235
1236      }
1237
1238
1239    return;      //nothing else to do
1240    }
1241
1242
1243  // Current context is initalized, proceed
1244
1245  if(coded_in_order==2)          //check if it was decoded under order-2
1246    {
1247
1248    // We can be sure that the pointer "o2_ll_node" points to its entry, and
1249    // it has a non 0 probability (otherwise it couldn't be coded) so just
1250    // update its probability and max_cump
1251
1252    o2_ll_node->freq++;          //the probability of the byte
1253    order2_array[o2_cntxt].max_cump++; //the max_cump
1254
1255    if(o2_ll_node->freq==255)    //check for renormalization
1256      ppmc_renormalize_order2();
1257
1258    }
1259  else
1260    {
1261
1262    // An escape code was decoded under order-2, we have to read till the
1263    // end of the linked list so we can add a new node for this new byte.
1264
1265    node=order2_array[o2_cntxt].prob;    //get pointer to linked list
1266
1267    while(1)
1268      {
1269      if(node->next==0)          //check for the end of the linked list
1270        break;
1271      node=node->next;           //next node
1272      }
1273
1274
1275    // We reached the end of the linked list, add a new node if possible,
1276    // we are using the same code of "ppmc_update_order2()" with the
1277    // difference that the pointer to the linked list is "node"
1278
1279    if(ppmc_out_of_memory==1)
1280      return;                //exit this function, we can't allocate mem
1281
1282    node->next=_bytes_pool;          //put it in the next free entry
1283    _bytes_pool->byte=byte;          //initialize byte to current one
1284    _bytes_pool->freq=1;             //it appeared once
1285    _bytes_pool->next=0;             //now this is last element in ll
1286
1287    order2_array[o2_cntxt].max_cump++;   //total cump
1288    order2_array[o2_cntxt].defined_bytes++;   //total cump
1289
1290    // Do update of linked list variables and memory use
1291
1292    ++_bytes_pool;           //next time use next entry (this is a pointer)
1293
1294    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1295      {
1296
1297      // First check to see that we still have entries in the array
1298
1299      if(_bytes_pool_index==_mempool_max_index)
1300        {
1301        ppmc_out_of_memory=1;    //flush
1302        return;
1303        }
1304
1305      // Allocate memory for new buffer
1306
1307      if((_bytes_pool=(struct _byte_and_freq *)malloc
1308        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1309        {
1310        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1311        ppmc_out_of_memory=1;    //flush
1312        return;
1313        }
1314
1315      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1316
1317      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1318
1319      _bytes_pool_index++;
1320
1321      }
1322
1323    return;      //we are finished updating
1324
1325    }
1326
1327 }
1328
1329
1330 // This function returns the probability for the escape codes in the variables
1331 void ppmc_get_escape_prob_order2(void)
1332 {
1333  // To understand that remember that the escape allocated for the escape code
1334  // is above the current maximum cump and that it has a probability determined
1335  // by the scheme C.
1336
1337  symb_prob=order2_array[o2_cntxt].defined_bytes;
1338  symb_cump=order2_array[o2_cntxt].max_cump;
1339 }
1340
1341
1342
1343 // ORDER-3 functions
1344 //
1345 // The difference between order-3 and order-3 are just a few, instead of
1346 // keeping a table with the context structures, we keep a hash table with
1347 // pointers to linked lists with the context, so it's only a matter of
1348 // searching current context in the linked list corresponding to its hash
1349 // entry. This is done in "ppmc_get_totf_order3" because that's the first
1350 // routine that both encoding and decoding routines call.
1351
1352
1353 // Returns in the variable "total_cump" the current total cump of
1354 // order-3. Must be called while encoding or decoding before anything else
1355 // because it initializes the pointers to the context structure in
1356 // "o3_context" and o3_cntxt.
1357 //
1358 // If the hash entry is not initialized it returns "o3_context"=0
1359 // If the context is not present in the linked list of context, "o3_context"
1360 // will point to the last element in the linked list.
1361 // If the context is present "o3_context" will point to the context to use.
1362 // One can distinguish the last two by checking the context value of the
1363 // structure, if it's not the same, is the last element.
1364 //
1365 // The routine returns 0 if the hash entry is not initialized or if the
1366 // the context was not present. Otherwise it returns 1, meaning that we
1367 // have to code under this context.
1368 char ppmc_get_totf_order3(void)
1369 {
1370  struct context *cntxt_node;
1371
1372
1373  // First make the hash key for order-3
1374
1375  o3_cntxt=ppmc_order3_hash_key(o1_byte,o2_byte,o3_byte);
1376  full_o3_cntxt=(o1_byte)+(o2_byte<<8)+(o3_byte<<16);    //order-3
1377
1378
1379  // Now check the hash entry in the table
1380
1381  if(order3_hasht[o3_cntxt]==0)  //if 0, not initialized
1382    {
1383
1384    o3_context=0;        //no hash entry
1385
1386    return 0;    //hash entry not initialized
1387    }
1388
1389
1390  // Now read trough the linked list of context searching current one
1391
1392  cntxt_node=order3_hasht[o3_cntxt];
1393
1394  while(1)
1395    {
1396
1397    if(cntxt_node->order4321==full_o3_cntxt)     //compare context
1398      goto ppmc_gtf_cntxt_found;
1399
1400    if(cntxt_node->next==0)      //end of context's linked list
1401      break;
1402
1403    cntxt_node=cntxt_node->next; //next element
1404
1405    }
1406
1407
1408  // Once there the context was not found
1409  o3_context=cntxt_node;    //pointer to last element in the linked list
1410
1411  return 0;      //it was not present
1412
1413
1414  // The context is found, so return pointer and cump
1415
1416  ppmc_gtf_cntxt_found:
1417
1418  o3_context=cntxt_node;
1419
1420  // Total cump is current total cump plus the escape for the escape code
1421
1422  total_cump=o3_context->defined_bytes+o3_context->max_cump;
1423
1424  return 1;      //context found
1425
1426 }
1427
1428
1429 // Codes a byte under order-3 and returns 1.
1430 // Otherwise it returns a 0.
1431 //
1432 // In case the byte is coded under this context, coded_in_order=3.
1433 char ppmc_code_byte_order3(void)
1434 {
1435  unsigned long counter;
1436  struct _byte_and_freq *node;
1437
1438
1439  // Get current context (if present) and total cump.
1440
1441  if(ppmc_get_totf_order3()==0)
1442    return 0;
1443
1444
1445  // See if the byte is present and compute its cump at the same time
1446
1447  node=o3_context->prob; //pointer to first element in the linked list
1448
1449  symb_cump=0;   //the first symbol always has a 0 cump
1450
1451
1452  // Now search the byte in the linked list
1453
1454  do{
1455    if(node->byte==byte)
1456      goto ppmc_o3_byte_found;   //bad thing, I know, anyone has a better idea?
1457    symb_cump+=node->freq;       //add the probability of this byte to the cump
1458    if(node->next==0)
1459      break;
1460    node=node->next;             //next element in the linked list
1461    }while(1);
1462
1463
1464  // If we reach that point, the byte was not found in the linked list
1465  // so we don't need the cump, we have to output an escape code, whose
1466  // probabilities are know using the context structure in the table.
1467
1468  // Byte was not present in the linked list, current node is the last one,
1469  // and that's the node needed for creating a new node, save it.
1470
1471  o3_ll_node=node;
1472
1473  // Now get the probability and cump of the escape code
1474
1475  symb_cump=o3_context->max_cump;
1476  symb_prob=o3_context->defined_bytes;
1477
1478  // Code the escape code
1479  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
1480
1481  return 0;
1482
1483
1484  // That code is executed when the byte is found in the linked list
1485
1486  ppmc_o3_byte_found:
1487
1488
1489  // Everything has been tested, now we can feel free to code the byte,
1490  // the symb_cump is already computed, now get its probability and code
1491  // the byte, also save pointer to this element in the linked lists for
1492  // updating.
1493
1494  coded_in_order=3;      //successfully coded under order-3
1495
1496  o3_ll_node=node;       //save it for updating
1497
1498  symb_prob=node->freq;  //get the probability of the byte
1499
1500  // Code it.
1501
1502  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
1503
1504  return 1;      //byte coded under order-3
1505 }
1506
1507
1508 // This functions update order-3 probabilities with current byte, also takes
1509 // care about updating variables, and renormalizing.
1510 //
1511 // "o3_ll_node" must point to the element to update or the last one,
1512 // based on the "coded_in_order" and checking the pointer of the element we
1513 // can decide what to do. Also "o3_context" must be initialized.
1514 //
1515 // This updating is only for encoding.
1516 void ppmc_update_order3(void)
1517 {
1518
1519  // First thing first, check if the hash entry is initialized
1520
1521  if(order3_hasht[o3_cntxt]==0)    //no pointer to linked list defined yet
1522    {
1523
1524    if(ppmc_out_of_memory==1)
1525      return;                //exit this function, we can't allocate memory
1526
1527
1528    // First create the context
1529
1530    order3_hasht[o3_cntxt]=_context_pool;
1531
1532    _context_pool->next=0;       //this is the last element
1533    _context_pool->order4321=full_o3_cntxt;      //put context
1534    _context_pool->prob=_bytes_pool;             //pointer to linked list
1535    _context_pool->max_cump=1;
1536    _context_pool->defined_bytes=1;
1537
1538
1539    // Do update of linked list variables and memory use of contexts
1540
1541    ++_context_pool;           //next time use next entry (this is a pointer)
1542
1543    if(_context_pool==_context_pool_max)    //maximum reached
1544      {
1545
1546      // First check to see that we still have entries in the array
1547
1548      if(_context_pool_index==_mempool_max_index)
1549        {
1550        ppmc_out_of_memory=1;    //flush
1551        return;
1552        }
1553
1554      // Allocate memory for new buffer
1555
1556      if((_context_pool=(struct context *)malloc
1557        (sizeof(struct context)*_context_pool_elements_inc))==NULL)
1558        {
1559        printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
1560        ppmc_out_of_memory=1;    //flush
1561        return;
1562        }
1563
1564      _context_pool_array[_context_pool_index]=_context_pool;
1565
1566      _context_pool_max=_context_pool+_context_pool_elements_inc;
1567
1568      _context_pool_index++;
1569
1570      }
1571
1572
1573    // Now care about the first (and last) linked list element
1574
1575    _bytes_pool->byte=byte;          //initialize byte to current one
1576    _bytes_pool->freq=1;             //it appeared once
1577    _bytes_pool->next=0;             //now this is last element in ll
1578
1579    // Do update of linked list variables and memory use
1580
1581    ++_bytes_pool;           //next time use next entry (this is a pointer)
1582
1583    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1584      {
1585
1586      // First check to see that we still have entries in the array
1587
1588      if(_bytes_pool_index==_mempool_max_index)
1589        {
1590        ppmc_out_of_memory=1;    //flush
1591        return;
1592        }
1593
1594      // Allocate memory for new buffer
1595
1596      if((_bytes_pool=(struct _byte_and_freq *)malloc
1597        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1598        {
1599        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1600        ppmc_out_of_memory=1;    //flush
1601        return;
1602        }
1603
1604      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1605
1606      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1607
1608      _bytes_pool_index++;
1609
1610      }
1611
1612    return;      //nothing else to do
1613    }
1614
1615
1616
1617
1618  // The byte was coded under order three, otherwise it was coded under a
1619  // lower order (never higher ones, remember that we are using update
1620  // exclusion) in this case we have to create a new node in the list.
1621
1622  if(coded_in_order==3)  //coded under order-3
1623    {
1624
1625    // Update its count and variables of this context and check for renormalization
1626
1627    o3_ll_node->freq++;  //increment its frequency (rather probability)
1628
1629    o3_context->max_cump++;   //total cump
1630
1631    if(o3_ll_node->freq==255)    //do we have to renormalize?
1632      ppmc_renormalize_order3(); //renormalize
1633
1634    }
1635  else
1636    {
1637
1638    // Now we have two cases, under a given context (which we actually found)
1639    // we coded an escape coded, in that case just create a new node in the
1640    // linked list of bytes and probabilities. Otherwise we didn't find the
1641    // same node so we have to create it in the linked list for context.
1642    // And we can be sure that it at least has one element and that
1643    // "o3_context" points to the last element, so we can put the new element.
1644
1645    if(o3_context->order4321==full_o3_cntxt) //chech if that's the last
1646      {                                      //element or the a context found
1647
1648      if(ppmc_out_of_memory==1)
1649        return;                //exit this function, we can't allocate mem
1650
1651      o3_ll_node->next=_bytes_pool;    //put it in the next free entry
1652      _bytes_pool->byte=byte;          //initialize byte to current one
1653      _bytes_pool->freq=1;             //it appeared once
1654      _bytes_pool->next=0;             //now this is last element in ll
1655
1656      o3_context->max_cump++;   //total cump
1657      o3_context->defined_bytes++;   //total cump
1658
1659      // Do update of linked list variables and memory use
1660
1661      ++_bytes_pool;           //next time use next entry (this is a pointer)
1662
1663      if(_bytes_pool==_bytes_pool_max)    //maximum reached
1664        {
1665
1666        // First check to see that we still have entries in the array
1667
1668        if(_bytes_pool_index==_mempool_max_index)
1669          {
1670          ppmc_out_of_memory=1;    //flush
1671          return;
1672          }
1673
1674        // Allocate memory for new buffer
1675
1676        if((_bytes_pool=(struct _byte_and_freq *)malloc
1677          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1678          {
1679          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1680          ppmc_out_of_memory=1;    //flush
1681          return;
1682          }
1683
1684        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1685
1686        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1687
1688        _bytes_pool_index++;
1689
1690        }
1691      }
1692    else
1693      {
1694
1695      // We have to create a new context node
1696
1697      if(ppmc_out_of_memory==1)
1698        return;                //exit this function, we can't allocate memory
1699
1700
1701      // First create the context
1702
1703      o3_context->next=_context_pool;
1704
1705      _context_pool->next=0;       //this is the last element
1706      _context_pool->order4321=full_o3_cntxt;      //put context
1707      _context_pool->prob=_bytes_pool;             //pointer to linked list
1708      _context_pool->max_cump=1;
1709      _context_pool->defined_bytes=1;
1710
1711
1712      // Do update of linked list variables and memory use of contexts
1713
1714      ++_context_pool;           //next time use next entry (this is a pointer)
1715
1716      if(_context_pool==_context_pool_max)    //maximum reached
1717        {
1718
1719        // First check to see that we still have entries in the array
1720
1721        if(_context_pool_index==_mempool_max_index)
1722          {
1723          ppmc_out_of_memory=1;    //flush
1724          return;
1725          }
1726
1727        // Allocate memory for new buffer
1728
1729        if((_context_pool=(struct context *)malloc
1730          (sizeof(struct context)*_context_pool_elements_inc))==NULL)
1731          {
1732          printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
1733          ppmc_out_of_memory=1;    //flush
1734          return;
1735          }
1736
1737        _context_pool_array[_context_pool_index]=_context_pool;
1738
1739        _context_pool_max=_context_pool+_context_pool_elements_inc;
1740
1741        _context_pool_index++;
1742
1743        }
1744
1745      // Now care about the first (and last) linked list element
1746
1747      _bytes_pool->byte=byte;          //initialize byte to current one
1748      _bytes_pool->freq=1;             //it appeared once
1749      _bytes_pool->next=0;             //now this is last element in ll
1750
1751      // Do update of linked list variables and memory use
1752
1753      ++_bytes_pool;           //next time use next entry (this is a pointer)
1754
1755      if(_bytes_pool==_bytes_pool_max)    //maximum reached
1756        {
1757
1758        // First check to see that we still have entries in the array
1759
1760        if(_bytes_pool_index==_mempool_max_index)
1761          {
1762          ppmc_out_of_memory=1;    //flush
1763          return;
1764          }
1765
1766        // Allocate memory for new buffer
1767
1768        if((_bytes_pool=(struct _byte_and_freq *)malloc
1769          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1770          {
1771          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1772          ppmc_out_of_memory=1;    //flush
1773          return;
1774          }
1775
1776        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1777
1778        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1779
1780        _bytes_pool_index++;
1781
1782        }
1783
1784      }
1785
1786  }
1787
1788 }
1789
1790
1791 // This functions renormalizes the probabilities at order-3 updating context
1792 // variables.
1793 void ppmc_renormalize_order3(void)
1794 {
1795  unsigned long counter;
1796  struct _byte_and_freq *node;
1797
1798
1799  // Initialize variables. Defined bytes remain the same.
1800  o3_context->max_cump=0;        //clear them
1801
1802  node=o3_context->prob;      //get pointer to lined lists
1803
1804  // Divide all the probabilities by 2 and update context variables
1805  while(1)
1806    {
1807    node->freq>>=1;                      //divide by a factor of 2
1808
1809    if(node->freq==0)    //don't allow a probability to be 0
1810      node->freq=1;
1811
1812    o3_context->max_cump+=node->freq; //sum to the total cump
1813
1814    if(node->next==0)    //last element
1815      break;
1816    node=node->next;
1817    }
1818
1819
1820 }
1821
1822
1823 // Decodes the symbol correspoding to the current order, it returns the byte
1824 // or in case of an escape code or empty table it returns -1.
1825 // It updates "coded_in_order".
1826 //
1827 // If we decode an escape code, we don't modify "o3_ll_node" and thus its
1828 // work of the updating routine to read till the end of the linked list
1829 // (for adding a new element) however if we decode a byte, we save on
1830 // "o3_ll_node" the pointer to its node. (so updating is faster)
1831 void ppmc_decode_order3(void)
1832 {
1833  unsigned long current_cump, counter;
1834  struct _byte_and_freq *node;
1835
1836
1837  // Get current context (if present) and total cump.
1838
1839  if(ppmc_get_totf_order3()==0)
1840    {
1841    byte=-1;
1842    return;
1843    }
1844
1845
1846  // Decode current cump
1847
1848  symb_cump=range_decoder_decode(&rc_decoder,total_cump);        //decode it
1849
1850  // Now check if it's an escape code
1851  if(symb_cump>=o3_context->max_cump)     //the defined code space for the escape code
1852    {
1853
1854    // Update coding values
1855
1856    ppmc_get_escape_prob_order3();
1857    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
1858
1859    // Mark as escape code
1860
1861    byte=-1;
1862
1863    return;   //an escape code
1864    }
1865  else
1866    {
1867    // Now we have to check what symbol it is
1868
1869    current_cump=0;      //cump of the current symbol
1870
1871    node=o3_context->prob;    //get pointer to linked lists
1872
1873    while(1)
1874      {
1875      current_cump+=node->freq; //update cump
1876      if(symb_cump<current_cump)
1877        break;                  //symbol found, break search loop
1878
1879      node=node->next;          //next element
1880      //we have no need to check for the last symbol, we'll never read further
1881      //the end of the linked lists, before we'll found the last byte.
1882      }
1883
1884
1885    //read byte value and probability
1886
1887    symb_prob=node->freq;     //get the probability for updating the state
1888    byte=node->byte;          //get byte
1889    o3_ll_node=node;          //used for updating
1890
1891
1892    // Get the cump of byte
1893
1894    symb_cump=current_cump-symb_prob;
1895
1896    // Update coding state
1897
1898    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
1899
1900    // Update coded_in_order used for update exclusion
1901
1902    coded_in_order=3;
1903
1904    return;
1905    }
1906
1907 }
1908
1909
1910 // This is the routine for updating while decoding. The only difference with
1911 // the routine for coding is that when an escape code was coded, "o3_ll_node"
1912 // is not initialized so we have to read till the end of the linked list.
1913 // Fortunately "o3_context" will be initialized so we don't need to read its
1914 // linked list.
1915 void ppmc_update_dec_order3(void)
1916 {
1917  struct _byte_and_freq *node;
1918
1919  // First thing first, check if the hash entry is initialized
1920
1921  if(order3_hasht[o3_cntxt]==0)    //no pointer to linked list defined yet
1922    {
1923
1924    if(ppmc_out_of_memory==1)
1925      return;                //exit this function, we can't allocate memory
1926
1927
1928    // First create the context
1929
1930    order3_hasht[o3_cntxt]=_context_pool;
1931
1932    _context_pool->next=0;       //this is the last element
1933    _context_pool->order4321=full_o3_cntxt;      //put context
1934    _context_pool->prob=_bytes_pool;             //pointer to linked list
1935    _context_pool->max_cump=1;
1936    _context_pool->defined_bytes=1;
1937
1938
1939    // Do update of linked list variables and memory use of contexts
1940
1941    ++_context_pool;           //next time use next entry (this is a pointer)
1942
1943    if(_context_pool==_context_pool_max)    //maximum reached
1944      {
1945
1946      // First check to see that we still have entries in the array
1947
1948      if(_context_pool_index==_mempool_max_index)
1949        {
1950        ppmc_out_of_memory=1;    //flush
1951        return;
1952        }
1953
1954      // Allocate memory for new buffer
1955
1956      if((_context_pool=(struct context *)malloc
1957        (sizeof(struct context)*_context_pool_elements_inc))==NULL)
1958        {
1959        printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
1960        ppmc_out_of_memory=1;    //flush
1961        return;
1962        }
1963
1964      _context_pool_array[_context_pool_index]=_context_pool;
1965
1966      _context_pool_max=_context_pool+_context_pool_elements_inc;
1967
1968      _context_pool_index++;
1969
1970      }
1971
1972    // Now care about the first (and last) linked list element
1973
1974    _bytes_pool->byte=byte;          //initialize byte to current one
1975    _bytes_pool->freq=1;             //it appeared once
1976    _bytes_pool->next=0;             //now this is last element in ll
1977
1978    // Do update of linked list variables and memory use
1979
1980    ++_bytes_pool;           //next time use next entry (this is a pointer)
1981
1982    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1983      {
1984
1985      // First check to see that we still have entries in the array
1986
1987      if(_bytes_pool_index==_mempool_max_index)
1988        {
1989        ppmc_out_of_memory=1;    //flush
1990        return;
1991        }
1992
1993      // Allocate memory for new buffer
1994
1995      if((_bytes_pool=(struct _byte_and_freq *)malloc
1996        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1997        {
1998        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1999        ppmc_out_of_memory=1;    //flush
2000        return;
2001        }
2002
2003      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2004
2005      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2006
2007      _bytes_pool_index++;
2008
2009      }
2010
2011    return;      //nothing else to do
2012    }
2013
2014
2015  // The byte was coded under order three, otherwise it was coded under a
2016  // lower order (never higher ones, remember that we are using update
2017  // exclusion) in this case we have to create a new node in the list.
2018
2019  if(coded_in_order==3)  //coded under order-3
2020    {
2021
2022    // Update its count and variables of this context and check for renormalization
2023
2024    o3_ll_node->freq++;  //increment its frequency (rather probability)
2025
2026    o3_context->max_cump++;   //total cump
2027
2028    if(o3_ll_node->freq==255)    //do we have to renormalize?
2029      ppmc_renormalize_order3(); //renormalize
2030
2031    }
2032  else
2033    {
2034
2035    // Now we have two cases, under a given context (which we actually found)
2036    // we coded an escape coded, in that case just create a new node in the
2037    // linked list of bytes and probabilities. Otherwise we didn't find the
2038    // same node so we have to create it in the linked list for context.
2039    // And we can be sure that it at least has one element and that
2040    // "o3_context" points to the last element, so we can put the new element.
2041
2042    if(o3_context->order4321==full_o3_cntxt) //chech if that's the last
2043      {                                      //element or the a context found
2044
2045      // Read till the end of the linked list
2046
2047      node=o3_context->prob;    //get pointer to linked list
2048
2049      while(1)
2050        {
2051        if(node->next==0)          //check for the end of the linked list
2052          break;
2053        node=node->next;           //next node
2054        }
2055
2056      // Now add element
2057
2058      if(ppmc_out_of_memory==1)
2059        return;                //exit this function, we can't allocate mem
2060
2061      node->next=_bytes_pool;          //put it in the next free entry
2062      _bytes_pool->byte=byte;          //initialize byte to current one
2063      _bytes_pool->freq=1;             //it appeared once
2064      _bytes_pool->next=0;             //now this is last element in ll
2065
2066      o3_context->max_cump++;   //total cump
2067      o3_context->defined_bytes++;   //total cump
2068
2069      // Do update of linked list variables and memory use
2070
2071      ++_bytes_pool;           //next time use next entry (this is a pointer)
2072
2073      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2074        {
2075
2076        // First check to see that we still have entries in the array
2077
2078        if(_bytes_pool_index==_mempool_max_index)
2079          {
2080          ppmc_out_of_memory=1;    //flush
2081          return;
2082          }
2083
2084        // Allocate memory for new buffer
2085
2086        if((_bytes_pool=(struct _byte_and_freq *)malloc
2087          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2088          {
2089          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2090          ppmc_out_of_memory=1;    //flush
2091          return;
2092          }
2093
2094        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2095
2096        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2097
2098        _bytes_pool_index++;
2099
2100        }
2101      }
2102    else
2103      {
2104
2105      // We have to create a new context node
2106
2107      if(ppmc_out_of_memory==1)
2108        return;                //exit this function, we can't allocate memory
2109
2110
2111      // First create the context
2112
2113      o3_context->next=_context_pool;
2114
2115      _context_pool->next=0;       //this is the last element
2116      _context_pool->order4321=full_o3_cntxt;      //put context
2117      _context_pool->prob=_bytes_pool;             //pointer to linked list
2118      _context_pool->max_cump=1;
2119      _context_pool->defined_bytes=1;
2120
2121
2122      // Do update of linked list variables and memory use of contexts
2123
2124      ++_context_pool;           //next time use next entry (this is a pointer)
2125
2126      if(_context_pool==_context_pool_max)    //maximum reached
2127        {
2128
2129        // First check to see that we still have entries in the array
2130
2131        if(_context_pool_index==_mempool_max_index)
2132          {
2133          ppmc_out_of_memory=1;    //flush
2134          return;
2135          }
2136
2137        // Allocate memory for new buffer
2138
2139        if((_context_pool=(struct context *)malloc
2140          (sizeof(struct context)*_context_pool_elements_inc))==NULL)
2141          {
2142          printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
2143          ppmc_out_of_memory=1;    //flush
2144          return;
2145          }
2146
2147        _context_pool_array[_context_pool_index]=_context_pool;
2148
2149        _context_pool_max=_context_pool+_context_pool_elements_inc;
2150
2151        _context_pool_index++;
2152
2153        }
2154
2155      // Now care about the first (and last) linked list element
2156
2157      _bytes_pool->byte=byte;          //initialize byte to current one
2158      _bytes_pool->freq=1;             //it appeared once
2159      _bytes_pool->next=0;             //now this is last element in ll
2160
2161      // Do update of linked list variables and memory use
2162
2163      ++_bytes_pool;           //next time use next entry (this is a pointer)
2164
2165      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2166        {
2167
2168        // First check to see that we still have entries in the array
2169
2170        if(_bytes_pool_index==_mempool_max_index)
2171          {
2172          ppmc_out_of_memory=1;    //flush
2173          return;
2174          }
2175
2176        // Allocate memory for new buffer
2177
2178        if((_bytes_pool=(struct _byte_and_freq *)malloc
2179          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2180          {
2181          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2182          ppmc_out_of_memory=1;    //flush
2183          return;
2184          }
2185
2186        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2187
2188        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2189
2190        _bytes_pool_index++;
2191
2192        }
2193
2194      }
2195
2196  }
2197
2198 }
2199
2200
2201
2202 // This function returns the probability for the escape codes in the variables
2203 void ppmc_get_escape_prob_order3(void)
2204 {
2205  // To understand that remember that the escape allocated for the escape code
2206  // is above the current maximum cump and that it has a probability determined
2207  // by the scheme C.
2208
2209  symb_prob=o3_context->defined_bytes;
2210  symb_cump=o3_context->max_cump;
2211 }
2212
2213
2214
2215 // ORDER-4 functions
2216 //
2217 // The routines for order-4 are *equal* to those for order-3, there are a few
2218 // changes like different global variables, and different hash keys.
2219 //
2220 // If you want to go to higher orders, you'd use the same code and data
2221 // structures, with the difference of the context bytes (order4321)
2222 // stored in every context's linked list.
2223
2224
2225 // Returns in the variable "total_cump" the current total cump of
2226 // order-4. Must be called while encoding or decoding before anything else
2227 // because it initializes the pointers to the context structure in
2228 // "o4_context" and o4_cntxt.
2229 //
2230 // If the hash entry is not initialized it returns "o4_context"=0
2231 // If the context is not present in the linked list of context, "o4_context"
2232 // will point to the last element in the linked list.
2233 // If the context is present "o4_context" will point to the context to use.
2234 // One can distinguish the last two by checking the context value of the
2235 // structure, if it's not the same, is the last element.
2236 //
2237 // The routine returns 0 if the hash entry is not initialized or if the
2238 // the context was not present. Otherwise it returns 1, meaning that we
2239 // have to code under this context.
2240 char ppmc_get_totf_order4(void)
2241 {
2242  struct context *cntxt_node;
2243
2244
2245  // First make the hash key for order-4
2246
2247  o4_cntxt=ppmc_order4_hash_key(o1_byte,o2_byte,o3_byte,o4_byte);
2248  full_o4_cntxt=(o1_byte)+(o2_byte<<8)+(o3_byte<<16)+(o4_byte<<24);    //order-4
2249
2250
2251  // Now check the hash entry in the table
2252
2253  if(order4_hasht[o4_cntxt]==0)  //if 0, not initialized
2254    {
2255
2256    o4_context=0;        //no hash entry
2257
2258    return 0;    //hash entry not initialized
2259    }
2260
2261
2262  // Now read trough the linked list of context searching current one
2263
2264  cntxt_node=order4_hasht[o4_cntxt];
2265
2266  while(1)
2267    {
2268
2269    if(cntxt_node->order4321==full_o4_cntxt)     //compare context
2270      goto ppmc_gtfo4_cntxt_found;
2271
2272    if(cntxt_node->next==0)      //end of context's linked list
2273      break;
2274
2275    cntxt_node=cntxt_node->next; //next element
2276
2277    }
2278
2279
2280  // Once there the context was not found
2281  o4_context=cntxt_node;    //pointer to last element in the linked list
2282
2283  return 0;      //it was not present
2284
2285
2286  // The context is found, so return pointer and cump
2287
2288  ppmc_gtfo4_cntxt_found:
2289
2290  o4_context=cntxt_node;
2291
2292  // Total cump is current total cump plus the escape for the escape code
2293
2294  total_cump=o4_context->defined_bytes+o4_context->max_cump;
2295
2296  return 1;      //context found
2297
2298 }
2299
2300
2301 // Codes a byte under order-4 and returns 1.
2302 // Otherwise it returns a 0.
2303 //
2304 // In case the byte is coded under this context, coded_in_order=4.
2305 char ppmc_code_byte_order4(void)
2306 {
2307  unsigned long counter;
2308  struct _byte_and_freq *node;
2309
2310
2311  // Get current context (if present) and total cump.
2312
2313  if(ppmc_get_totf_order4()==0)
2314    return 0;
2315
2316
2317  // See if the byte is present and compute its cump at the same time
2318
2319  node=o4_context->prob; //pointer to first element in the linked list
2320
2321  symb_cump=0;   //the first symbol always has a 0 cump
2322
2323
2324  // Now search the byte in the linked list
2325
2326  do{
2327    if(node->byte==byte)
2328      goto ppmc_o4_byte_found;   //bad thing, I know, anyone has a better idea?
2329    symb_cump+=node->freq;       //add the probability of this byte to the cump
2330    if(node->next==0)
2331      break;
2332    node=node->next;             //next element in the linked list
2333    }while(1);
2334
2335
2336  // If we reach that point, the byte was not found in the linked list
2337  // so we don't need the cump, we have to output an escape code, whose
2338  // probabilities are know using the context structure in the table.
2339
2340  // Byte was not present in the linked list, current node is the last one,
2341  // and that's the node needed for creating a new node, save it.
2342
2343  o4_ll_node=node;
2344
2345  // Now get the probability and cump of the escape code
2346
2347  symb_cump=o4_context->max_cump;
2348  symb_prob=o4_context->defined_bytes;
2349
2350  // Code the escape code
2351  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
2352
2353  return 0;
2354
2355
2356  // That code is executed when the byte is found in the linked list
2357
2358  ppmc_o4_byte_found:
2359
2360
2361  // Everything has been tested, now we can feel free to code the byte,
2362  // the symb_cump is already computed, now get its probability and code
2363  // the byte, also save pointer to this element in the linked lists for
2364  // updating.
2365
2366  coded_in_order=4;      //successfully coded under order-4
2367
2368  o4_ll_node=node;       //save it for updating
2369
2370  symb_prob=node->freq;  //get the probability of the byte
2371
2372  // Code it.
2373
2374  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
2375
2376  return 1;      //byte coded under order-4
2377 }
2378
2379
2380 // This functions update order-4 probabilities with current byte, also takes
2381 // care about updating variables, and renormalizing.
2382 //
2383 // "o4_ll_node" must point to the element to update or the last one,
2384 // based on the "coded_in_order" and checking the pointer of the element we
2385 // can decide what to do. Also "o4_context" must be initialized.
2386 //
2387 // This updating is only for encoding.
2388 void ppmc_update_order4(void)
2389 {
2390
2391  // First thing first, check if the hash entry is initialized
2392
2393  if(order4_hasht[o4_cntxt]==0)    //no pointer to linked list defined yet
2394    {
2395
2396    if(ppmc_out_of_memory==1)
2397      return;                //exit this function, we can't allocate memory
2398
2399
2400    // First create the context
2401
2402    order4_hasht[o4_cntxt]=_context_pool;
2403
2404    _context_pool->next=0;       //this is the last element
2405    _context_pool->order4321=full_o4_cntxt;      //put context
2406    _context_pool->prob=_bytes_pool;             //pointer to linked list
2407    _context_pool->max_cump=1;
2408    _context_pool->defined_bytes=1;
2409
2410
2411    // Do update of linked list variables and memory use of contexts
2412
2413    ++_context_pool;           //next time use next entry (this is a pointer)
2414
2415    if(_context_pool==_context_pool_max)    //maximum reached
2416      {
2417
2418      // First check to see that we still have entries in the array
2419
2420      if(_context_pool_index==_mempool_max_index)
2421        {
2422        ppmc_out_of_memory=1;    //flush
2423        return;
2424        }
2425
2426      // Allocate memory for new buffer
2427
2428      if((_context_pool=(struct context *)malloc
2429        (sizeof(struct context)*_context_pool_elements_inc))==NULL)
2430        {
2431        printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
2432        ppmc_out_of_memory=1;    //flush
2433        return;
2434        }
2435
2436      _context_pool_array[_context_pool_index]=_context_pool;
2437
2438      _context_pool_max=_context_pool+_context_pool_elements_inc;
2439
2440      _context_pool_index++;
2441
2442      }
2443
2444
2445    // Now care about the first (and last) linked list element
2446
2447    _bytes_pool->byte=byte;          //initialize byte to current one
2448    _bytes_pool->freq=1;             //it appeared once
2449    _bytes_pool->next=0;             //now this is last element in ll
2450
2451    // Do update of linked list variables and memory use
2452
2453    ++_bytes_pool;           //next time use next entry (this is a pointer)
2454
2455    if(_bytes_pool==_bytes_pool_max)    //maximum reached
2456      {
2457
2458      // First check to see that we still have entries in the array
2459
2460      if(_bytes_pool_index==_mempool_max_index)
2461        {
2462        ppmc_out_of_memory=1;    //flush
2463        return;
2464        }
2465
2466      // Allocate memory for new buffer
2467
2468      if((_bytes_pool=(struct _byte_and_freq *)malloc
2469        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2470        {
2471        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2472        ppmc_out_of_memory=1;    //flush
2473        return;
2474        }
2475
2476      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2477
2478      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2479
2480      _bytes_pool_index++;
2481
2482      }
2483
2484    return;      //nothing else to do
2485    }
2486
2487
2488
2489
2490  // The byte was coded under order three, otherwise it was coded under a
2491  // lower order (never higher ones, remember that we are using update
2492  // exclusion) in this case we have to create a new node in the list.
2493
2494  if(coded_in_order==4)  //coded under order-4
2495    {
2496
2497    // Update its count and variables of this context and check for renormalization
2498
2499    o4_ll_node->freq++;  //increment its frequency (rather probability)
2500
2501    o4_context->max_cump++;   //total cump
2502
2503    if(o4_ll_node->freq==255)    //do we have to renormalize?
2504      ppmc_renormalize_order4(); //renormalize
2505
2506    }
2507  else
2508    {
2509
2510    // Now we have two cases, under a given context (which we actually found)
2511    // we coded an escape coded, in that case just create a new node in the
2512    // linked list of bytes and probabilities. Otherwise we didn't find the
2513    // same node so we have to create it in the linked list for context.
2514    // And we can be sure that it at least has one element and that
2515    // "o4_context" points to the last element, so we can put the new element.
2516
2517    if(o4_context->order4321==full_o4_cntxt) //chech if that's the last
2518      {                                      //element or the a context found
2519
2520      if(ppmc_out_of_memory==1)
2521        return;                //exit this function, we can't allocate mem
2522
2523      o4_ll_node->next=_bytes_pool;    //put it in the next free entry
2524      _bytes_pool->byte=byte;          //initialize byte to current one
2525      _bytes_pool->freq=1;             //it appeared once
2526      _bytes_pool->next=0;             //now this is last element in ll
2527
2528      o4_context->max_cump++;   //total cump
2529      o4_context->defined_bytes++;   //total cump
2530
2531      // Do update of linked list variables and memory use
2532
2533      ++_bytes_pool;           //next time use next entry (this is a pointer)
2534
2535      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2536        {
2537
2538        // First check to see that we still have entries in the array
2539
2540        if(_bytes_pool_index==_mempool_max_index)
2541          {
2542          ppmc_out_of_memory=1;    //flush
2543          return;
2544          }
2545
2546        // Allocate memory for new buffer
2547
2548        if((_bytes_pool=(struct _byte_and_freq *)malloc
2549          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2550          {
2551          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2552          ppmc_out_of_memory=1;    //flush
2553          return;
2554          }
2555
2556        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2557
2558        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2559
2560        _bytes_pool_index++;
2561
2562        }
2563      }
2564    else
2565      {
2566
2567      // We have to create a new context node
2568
2569      if(ppmc_out_of_memory==1)
2570        return;                //exit this function, we can't allocate memory
2571
2572
2573      // First create the context
2574
2575      o4_context->next=_context_pool;
2576
2577      _context_pool->next=0;       //this is the last element
2578      _context_pool->order4321=full_o4_cntxt;      //put context
2579      _context_pool->prob=_bytes_pool;             //pointer to linked list
2580      _context_pool->max_cump=1;
2581      _context_pool->defined_bytes=1;
2582
2583
2584      // Do update of linked list variables and memory use of contexts
2585
2586      ++_context_pool;           //next time use next entry (this is a pointer)
2587
2588      if(_context_pool==_context_pool_max)    //maximum reached
2589        {
2590
2591        // First check to see that we still have entries in the array
2592
2593        if(_context_pool_index==_mempool_max_index)
2594          {
2595          ppmc_out_of_memory=1;    //flush
2596          return;
2597          }
2598
2599        // Allocate memory for new buffer
2600
2601        if((_context_pool=(struct context *)malloc
2602          (sizeof(struct context)*_context_pool_elements_inc))==NULL)
2603          {
2604          printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
2605          ppmc_out_of_memory=1;    //flush
2606          return;
2607          }
2608
2609        _context_pool_array[_context_pool_index]=_context_pool;
2610
2611        _context_pool_max=_context_pool+_context_pool_elements_inc;
2612
2613        _context_pool_index++;
2614
2615        }
2616
2617      // Now care about the first (and last) linked list element
2618
2619      _bytes_pool->byte=byte;          //initialize byte to current one
2620      _bytes_pool->freq=1;             //it appeared once
2621      _bytes_pool->next=0;             //now this is last element in ll
2622
2623      // Do update of linked list variables and memory use
2624
2625      ++_bytes_pool;           //next time use next entry (this is a pointer)
2626
2627      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2628        {
2629
2630        // First check to see that we still have entries in the array
2631
2632        if(_bytes_pool_index==_mempool_max_index)
2633          {
2634          ppmc_out_of_memory=1;    //flush
2635          return;
2636          }
2637
2638        // Allocate memory for new buffer
2639
2640        if((_bytes_pool=(struct _byte_and_freq *)malloc
2641          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2642          {
2643          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2644          ppmc_out_of_memory=1;    //flush
2645          return;
2646          }
2647
2648        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2649
2650        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2651
2652        _bytes_pool_index++;
2653
2654        }
2655
2656      }
2657
2658  }
2659
2660 }
2661
2662
2663 // This functions renormalizes the probabilities at order-4 updating context
2664 // variables.
2665 void ppmc_renormalize_order4(void)
2666 {
2667  unsigned long counter;
2668  struct _byte_and_freq *node;
2669
2670
2671  // Initialize variables. Defined bytes remain the same.
2672  o4_context->max_cump=0;        //clear them
2673
2674  node=o4_context->prob;      //get pointer to lined lists
2675
2676  // Divide all the probabilities by 2 and update context variables
2677  while(1)
2678    {
2679    node->freq>>=1;                      //divide by a factor of 2
2680
2681    if(node->freq==0)    //don't allow a probability to be 0
2682      node->freq=1;
2683
2684    o4_context->max_cump+=node->freq; //sum to the total cump
2685
2686    if(node->next==0)    //last element
2687      break;
2688    node=node->next;
2689    }
2690
2691
2692 }
2693
2694
2695 // Decodes the symbol correspoding to the current order, it returns the byte
2696 // or in case of an escape code or empty table it returns -1.
2697 // It updates "coded_in_order".
2698 //
2699 // If we decode an escape code, we don't modify "o4_ll_node" and thus its
2700 // work of the updating routine to read till the end of the linked list
2701 // (for adding a new element) however if we decode a byte, we save on
2702 // "o4_ll_node" the pointer to its node. (so updating is faster)
2703 void ppmc_decode_order4(void)
2704 {
2705  unsigned long current_cump, counter;
2706  struct _byte_and_freq *node;
2707
2708
2709  // Get current context (if present) and total cump.
2710
2711  if(ppmc_get_totf_order4()==0)
2712    {
2713    byte=-1;
2714    return;
2715    }
2716
2717
2718  // Decode current cump
2719
2720  symb_cump=range_decoder_decode(&rc_decoder,total_cump);        //decode it
2721
2722  // Now check if it's an escape code
2723  if(symb_cump>=o4_context->max_cump)     //the defined code space for the escape code
2724    {
2725
2726    // Update coding values
2727
2728    ppmc_get_escape_prob_order4();
2729    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
2730
2731    // Mark as escape code
2732
2733    byte=-1;
2734
2735    return;   //an escape code
2736    }
2737  else
2738    {
2739    // Now we have to check what symbol it is
2740
2741    current_cump=0;      //cump of the current symbol
2742
2743    node=o4_context->prob;    //get pointer to linked lists
2744
2745    while(1)
2746      {
2747      current_cump+=node->freq; //update cump
2748      if(symb_cump<current_cump)
2749        break;                  //symbol found, break search loop
2750
2751      node=node->next;          //next element
2752      //we have no need to check for the last symbol, we'll never read further
2753      //the end of the linked lists, before we'll found the last byte.
2754      }
2755
2756
2757    //read byte value and probability
2758
2759    symb_prob=node->freq;     //get the probability for updating the state
2760    byte=node->byte;          //get byte
2761    o4_ll_node=node;          //used for updating
2762
2763
2764    // Get the cump of byte
2765
2766    symb_cump=current_cump-symb_prob;
2767
2768    // Update coding state
2769
2770    range_decoder_update(&rc_decoder,total_cump,symb_cump,symb_prob);
2771
2772    // Update coded_in_order used for update exclusion
2773
2774    coded_in_order=4;
2775
2776    return;
2777    }
2778
2779 }
2780
2781
2782 // This is the routine for updating while decoding. The only difference with
2783 // the routine for coding is that when an escape code was coded, "o4_ll_node"
2784 // is not initialized so we have to read till the end of the linked list.
2785 // Fortunately "o4_context" will be initialized so we don't need to read its
2786 // linked list.
2787 void ppmc_update_dec_order4(void)
2788 {
2789  struct _byte_and_freq *node;
2790
2791  // First thing first, check if the hash entry is initialized
2792
2793  if(order4_hasht[o4_cntxt]==0)    //no pointer to linked list defined yet
2794    {
2795
2796    if(ppmc_out_of_memory==1)
2797      return;                //exit this function, we can't allocate memory
2798
2799
2800    // First create the context
2801
2802    order4_hasht[o4_cntxt]=_context_pool;
2803
2804    _context_pool->next=0;       //this is the last element
2805    _context_pool->order4321=full_o4_cntxt;      //put context
2806    _context_pool->prob=_bytes_pool;             //pointer to linked list
2807    _context_pool->max_cump=1;
2808    _context_pool->defined_bytes=1;
2809
2810
2811    // Do update of linked list variables and memory use of contexts
2812
2813    ++_context_pool;           //next time use next entry (this is a pointer)
2814
2815    if(_context_pool==_context_pool_max)    //maximum reached
2816      {
2817
2818      // First check to see that we still have entries in the array
2819
2820      if(_context_pool_index==_mempool_max_index)
2821        {
2822        ppmc_out_of_memory=1;    //flush
2823        return;
2824        }
2825
2826      // Allocate memory for new buffer
2827
2828      if((_context_pool=(struct context *)malloc
2829        (sizeof(struct context)*_context_pool_elements_inc))==NULL)
2830        {
2831        printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
2832        ppmc_out_of_memory=1;    //flush
2833        return;
2834        }
2835
2836      _context_pool_array[_context_pool_index]=_context_pool;
2837
2838      _context_pool_max=_context_pool+_context_pool_elements_inc;
2839
2840      _context_pool_index++;
2841
2842      }
2843
2844    // Now care about the first (and last) linked list element
2845
2846    _bytes_pool->byte=byte;          //initialize byte to current one
2847    _bytes_pool->freq=1;             //it appeared once
2848    _bytes_pool->next=0;             //now this is last element in ll
2849
2850    // Do update of linked list variables and memory use
2851
2852    ++_bytes_pool;           //next time use next entry (this is a pointer)
2853
2854    if(_bytes_pool==_bytes_pool_max)    //maximum reached
2855      {
2856
2857      // First check to see that we still have entries in the array
2858
2859      if(_bytes_pool_index==_mempool_max_index)
2860        {
2861        ppmc_out_of_memory=1;    //flush
2862        return;
2863        }
2864
2865      // Allocate memory for new buffer
2866
2867      if((_bytes_pool=(struct _byte_and_freq *)malloc
2868        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2869        {
2870        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2871        ppmc_out_of_memory=1;    //flush
2872        return;
2873        }
2874
2875      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2876
2877      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2878
2879      _bytes_pool_index++;
2880
2881      }
2882
2883    return;      //nothing else to do
2884    }
2885
2886
2887  // The byte was coded under order four, otherwise it was coded under a
2888  // lower order (never higher ones, remember that we are using update
2889  // exclusion) in this case we have to create a new node in the list.
2890
2891  if(coded_in_order==4)  //coded under order-4
2892    {
2893
2894    // Update its count and variables of this context and check for renormalization
2895
2896    o4_ll_node->freq++;  //increment its frequency (rather probability)
2897
2898    o4_context->max_cump++;   //total cump
2899
2900    if(o4_ll_node->freq==255)    //do we have to renormalize?
2901      ppmc_renormalize_order4(); //renormalize
2902
2903    }
2904  else
2905    {
2906
2907    // Now we have two cases, under a given context (which we actually found)
2908    // we coded an escape coded, in that case just create a new node in the
2909    // linked list of bytes and probabilities. Otherwise we didn't find the
2910    // same node so we have to create it in the linked list for context.
2911    // And we can be sure that it at least has one element and that
2912    // "o4_context" points to the last element, so we can put the new element.
2913
2914    if(o4_context->order4321==full_o4_cntxt) //chech if that's the last
2915      {                                      //element or the a context found
2916
2917      // Read till the end of the linked list
2918
2919      node=o4_context->prob;    //get pointer to linked list
2920
2921      while(1)
2922        {
2923        if(node->next==0)          //check for the end of the linked list
2924          break;
2925        node=node->next;           //next node
2926        }
2927
2928      // Now add element
2929
2930      if(ppmc_out_of_memory==1)
2931        return;                //exit this function, we can't allocate mem
2932
2933      node->next=_bytes_pool;          //put it in the next free entry
2934      _bytes_pool->byte=byte;          //initialize byte to current one
2935      _bytes_pool->freq=1;             //it appeared once
2936      _bytes_pool->next=0;             //now this is last element in ll
2937
2938      o4_context->max_cump++;   //total cump
2939      o4_context->defined_bytes++;   //total cump
2940
2941      // Do update of linked list variables and memory use
2942
2943      ++_bytes_pool;           //next time use next entry (this is a pointer)
2944
2945      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2946        {
2947
2948        // First check to see that we still have entries in the array
2949
2950        if(_bytes_pool_index==_mempool_max_index)
2951          {
2952          ppmc_out_of_memory=1;    //flush
2953          return;
2954          }
2955
2956        // Allocate memory for new buffer
2957
2958        if((_bytes_pool=(struct _byte_and_freq *)malloc
2959          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2960          {
2961          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2962          ppmc_out_of_memory=1;    //flush
2963          return;
2964          }
2965
2966        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2967
2968        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2969
2970        _bytes_pool_index++;
2971
2972        }
2973      }
2974    else
2975      {
2976
2977      // We have to create a new context node
2978
2979      if(ppmc_out_of_memory==1)
2980        return;                //exit this function, we can't allocate memory
2981
2982
2983      // First create the context
2984
2985      o4_context->next=_context_pool;
2986
2987      _context_pool->next=0;       //this is the last element
2988      _context_pool->order4321=full_o4_cntxt;      //put context
2989      _context_pool->prob=_bytes_pool;             //pointer to linked list
2990      _context_pool->max_cump=1;
2991      _context_pool->defined_bytes=1;
2992
2993
2994      // Do update of linked list variables and memory use of contexts
2995
2996      ++_context_pool;           //next time use next entry (this is a pointer)
2997
2998      if(_context_pool==_context_pool_max)    //maximum reached
2999        {
3000
3001        // First check to see that we still have entries in the array
3002
3003        if(_context_pool_index==_mempool_max_index)
3004          {
3005          ppmc_out_of_memory=1;    //flush
3006          return;
3007          }
3008
3009        // Allocate memory for new buffer
3010
3011        if((_context_pool=(struct context *)malloc
3012          (sizeof(struct context)*_context_pool_elements_inc))==NULL)
3013          {
3014          printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
3015          ppmc_out_of_memory=1;    //flush
3016          return;
3017          }
3018
3019        _context_pool_array[_context_pool_index]=_context_pool;
3020
3021        _context_pool_max=_context_pool+_context_pool_elements_inc;
3022
3023        _context_pool_index++;
3024
3025        }
3026
3027      // Now care about the first (and last) linked list element
3028
3029      _bytes_pool->byte=byte;          //initialize byte to current one
3030      _bytes_pool->freq=1;             //it appeared once
3031      _bytes_pool->next=0;             //now this is last element in ll
3032
3033      // Do update of linked list variables and memory use
3034
3035      ++_bytes_pool;           //next time use next entry (this is a pointer)
3036
3037      if(_bytes_pool==_bytes_pool_max)    //maximum reached
3038        {
3039
3040        // First check to see that we still have entries in the array
3041
3042        if(_bytes_pool_index==_mempool_max_index)
3043          {
3044          ppmc_out_of_memory=1;    //flush
3045          return;
3046          }
3047
3048        // Allocate memory for new buffer
3049
3050        if((_bytes_pool=(struct _byte_and_freq *)malloc
3051          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
3052          {
3053          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
3054          ppmc_out_of_memory=1;    //flush
3055          return;
3056          }
3057
3058        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
3059
3060        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
3061
3062        _bytes_pool_index++;
3063
3064        }
3065
3066      }
3067
3068  }
3069
3070 }
3071
3072
3073
3074 // This function returns the probability for the escape codes in the variables
3075 void ppmc_get_escape_prob_order4(void)
3076 {
3077  // To understand that remember that the escape allocated for the escape code
3078  // is above the current maximum cump and that it has a probability determined
3079  // by the scheme C.
3080
3081  symb_prob=o4_context->defined_bytes;
3082  symb_cump=o4_context->max_cump;
3083 }
3084