]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - otros/ppmc/ppmcmain.c
Se mueven cosas de internet.
[z.facultad/75.06/jacu.git] / otros / 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