struct opj_j2k: remove unused fields, and add some documentation
[openjpeg.git] / src / lib / openjp2 / ppix_manager.c
1 /*
2  * $Id: ppix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
3  *
4  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
5  * Copyright (c) 2002-2014, Professor Benoit Macq
6  * Copyright (c) 2003-2004, Yannick Verschueren
7  * Copyright (c) 2010-2011, Kaori Hagihara
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 /*! \file
33  *  \brief Modification of jpip.c from 2KAN indexer
34  */
35
36 #include "opj_includes.h"
37
38 /*
39  * Write faix box of ppix
40  *
41  * @param[in] coff offset of j2k codestream
42  * @param[in] compno    component number
43  * @param[in] cstr_info codestream information
44  * @param[in] EPHused   true if if EPH option used
45  * @param[in] j2klen    length of j2k codestream
46  * @param[in] cio       file output handle
47  * @return              length of faix box
48  */
49
50
51 int opj_write_ppix(int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused,
52                    int j2klen, opj_stream_private_t *cio,
53                    opj_event_mgr_t * p_manager)
54 {
55     OPJ_BYTE l_data_header [4];
56     int compno, i;
57     opj_jp2_box_t *box;
58     OPJ_OFF_T lenp;
59     OPJ_UINT32 len;
60
61     /*  printf("cstr_info.packno %d\n", cstr_info.packno); //NMAX? */
62
63     lenp = -1;
64     box = (opj_jp2_box_t *)opj_calloc((size_t)cstr_info.numcomps,
65                                       sizeof(opj_jp2_box_t));
66     if (box == NULL) {
67         return 0;
68     }
69     for (i = 0; i < 2; i++) {
70         if (i)
71
72         {
73             opj_stream_seek(cio, lenp, p_manager);
74         }
75
76         lenp = (OPJ_UINT32)(opj_stream_tell(cio));
77         opj_stream_skip(cio, 4, p_manager);        /* L [at the end] */
78         opj_write_bytes(l_data_header, JPIP_PPIX, 4); /* PPIX           */
79         opj_stream_write_data(cio, l_data_header, 4, p_manager);
80
81         opj_write_manf(i, cstr_info.numcomps, box, cio, p_manager);
82
83         for (compno = 0; compno < cstr_info.numcomps; compno++) {
84             box[compno].length = (OPJ_UINT32)opj_write_ppixfaix(coff, compno, cstr_info,
85                                  EPHused, j2klen, cio, p_manager);
86             box[compno].type = JPIP_FAIX;
87         }
88
89
90         len = (OPJ_UINT32)(opj_stream_tell(cio) - lenp);
91         opj_stream_seek(cio, lenp, p_manager);
92         opj_write_bytes(l_data_header, len, 4); /* L              */
93         opj_stream_write_data(cio, l_data_header, 4, p_manager);
94         opj_stream_seek(cio, lenp + len, p_manager);
95     }
96
97     opj_free(box);
98
99     return (int)len;
100 }
101
102
103
104 int opj_write_ppixfaix(int coff, int compno, opj_codestream_info_t cstr_info,
105                        OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
106                        opj_event_mgr_t * p_manager)
107 {
108     OPJ_BYTE l_data_header [8];
109     OPJ_UINT32 tileno, version, i, nmax, size_of_coding; /* 4 or 8*/
110     OPJ_UINT32 len;
111     OPJ_OFF_T lenp;
112     opj_tile_info_t *tile_Idx;
113     opj_packet_info_t packet;
114     int resno, precno, layno;
115     OPJ_UINT32 num_packet;
116     int numOfres, numOfprec, numOflayers;
117     packet.end_pos = packet.end_ph_pos = packet.start_pos = -1;
118     (void)EPHused; /* unused ? */
119
120     if (j2klen > pow(2, 32)) {
121         size_of_coding =  8;
122         version = 1;
123     } else {
124         size_of_coding = 4;
125         version = 0;
126     }
127
128     lenp = opj_stream_tell(cio);
129     opj_stream_skip(cio, 4, p_manager);         /* L [at the end]      */
130     opj_write_bytes(l_data_header, JPIP_FAIX, 4); /* FAIX */
131     opj_write_bytes(l_data_header, version, 1);
132     opj_stream_write_data(cio, l_data_header, 1,
133                           p_manager); /* Version 0 = 4 bytes */
134
135     nmax = 0;
136     for (i = 0; i <= (OPJ_UINT32)cstr_info.numdecompos[compno]; i++) {
137         nmax += (OPJ_UINT32)(cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] *
138                              cstr_info.numlayers);
139     }
140
141     opj_write_bytes(l_data_header, nmax, size_of_coding);       /* NMAX           */
142     opj_stream_write_data(cio, l_data_header, size_of_coding, p_manager);
143     opj_write_bytes(l_data_header, (OPJ_UINT32)(cstr_info.tw * cstr_info.th),
144                     size_of_coding);  /* M              */
145     opj_stream_write_data(cio, l_data_header, size_of_coding, p_manager);
146
147     for (tileno = 0; tileno < (OPJ_UINT32)(cstr_info.tw * cstr_info.th); tileno++) {
148         tile_Idx = &cstr_info.tile[ tileno];
149
150         num_packet = 0;
151         numOfres = cstr_info.numdecompos[compno] + 1;
152
153         for (resno = 0; resno < numOfres ; resno++) {
154             numOfprec = tile_Idx->pw[resno] * tile_Idx->ph[resno];
155             for (precno = 0; precno < numOfprec; precno++) {
156                 numOflayers = cstr_info.numlayers;
157                 for (layno = 0; layno < numOflayers; layno++) {
158
159                     switch (cstr_info.prog) {
160                     case OPJ_LRCP:
161                         packet = tile_Idx->packet[((layno * numOfres + resno) * cstr_info.numcomps +
162                                                                                compno) * numOfprec + precno];
163                         break;
164                     case OPJ_RLCP:
165                         packet = tile_Idx->packet[((resno * numOflayers + layno) * cstr_info.numcomps +
166                                                                                   compno) * numOfprec + precno];
167                         break;
168                     case OPJ_RPCL:
169                         packet = tile_Idx->packet[((resno * numOfprec + precno) * cstr_info.numcomps +
170                                                                                  compno) * numOflayers + layno];
171                         break;
172                     case OPJ_PCRL:
173                         packet = tile_Idx->packet[((precno * cstr_info.numcomps + compno) * numOfres +
174                                                                                            resno) * numOflayers + layno];
175                         break;
176                     case OPJ_CPRL:
177                         packet = tile_Idx->packet[((compno * numOfprec + precno) * numOfres + resno) *
178                                                                                  numOflayers + layno];
179                         break;
180                     default:
181                         fprintf(stderr, "failed to ppix indexing\n");
182                     }
183
184                     opj_write_bytes(l_data_header, (OPJ_UINT32)(packet.start_pos - coff),
185                                     size_of_coding);            /* start position */
186                     opj_stream_write_data(cio, l_data_header, size_of_coding, p_manager);
187                     opj_write_bytes(l_data_header,
188                                     (OPJ_UINT32)(packet.end_pos - packet.start_pos + 1),
189                                     size_of_coding); /* length         */
190                     opj_stream_write_data(cio, l_data_header, size_of_coding, p_manager);
191
192                     num_packet++;
193                 }
194             }
195         }
196
197         while (num_packet < nmax) {    /* PADDING */
198             opj_write_bytes(l_data_header, 0,
199                             size_of_coding); /* start position            */
200             opj_stream_write_data(cio, l_data_header, size_of_coding, p_manager);
201             opj_write_bytes(l_data_header, 0,
202                             size_of_coding); /* length                    */
203             opj_stream_write_data(cio, l_data_header, size_of_coding, p_manager);
204             num_packet++;
205         }
206     }
207
208     len = (OPJ_UINT32)(opj_stream_tell(cio) - lenp);
209     opj_stream_seek(cio, lenp, p_manager);
210     opj_write_bytes(l_data_header, len, 4); /* L  */
211     opj_stream_write_data(cio, l_data_header, 4, p_manager);
212     opj_stream_seek(cio, lenp + len, p_manager);
213
214     return (int)len;
215 }