/*
* 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(); } |