39.41 model_1e.c

/*  
 * model_1e.c  
 *  
 * Un modelo probabilístico de orden 1, inicialmente vacío.  
 *  
 * Referencias:  
 *  
 * model_0.c  
 * model_0s.c  
 * model_1s.c  
 * Witten, Neal, and Cleary, CACM, 1987.  
 * M. Nelson and J.-L. Gailly, The Data Compression Book. 1995.  
 */  
 
#include <stdio.h>  
#include "vlc.h"  
#include "codec.h"  
 
#include "model_1e.h"  
 
#include "model_0/find_symbols_and_indexes.h"  
 
#define _symbol_to_index _symbol_to_index[context]  
#define _index_to_symbol _index_to_symbol[context]  
#define prob prob[context]  
#define cum_prob cum_prob[context]  
#include "model_1e/scale_probs.h"  
#include "model_0/increment_prob_of_index.h"  
#include "model_0/test_if_scale.h"  
#include "model_0/update_model.h"  
#undef _index_to_symbol  
#undef _symbol_to_index  
#undef cum_prob  
#undef prob  
 
#include "model_1e/init_model.h"  
#include "model_0/finish_model.h"  
 
void encode_stream() {  
  context = ESC;  
  init_model();  
  init_encoder();  
  for(;;) {  
    symbol = getchar();  
    if (symbol==EOF) break;  
    index = find_index(symbol);  
    if(prob[context][index]) {  
      /* Si el símbolo ha aparecido antes en ese contexto, simplemente  
         lo codificamos según la distribución de probabilidad de ese  
         contexto. */  
      encode(index, cum_prob[context]);  
    } else {  
      /* Enviamos un ESC, en el contexto correspondiente. */  
      encode(ESC_index, cum_prob[context]);  
      /* Enviamos el nuevo símbolo, en el contexto del ESC. */  
      index = find_index(symbol);  
      encode(index, cum_prob[ESC]);  
    }  
    update_model();  
    context = symbol;  
  }  
  encode(EOS_index, cum_prob[context]);  
  finish_encoder();  
  finish_model();  
}  
 
void decode_stream() {  
  context = ESC;  
  init_model();  
  init_decoder();  
  for(;;) {  
    index = decode(cum_prob[context]);  
    if(index==EOS_index) break;  
    symbol = find_symbol(index);  
    if(symbol==ESC) {  
      index = decode(cum_prob[ESC]);  
      symbol = find_symbol(index);  
    }  
    putchar(symbol);  
    update_model();  
    context = symbol;  
  }  
  finish_decoder();  
  finish_model();  
}