[2.0] Backport all changes from trunk
[openjpeg.git] / tests / unit / testempty2.c
1 /*
2  * Copyright (c) 2012, Mathieu Malaterre
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 #include <assert.h>
27 #include <string.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30
31 #include "opj_config.h"
32 #include "openjpeg.h"
33
34 #define J2K_CFMT 0
35
36 void error_callback(const char *msg, void *v);
37 void warning_callback(const char *msg, void *v);
38 void info_callback(const char *msg, void *v);
39
40 void error_callback(const char *msg, void *v) {
41 (void)msg;
42 (void)v;
43 puts(msg);
44 }
45 void warning_callback(const char *msg, void *v) {
46 (void)msg;
47 (void)v;
48 puts(msg);
49 }
50 void info_callback(const char *msg, void *v) {
51 (void)msg;
52 (void)v;
53 puts(msg);
54 }
55
56 int main(int argc, char *argv[])
57 {
58   const char * v = opj_version();
59
60   const OPJ_COLOR_SPACE color_space = OPJ_CLRSPC_GRAY;
61   unsigned int numcomps = 1;
62   unsigned int i;
63   unsigned int image_width = 256;
64   unsigned int image_height = 256;
65
66   opj_cparameters_t parameters;
67
68   unsigned int subsampling_dx;
69   unsigned int subsampling_dy;
70   const char outputfile[] = "testempty2.j2k";
71
72   opj_image_cmptparm_t cmptparm;
73   opj_image_t *image;
74   opj_codec_t* l_codec = 00;
75   OPJ_BOOL bSuccess;
76   FILE *f;
77   opj_stream_t *l_stream = 00;
78   (void)argc;
79   (void)argv;
80
81   opj_set_default_encoder_parameters(&parameters);
82   parameters.cod_format = J2K_CFMT;
83   puts(v);
84   subsampling_dx = (unsigned int)parameters.subsampling_dx;
85   subsampling_dy = (unsigned int)parameters.subsampling_dy;
86   cmptparm.prec = 8;
87   cmptparm.bpp = 8;
88   cmptparm.sgnd = 0;
89   cmptparm.dx = subsampling_dx;
90   cmptparm.dy = subsampling_dy;
91   cmptparm.w = image_width;
92   cmptparm.h = image_height;
93
94   image = opj_image_create(numcomps, &cmptparm, color_space);
95   assert( image );
96
97   for (i = 0; i < image_width * image_height; i++)
98     {
99     unsigned int compno;
100     for(compno = 0; compno < numcomps; compno++)
101       {
102       image->comps[compno].data[i] = 0;
103       }
104     }
105
106   /* catch events using our callbacks and give a local context */
107   opj_set_info_handler(l_codec, info_callback,00);
108   opj_set_warning_handler(l_codec, warning_callback,00);
109   opj_set_error_handler(l_codec, error_callback,00);
110
111   l_codec = opj_create_compress(OPJ_CODEC_J2K);
112   opj_set_info_handler(l_codec, info_callback,00);
113   opj_set_warning_handler(l_codec, warning_callback,00);
114   opj_set_error_handler(l_codec, error_callback,00);
115
116   opj_setup_encoder(l_codec, &parameters, image);
117
118   strcpy(parameters.outfile, outputfile);
119   f = fopen(parameters.outfile, "wb");
120   assert( f );
121
122   l_stream = opj_stream_create_default_file_stream(f,OPJ_FALSE);
123   if( !l_stream )
124     {
125     fprintf( stderr, "Something went wrong during creation of stream\n" );
126   fclose(f);
127     opj_destroy_codec(l_codec);
128     opj_image_destroy(image);
129     opj_stream_destroy(l_stream);
130     return 1;
131     }
132   assert(l_stream);
133   bSuccess = opj_start_compress(l_codec,image,l_stream);
134   if( !bSuccess )
135     {
136   fclose(f);
137     opj_stream_destroy(l_stream);
138     opj_destroy_codec(l_codec);
139     opj_image_destroy(image);
140     return 0;
141     }
142
143   assert( bSuccess );
144   bSuccess = opj_encode(l_codec, l_stream);
145   assert( bSuccess );
146   bSuccess = opj_end_compress(l_codec, l_stream);
147   assert( bSuccess );
148
149   opj_stream_destroy(l_stream);
150   fclose(f);
151
152   opj_destroy_codec(l_codec);
153   opj_image_destroy(image);
154
155
156   /* read back the generated file */
157 {
158   FILE *fsrc = fopen(outputfile, "rb");
159   opj_codec_t* d_codec = 00;
160   opj_dparameters_t dparameters;
161   assert( fsrc );
162
163   d_codec = opj_create_decompress(OPJ_CODEC_J2K);
164   opj_set_info_handler(d_codec, info_callback,00);
165   opj_set_warning_handler(d_codec, warning_callback,00);
166   opj_set_error_handler(d_codec, error_callback,00);
167
168   bSuccess = opj_setup_decoder(d_codec, &dparameters);
169   assert( bSuccess );
170
171   l_stream = opj_stream_create_default_file_stream(fsrc,1);
172   assert( l_stream );
173
174   bSuccess = opj_read_header(l_stream, d_codec, &image);
175   assert( bSuccess );
176
177   bSuccess = opj_decode(l_codec, l_stream, image);
178   assert( bSuccess );
179
180   bSuccess = opj_end_decompress(l_codec, l_stream);
181   assert( bSuccess );
182
183   opj_stream_destroy(l_stream);
184   fclose(fsrc);
185   opj_destroy_codec(d_codec);
186
187   opj_image_destroy(image);
188 }
189
190   puts( "end" );
191   return 0;
192 }