2 * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
37 #define _stricmp strcasecmp
38 #define _strnicmp strncasecmp
41 #include "opj_config.h"
48 #define IMAGE_WIDTH 2000
49 #define IMAGE_HEIGHT 2000
50 #define TILE_WIDTH 1000
51 #define TILE_HEIGHT 1000
53 #define OUTPUT_FILE "test.j2k"
55 /* -------------------------------------------------------------------------- */
58 sample error callback expecting a FILE* client object
60 void error_callback_file(const char *msg, void *client_data) {
61 FILE *stream = (FILE*)client_data;
62 fprintf(stream, "[ERROR] %s", msg);
65 sample warning callback expecting a FILE* client object
67 void warning_callback_file(const char *msg, void *client_data) {
68 FILE *stream = (FILE*)client_data;
69 fprintf(stream, "[WARNING] %s", msg);
72 sample error debug callback expecting no client object
74 void error_callback(const char *msg, void *client_data) {
76 fprintf(stdout, "[ERROR] %s", msg);
79 sample warning debug callback expecting no client object
81 void warning_callback(const char *msg, void *client_data) {
83 fprintf(stdout, "[WARNING] %s", msg);
86 sample debug callback expecting no client object
88 void info_callback(const char *msg, void *client_data) {
90 fprintf(stdout, "[INFO] %s", msg);
93 /* -------------------------------------------------------------------------- */
97 opj_cparameters_t l_param;
98 opj_codec_t * l_codec;
99 opj_image_t * l_image;
100 opj_image_cmptparm_t l_params [NUM_COMPS];
102 opj_stream_t * l_stream;
103 OPJ_UINT32 l_nb_tiles = (IMAGE_WIDTH/TILE_WIDTH) * (IMAGE_HEIGHT/TILE_HEIGHT);
104 OPJ_UINT32 l_data_size = TILE_WIDTH * TILE_HEIGHT * NUM_COMPS * (COMP_PREC/8);
107 const OPJ_FLOAT32 l_mct [] =
114 const OPJ_INT32 l_offsets [] =
120 opj_image_cmptparm_t * l_current_param_ptr;
125 l_data = (OPJ_BYTE*) malloc(TILE_WIDTH * TILE_HEIGHT * NUM_COMPS * (COMP_PREC/8) * sizeof(OPJ_BYTE));
127 fprintf(stdout, "Encoding random values -> keep in mind that this is very hard to compress\n");
128 for (i=0;i<l_data_size;++i) {
132 opj_set_default_encoder_parameters(&l_param);
133 /** you may here add custom encoding parameters */
134 /* rate specifications */
135 /** number of quality layers in the stream */
136 l_param.tcp_numlayers = 1;
137 l_param.cp_fixed_quality = 1;
138 l_param.tcp_distoratio[0] = 20;
139 /* is using others way of calculation */
140 /* l_param.cp_disto_alloc = 1 or l_param.cp_fixed_alloc = 1 */
141 /* l_param.tcp_rates[0] = ... */
144 /* tile definitions parameters */
145 /* position of the tile grid aligned with the image */
148 /* tile size, we are using tile based encoding */
149 l_param.tile_size_on = OPJ_TRUE;
150 l_param.cp_tdx = TILE_WIDTH;
151 l_param.cp_tdy = TILE_HEIGHT;
153 /* use irreversible encoding ?*/
154 l_param.irreversible = 1;
156 /* do not bother with mct, the rsiz is set when calling opj_set_MCT*/
157 /*l_param.cp_rsiz = STD_RSIZ;*/
160 /*l_param.cp_cinema = 0;*/
162 /* no not bother using SOP or EPH markers, do not use custom size precinct */
163 /* number of precincts to specify */
164 /* l_param.csty = 0;*/
165 /* l_param.res_spec = ... */
166 /* l_param.prch_init[i] = .. */
167 /* l_param.prcw_init[i] = .. */
170 /* do not use progression order changes */
171 /*l_param.numpocs = 0;*/
172 /* l_param.POC[i].... */
174 /* do not restrain the size for a component.*/
175 /* l_param.max_comp_size = 0; */
177 /** block encoding style for each component, do not use at the moment */
178 /** J2K_CCP_CBLKSTY_TERMALL, J2K_CCP_CBLKSTY_LAZY, J2K_CCP_CBLKSTY_VSC, J2K_CCP_CBLKSTY_SEGSYM, J2K_CCP_CBLKSTY_RESET */
179 /* l_param.mode = 0;*/
181 /** number of resolutions */
182 l_param.numresolution = 6;
184 /** progression order to use*/
185 /** LRCP, RLCP, RPCL, PCRL, CPRL */
186 l_param.prog_order = LRCP;
188 /** no "region" of interest, more precisally component */
189 /* l_param.roi_compno = -1; */
190 /* l_param.roi_shift = 0; */
192 /* we are not using multiple tile parts for a tile. */
193 /* l_param.tp_on = 0; */
194 /* l_param.tp_flag = 0; */
196 /* if we are using mct */
198 opj_set_MCT(&l_param,l_mct,l_offsets,NUM_COMPS);
202 /* image definition */
203 l_current_param_ptr = l_params;
204 for (i=0;i<NUM_COMPS;++i) {
205 /* do not bother bpp useless */
206 /*l_current_param_ptr->bpp = COMP_PREC;*/
207 l_current_param_ptr->dx = 1;
208 l_current_param_ptr->dy = 1;
210 l_current_param_ptr->h = IMAGE_HEIGHT;
211 l_current_param_ptr->w = IMAGE_WIDTH;
213 l_current_param_ptr->sgnd = 0;
214 l_current_param_ptr->prec = COMP_PREC;
216 l_current_param_ptr->x0 = 0;
217 l_current_param_ptr->y0 = 0;
219 ++l_current_param_ptr;
222 l_codec = opj_create_compress_v2(CODEC_J2K);
227 /* catch events using our callbacks and give a local context */
228 //opj_set_info_handler(l_codec, info_callback,00);
229 //opj_set_warning_handler(l_codec, warning_callback,00);
230 //opj_set_error_handler(l_codec, error_callback,00);
232 l_image = opj_image_tile_create(NUM_COMPS,l_params,CLRSPC_SRGB);
234 opj_destroy_codec(l_codec);
240 l_image->x1 = IMAGE_WIDTH;
241 l_image->y1 = IMAGE_HEIGHT;
242 l_image->color_space = CLRSPC_SRGB;
244 if (! opj_setup_encoder_v2(l_codec,&l_param,l_image)) {
245 opj_destroy_codec(l_codec);
246 opj_image_destroy(l_image);
250 l_file = fopen(OUTPUT_FILE,"wb");
252 opj_destroy_codec(l_codec);
253 opj_image_destroy(l_image);
257 l_stream = opj_stream_create_default_file_stream(l_file, OPJ_FALSE);
259 if (! opj_start_compress(l_codec,l_image,l_stream)) {
260 opj_stream_destroy(l_stream);
262 opj_destroy_codec(l_codec);
263 opj_image_destroy(l_image);
267 for (i=0;i<l_nb_tiles;++i) {
268 if (! opj_write_tile(l_codec,i,l_data,l_data_size,l_stream)) {
269 opj_stream_destroy(l_stream);
271 opj_destroy_codec(l_codec);
272 opj_image_destroy(l_image);
277 if (! opj_end_compress(l_codec,l_stream)) {
278 opj_stream_destroy(l_stream);
280 opj_destroy_codec(l_codec);
281 opj_image_destroy(l_image);
285 opj_stream_destroy(l_stream);
287 opj_destroy_codec(l_codec);
288 opj_image_destroy(l_image);