rename opj_create_compress_v2 to opj_create_compress
[openjpeg.git] / tests / test_tile_encoder.c
1 /*
2  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24  * POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include <stdio.h>
28 #include <string.h>
29 #include <stdlib.h>
30 #include <math.h>
31
32 #include "opj_config.h"
33 #include "openjpeg.h"
34 #include "stdlib.h"
35
36 /* -------------------------------------------------------------------------- */
37
38 /**
39 sample error callback expecting a FILE* client object
40 */
41 void error_callback_file(const char *msg, void *client_data) {
42         FILE *stream = (FILE*)client_data;
43         fprintf(stream, "[ERROR] %s", msg);
44 }
45 /**
46 sample warning callback expecting a FILE* client object
47 */
48 void warning_callback_file(const char *msg, void *client_data) {
49         FILE *stream = (FILE*)client_data;
50         fprintf(stream, "[WARNING] %s", msg);
51 }
52 /**
53 sample error debug callback expecting no client object
54 */
55 void error_callback(const char *msg, void *client_data) {
56         (void)client_data;
57         fprintf(stdout, "[ERROR] %s", msg);
58 }
59 /**
60 sample warning debug callback expecting no client object
61 */
62 void warning_callback(const char *msg, void *client_data) {
63         (void)client_data;
64         fprintf(stdout, "[WARNING] %s", msg);
65 }
66 /**
67 sample debug callback expecting no client object
68 */
69 void info_callback(const char *msg, void *client_data) {
70         (void)client_data;
71         fprintf(stdout, "[INFO] %s", msg);
72 }
73
74 /* -------------------------------------------------------------------------- */
75
76 #define NUM_COMPS_MAX 4
77 int main (int argc, char *argv[])
78 {
79         opj_cparameters_t l_param;
80         opj_codec_t * l_codec;
81         opj_image_t * l_image;
82         opj_image_cmptparm_t l_params [NUM_COMPS_MAX];
83         FILE * l_file;
84         opj_stream_t * l_stream;
85         OPJ_UINT32 l_nb_tiles;
86         OPJ_UINT32 l_data_size;
87         unsigned char len;
88
89 #ifdef USING_MCT
90         const OPJ_FLOAT32 l_mct [] =
91         {
92                 1 , 0 , 0 ,
93                 0 , 1 , 0 ,
94                 0 , 0 , 1
95         };
96
97         const OPJ_INT32 l_offsets [] =
98         {
99                 128 , 128 , 128
100         };
101 #endif
102
103         opj_image_cmptparm_t * l_current_param_ptr;
104         OPJ_UINT32 i;
105         OPJ_BYTE *l_data;
106
107   OPJ_UINT32 num_comps;
108   int image_width;
109   int image_height;
110   int tile_width;
111   int tile_height;
112   int comp_prec;
113   int irreversible;
114   char output_file[64];
115
116   /* should be test_tile_encoder 3 2000 2000 1000 1000 8 tte1.j2k */
117   if( argc == 9 )
118     {
119     num_comps = atoi( argv[1] );
120     image_width = atoi( argv[2] );
121     image_height = atoi( argv[3] );
122     tile_width = atoi( argv[4] );
123     tile_height = atoi( argv[5] );
124     comp_prec = atoi( argv[6] );
125     irreversible = atoi( argv[7] );
126     strcpy(output_file, argv[8] );
127     }
128   else
129     {
130     num_comps = 3;
131     image_width = 2000;
132     image_height = 2000;
133     tile_width = 1000;
134     tile_height = 1000;
135     comp_prec = 8;
136     irreversible = 1;
137     strcpy(output_file, "test.j2k" );
138     }
139   if( num_comps > NUM_COMPS_MAX )
140     {
141     return 1;
142     }
143         l_nb_tiles = (image_width/tile_width) * (image_height/tile_height);
144         l_data_size = tile_width * tile_height * num_comps * (comp_prec/8);
145
146         l_data = (OPJ_BYTE*) malloc(tile_width * tile_height * num_comps * (comp_prec/8) * sizeof(OPJ_BYTE));
147
148         fprintf(stdout, "Encoding random values -> keep in mind that this is very hard to compress\n");
149         for (i=0;i<l_data_size;++i)     {
150                 l_data[i] = i; //rand();
151         }
152
153         opj_set_default_encoder_parameters(&l_param);
154         /** you may here add custom encoding parameters */
155         /* rate specifications */
156         /** number of quality layers in the stream */
157         l_param.tcp_numlayers = 1;
158         l_param.cp_fixed_quality = 1;
159         l_param.tcp_distoratio[0] = 20;
160         /* is using others way of calculation */
161         /* l_param.cp_disto_alloc = 1 or l_param.cp_fixed_alloc = 1 */
162         /* l_param.tcp_rates[0] = ... */
163
164
165         /* tile definitions parameters */
166         /* position of the tile grid aligned with the image */
167         l_param.cp_tx0 = 0;
168         l_param.cp_ty0 = 0;
169         /* tile size, we are using tile based encoding */
170         l_param.tile_size_on = OPJ_TRUE;
171         l_param.cp_tdx = tile_width;
172         l_param.cp_tdy = tile_height;
173
174         /* use irreversible encoding ?*/
175         l_param.irreversible = irreversible;
176
177         /* do not bother with mct, the rsiz is set when calling opj_set_MCT*/
178         /*l_param.cp_rsiz = STD_RSIZ;*/
179
180         /* no cinema */
181         /*l_param.cp_cinema = 0;*/
182
183         /* no not bother using SOP or EPH markers, do not use custom size precinct */
184         /* number of precincts to specify */
185         /* l_param.csty = 0;*/
186         /* l_param.res_spec = ... */
187         /* l_param.prch_init[i] = .. */
188         /* l_param.prcw_init[i] = .. */
189
190
191         /* do not use progression order changes */
192         /*l_param.numpocs = 0;*/
193         /* l_param.POC[i].... */
194
195         /* do not restrain the size for a component.*/
196         /* l_param.max_comp_size = 0; */
197
198         /** block encoding style for each component, do not use at the moment */
199         /** J2K_CCP_CBLKSTY_TERMALL, J2K_CCP_CBLKSTY_LAZY, J2K_CCP_CBLKSTY_VSC, J2K_CCP_CBLKSTY_SEGSYM, J2K_CCP_CBLKSTY_RESET */
200         /* l_param.mode = 0;*/
201
202         /** number of resolutions */
203         l_param.numresolution = 6;
204
205         /** progression order to use*/
206         /** LRCP, RLCP, RPCL, PCRL, CPRL */
207         l_param.prog_order = LRCP;
208
209         /** no "region" of interest, more precisally component */
210         /* l_param.roi_compno = -1; */
211         /* l_param.roi_shift = 0; */
212
213         /* we are not using multiple tile parts for a tile. */
214         /* l_param.tp_on = 0; */
215         /* l_param.tp_flag = 0; */
216
217         /* if we are using mct */
218 #ifdef USING_MCT
219         opj_set_MCT(&l_param,l_mct,l_offsets,NUM_COMPS);
220 #endif
221
222
223         /* image definition */
224         l_current_param_ptr = l_params;
225         for (i=0;i<num_comps;++i) {
226                 /* do not bother bpp useless */
227                 /*l_current_param_ptr->bpp = COMP_PREC;*/
228                 l_current_param_ptr->dx = 1;
229                 l_current_param_ptr->dy = 1;
230
231                 l_current_param_ptr->h = image_height;
232                 l_current_param_ptr->w = image_width;
233
234                 l_current_param_ptr->sgnd = 0;
235                 l_current_param_ptr->prec = comp_prec;
236
237                 l_current_param_ptr->x0 = 0;
238                 l_current_param_ptr->y0 = 0;
239
240                 ++l_current_param_ptr;
241         }
242
243   // should we do j2k or jp2 ?
244   len = strlen( output_file );
245   if( strcmp( output_file + len - 4, ".jp2" ) == 0 )
246     {
247     l_codec = opj_create_compress(CODEC_JP2);
248     }
249   else
250     {
251     l_codec = opj_create_compress(CODEC_J2K);
252     }
253         if (!l_codec) {
254                 return 1;
255         }
256
257         /* catch events using our callbacks and give a local context */
258         opj_set_info_handler(l_codec, info_callback,00);
259         opj_set_warning_handler(l_codec, warning_callback,00);
260         opj_set_error_handler(l_codec, error_callback,00);
261
262         l_image = opj_image_tile_create(num_comps,l_params,CLRSPC_SRGB);
263         if (! l_image) {
264                 opj_destroy_codec(l_codec);
265                 return 1;
266         }
267
268         l_image->x0 = 0;
269         l_image->y0 = 0;
270         l_image->x1 = image_width;
271         l_image->y1 = image_height;
272         l_image->color_space = CLRSPC_SRGB;
273
274         if (! opj_setup_encoder_v2(l_codec,&l_param,l_image)) {
275                 fprintf(stderr, "ERROR -> test_tile_encoder: failed to setup the codec!\n");
276                 opj_destroy_codec(l_codec);
277                 opj_image_destroy(l_image);
278                 return 1;
279         }
280
281         l_file = fopen(output_file,"wb");
282         if (! l_file) {
283                 fprintf(stderr, "ERROR -> test_tile_encoder: failed to create the output file!\n");
284                 opj_destroy_codec(l_codec);
285                 opj_image_destroy(l_image);
286                 return 1;
287         }
288
289         l_stream = opj_stream_create_default_file_stream(l_file, OPJ_FALSE);
290
291         if (! opj_start_compress(l_codec,l_image,l_stream)) {
292                 fprintf(stderr, "ERROR -> test_tile_encoder: failed to start compress!\n");
293                 opj_stream_destroy(l_stream);
294                 fclose(l_file);
295                 opj_destroy_codec(l_codec);
296                 opj_image_destroy(l_image);
297                 return 1;
298         }
299
300         for (i=0;i<l_nb_tiles;++i) {
301                 if (! opj_write_tile(l_codec,i,l_data,l_data_size,l_stream)) {
302                         fprintf(stderr, "ERROR -> test_tile_encoder: failed to write the tile %d!\n",i);
303                         opj_stream_destroy(l_stream);
304                         fclose(l_file);
305                         opj_destroy_codec(l_codec);
306                         opj_image_destroy(l_image);
307                         return 1;
308                 }
309         }
310
311         if (! opj_end_compress(l_codec,l_stream)) {
312                 fprintf(stderr, "ERROR -> test_tile_encoder: failed to end compress!\n");
313                 opj_stream_destroy(l_stream);
314                 fclose(l_file);
315                 opj_destroy_codec(l_codec);
316                 opj_image_destroy(l_image);
317                 return 1;
318         }
319
320         opj_stream_destroy(l_stream);
321         fclose(l_file);
322         opj_destroy_codec(l_codec);
323         opj_image_destroy(l_image);
324
325         free(l_data);
326
327         // Print profiling
328         //PROFPRINT();
329
330         return 0;
331 }
332
333
334
335
336
337