]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - src/ppmc/ppmcmain.c
El codigo esta mas prolijo, nada nuevo, trate de optimizar las cosas basicas de...
[z.facultad/75.06/jacu.git] / src / ppmc / ppmcmain.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: "ppmcmain.c"
7  Email: arturo@arturocampos.com
8  Web: http://www.arturocampos.com
9
10  Part of the ppmc encoder only.
11
12  This module is the main module and calls the different modules to do
13  the encoding of a file. When done prints bpb and kbyps.
14 */
15
16
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include "range.h"      //the range coder functions and data
20 #include "ppmcdata.h"
21
22
23 long filesize(FILE *stream);
24
25
26
27 //Main
28 int main (char argc, char *argv[])
29 {
30  unsigned long counter, //temporal counter for loops like for or while
31           counter2,     //another temporal counter for sub loops
32           size_file_input;     //the size of the input file
33
34
35  // Print title, version and copyright
36  printf("PPMC using range coder. (without exclusion)\n");
37  printf("Copyright (C) Arturo San Emeterio Campos 1999. All rights reserved.\n");
38  printf("Permission is granted to make verbatim copies of this program for private\n");
39  printf("use only. There is ABSOLUTELY NO WARRANTY. Use it at your OWN RISK.\n");
40
41  // Check for correct number of parameters
42  if(argc!=3)
43    {
44    printf("Bad number of arguments.\n");
45    exit(1);
46    }
47
48
49  // Try to open input and output files
50  if((file_input=fopen(argv[1],"r+b"))==NULL)
51    {
52    printf("Couldn't open %s.\n",argv[1]);
53    exit(1);
54    }
55
56  if((file_output=fopen(argv[2],"w+b"))==NULL)
57    {
58    printf("Couldn't create %s.\n",argv[2]);
59    exit(1);
60    }
61
62
63  // Check input file length and not accept 0 length files
64  size_file_input=filesize(file_input);
65
66  if(size_file_input<5)
67    {
68    printf("Can't work with files below than 5 bytes!");
69    exit(1);
70    }
71
72
73  // First output file length
74  fwrite(&size_file_input,1,4,file_output);      //input length
75
76
77  // Initialize ppmc encoder
78  ppmc_alloc_memory();           //get memory
79  ppmc_initialize_contexts();    //initialize model
80  ppmc_encoder_initialize();
81
82  // Initialize range coder
83  range_coder_init(&rc_coder,file_output);
84
85
86  // Start main loop which codes the file
87  while((byte=fgetc(file_input))!=EOF)
88  {
89
90  // Try to code current byte under order-4 if possible then go to lower orders
91  if(ppmc_code_byte_order4()==0)
92  if(ppmc_code_byte_order3()==0)
93  if(ppmc_code_byte_order2()==0)
94  if(ppmc_code_byte_order1()==0)
95    if(ppmc_code_byte_order0()==0) //else try to code under order-0
96      {
97      // Code under order-(-1)
98      ppmc_get_prob_ordern1();
99      range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
100      coded_in_order=0;   //update all the tables (unless order-(-1))
101      }
102
103
104  // Now do update exclusion
105
106  switch(coded_in_order)
107    {
108    case 0: ppmc_update_order0();        //update only order-0
109    case 1: ppmc_update_order1();        //update order-0 and order-1
110    case 2: ppmc_update_order2();        //update order-2 1 and 0...
111    case 3: ppmc_update_order3();
112    case 4: ppmc_update_order4();
113    default: break;
114    };
115
116
117
118  // Update order variables
119
120  o4_byte=o3_byte;
121  o3_byte=o2_byte;
122  o2_byte=o1_byte;
123  o1_byte=byte;  //current one is next time order-1
124
125
126  // Check if we run out of memory, in that case, flush the encoder
127
128  if(ppmc_out_of_memory==1)
129    {
130    printf("Flushing memory! Output file might be not decodable.\n");
131    ppmc_flush_mem_enc();
132    }
133
134
135  }
136
137
138  // Flush range coder
139  range_coder_flush(&rc_coder);
140
141  // Free memory
142  ppmc_free_memory();
143
144
145  // Print bpb and kbyps
146  printf("%s at %f bpb.\n",argv[1],((float)filesize(file_output)/(float)size_file_input)*(float)8);
147
148
149  // Close file handles
150  fclose(file_input);
151  fclose(file_output);
152
153
154
155  // Nicely exit
156  return 0;
157 }
158
159
160 // Routines not used by ppmc but rather by main.
161 // Not including the range coder.
162
163
164 // Returns the file size of a given file.
165 long filesize(FILE *stream)
166 {
167    long curpos, length;
168
169    curpos = ftell(stream);
170    fseek(stream, 0L, SEEK_END);
171    length = ftell(stream);
172    fseek(stream, curpos, SEEK_SET);
173    return length;
174 }
175
176