1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The copyright in this software is being made available under the 2-clauses
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * BSD License, included below. This software may be subject to other third
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * party and contributor rights, including patent rights, and no such rights
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are granted under this license.
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2014, Professor Benoit Macq
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2001-2003, David Janssens
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2003, Yannick Verschueren
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2003-2007, Francois-Olivier Devaux
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2003-2014, Antonin Descampe
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2005, Herve Drolon, FreeImage Team
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2012, CS Systemes d'Information, France
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * All rights reserved.
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Redistribution and use in source and binary forms, with or without
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * modification, are permitted provided that the following conditions
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are met:
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1. Redistributions of source code must retain the above copyright
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    notice, this list of conditions and the following disclaimer.
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 2. Redistributions in binary form must reproduce the above copyright
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    notice, this list of conditions and the following disclaimer in the
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    documentation and/or other materials provided with the distribution.
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSSIBILITY OF SUCH DAMAGE.
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "opj_includes.h"
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @defgroup T2 T2 - Implementation of a tier-2 coding */
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @name Local static functions */
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n);
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio);
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovVariable length code for signalling delta Zil (truncation point)
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param bio  Bit Input/Output component
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param n    delta Zil
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n);
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio);
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovEncode a packet of a tile to a destination buffer
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param tileno Number of the tile encoded
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param tile Tile for which to write the packets
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param tcp Tile coding parameters
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param pi Packet identity
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param dest Destination buffer
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param p_data_written   FIXME DOC
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param len Length of the destination buffer
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param cstr_info Codestream information structure
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@return
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t2_encode_packet(   OPJ_UINT32 tileno,
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_tcd_tile_t *tile,
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_tcp_t *tcp,
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_pi_iterator_t *pi,
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_BYTE *dest,
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_UINT32 * p_data_written,
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_UINT32 len,
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_codestream_info_t *cstr_info);
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDecode a packet of a tile from a source buffer
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param t2 T2 handle
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param tile Tile for which to write the packets
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param tcp Tile coding parameters
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param pi Packet identity
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param src Source buffer
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param data_read   FIXME DOC
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param max_length  FIXME DOC
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param pack_info Packet information
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@return  FIXME DOC
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t2_decode_packet(   opj_t2_t* t2,
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_tcd_tile_t *tile,
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_tcp_t *tcp,
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_pi_iterator_t *pi,
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_BYTE *src,
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_UINT32 * data_read,
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_UINT32 max_length,
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_packet_info_t *pack_info,
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_mgr_t *p_manager);
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcd_tile_t *p_tile,
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcp_t *p_tcp,
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_pi_iterator_t *p_pi,
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE *p_src,
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 * p_data_read,
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 p_max_length,
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_packet_info_t *p_pack_info,
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_event_mgr_t *p_manager);
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t2_read_packet_header(  opj_t2_t* p_t2,
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            opj_tcd_tile_t *p_tile,
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            opj_tcp_t *p_tcp,
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            opj_pi_iterator_t *p_pi,
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            OPJ_BOOL * p_is_data_present,
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            OPJ_BYTE *p_src_data,
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            OPJ_UINT32 * p_data_read,
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            OPJ_UINT32 p_max_length,
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            opj_packet_info_t *p_pack_info,
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            opj_event_mgr_t *p_manager);
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_tcd_tile_t *p_tile,
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_pi_iterator_t *p_pi,
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_BYTE *p_src_data,
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_UINT32 * p_data_read,
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_UINT32 p_max_length,
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_packet_info_t *pack_info,
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_mgr_t *p_manager);
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_tcd_tile_t *p_tile,
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_pi_iterator_t *p_pi,
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_UINT32 * p_data_read,
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        OPJ_UINT32 p_max_length,
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_packet_info_t *pack_info,
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_mgr_t *p_manager);
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param cblk
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param index
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param cblksty
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param first
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t2_init_seg(    opj_tcd_cblk_dec_t* cblk,
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 index,
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 cblksty,
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 first);
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* #define RESTART 0x04 */
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n) {
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (--n >= 0) {
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_write(bio, 1, 1);
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_bio_write(bio, 0, 1);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio)
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OPJ_UINT32 n = 0;
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (opj_bio_read(bio, 1)) {
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	    ++n;
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return n;
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n) {
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (n == 1) {
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_write(bio, 0, 1);
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (n == 2) {
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_write(bio, 2, 2);
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (n <= 5) {
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_write(bio, 0xc | (n - 3), 4);
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (n <= 36) {
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_write(bio, 0x1e0 | (n - 6), 9);
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (n <= 164) {
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_write(bio, 0xff80 | (n - 37), 16);
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio) {
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 n;
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!opj_bio_read(bio, 1))
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 1;
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!opj_bio_read(bio, 1))
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 2;
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((n = opj_bio_read(bio, 2)) != 3)
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return (3 + n);
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((n = opj_bio_read(bio, 5)) != 31)
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return (6 + n);
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (37 + opj_bio_read(bio, 7));
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_t2_encode_packets( opj_t2_t* p_t2,
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 p_tile_no,
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcd_tile_t *p_tile,
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 p_maxlayers,
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE *p_dest,
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 * p_data_written,
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 p_max_len,
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_codestream_info_t *cstr_info,
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 p_tp_num,
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 p_tp_pos,
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 p_pino,
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                J2K_T2_MODE p_t2_mode)
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BYTE *l_current_data = p_dest;
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_bytes = 0;
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 compno;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 poc;
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_pi_iterator_t *l_pi = 00;
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_pi_iterator_t *l_current_pi = 00;
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_image_t *l_image = p_t2->image;
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_cp_t *l_cp = p_t2->cp;
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no];
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        OPJ_UINT32 pocno = (l_cp->rsiz == OPJ_PROFILE_CINEMA_4K)? 2: 1;
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ? l_image->numcomps : 1;
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode);
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!l_pi) {
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return OPJ_FALSE;
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        * p_data_written = 0;
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p_t2_mode == THRESH_CALC ){ /* Calculating threshold */
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_current_pi = l_pi;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for     (compno = 0; compno < l_max_comp; ++compno) {
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 l_comp_len = 0;
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_current_pi = l_pi;
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        for (poc = 0; poc < pocno ; ++poc) {
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 l_tp_num = compno;
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* TODO MSD : check why this function cannot fail (cf. v1) */
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_pi_create_encode(l_pi, l_cp,p_tile_no,poc,l_tp_num,p_tp_pos,p_t2_mode);
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    /* TODO ADE : add an error */
252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    opj_pi_destroy(l_pi, l_nb_pocs);
253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    return OPJ_FALSE;
254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                }
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                while (opj_pi_next(l_current_pi)) {
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (l_current_pi->layno < p_maxlayers) {
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                l_nb_bytes = 0;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                        opj_pi_destroy(l_pi, l_nb_pocs);
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                        return OPJ_FALSE;
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                }
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                l_comp_len += l_nb_bytes;
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                l_current_data += l_nb_bytes;
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                p_max_len -= l_nb_bytes;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                * p_data_written += l_nb_bytes;
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (l_cp->m_specific_param.m_enc.m_max_comp_size) {
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                opj_pi_destroy(l_pi, l_nb_pocs);
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                return OPJ_FALSE;
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++l_current_pi;
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        else {  /* t2_mode == FINAL_PASS  */
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_pi_create_encode(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode);
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_current_pi = &l_pi[p_pino];
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    /* TODO ADE : add an error */
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    opj_pi_destroy(l_pi, l_nb_pocs);
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    return OPJ_FALSE;
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                while (opj_pi_next(l_current_pi)) {
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (l_current_pi->layno < p_maxlayers) {
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_nb_bytes=0;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_pi_destroy(l_pi, l_nb_pocs);
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        return OPJ_FALSE;
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_current_data += l_nb_bytes;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                p_max_len -= l_nb_bytes;
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                * p_data_written += l_nb_bytes;
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* INDEX >> */
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if(cstr_info) {
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if(cstr_info->index_write) {
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                if (!cstr_info->packno) {
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                        info_PK->start_pos = info_TL->end_header + 1;
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                } else {
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                        info_PK->start_pos = ((l_cp->m_specific_param.m_enc.m_tp_on | l_tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                }
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                                                                                                                                                                                                                   to start of packet is incremented by value of start of packet*/
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        cstr_info->packno++;
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* << INDEX */
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++p_tile->packno;
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_pi_destroy(l_pi, l_nb_pocs);
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* see issue 80 */
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JAS_FPRINTF fprintf
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* issue 290 */
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_null_jas_fprintf(FILE* file, const char * format, ...)
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)file;
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)format;
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JAS_FPRINTF opj_null_jas_fprintf
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2,
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 p_tile_no,
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcd_tile_t *p_tile,
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE *p_src,
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 * p_data_read,
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 p_max_len,
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                opj_codestream_index_t *p_cstr_index,
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                opj_event_mgr_t *p_manager)
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BYTE *l_current_data = p_src;
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_pi_iterator_t *l_pi = 00;
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 pino;
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_image_t *l_image = p_t2->image;
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_cp_t *l_cp = p_t2->cp;
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_bytes_read;
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_pi_iterator_t *l_current_pi = 00;
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TODO_MSD
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 curtp = 0;
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 tp_start_packno;
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_packet_info_t *l_pack_info = 00;
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_image_comp_t* l_img_comp = 00;
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_ARG_NOT_USED(p_cstr_index);
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TODO_MSD
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p_cstr_index) {
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* create a packet iterator */
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no);
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!l_pi) {
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return OPJ_FALSE;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_current_pi = l_pi;
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for     (pino = 0; pino <= l_tcp->numpocs; ++pino) {
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                /* if the resolution needed is too low, one dim of the tilec could be equal to zero
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 * and no packets are used to decode this resolution and
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 * and no l_img_comp->resno_decoded are computed
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 */
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                OPJ_BOOL* first_pass_failed = NULL;
397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    /* TODO ADE : add an error */
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    opj_pi_destroy(l_pi, l_nb_pocs);
401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    return OPJ_FALSE;
402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!first_pass_failed)
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                {
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    opj_pi_destroy(l_pi,l_nb_pocs);
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return OPJ_FALSE;
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                while (opj_pi_next(l_current_pi)) {
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  JAS_FPRINTF( stderr, "packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\n\n",
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno, l_current_pi->precno, l_current_pi->layno );
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (l_tcp->num_layers_to_decode > l_current_pi->layno
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        && l_current_pi->resno < p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_nb_bytes_read = 0;
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                first_pass_failed[l_current_pi->compno] = OPJ_FALSE;
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                if (! opj_t2_decode_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info, p_manager)) {
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_pi_destroy(l_pi,l_nb_pocs);
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_free(first_pass_failed);
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        return OPJ_FALSE;
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_img_comp = &(l_image->comps[l_current_pi->compno]);
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno, l_img_comp->resno_decoded);
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        else {
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_nb_bytes_read = 0;
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                if (! opj_t2_skip_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info, p_manager)) {
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_pi_destroy(l_pi,l_nb_pocs);
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_free(first_pass_failed);
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        return OPJ_FALSE;
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (first_pass_failed[l_current_pi->compno]) {
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_img_comp = &(l_image->comps[l_current_pi->compno]);
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (l_img_comp->resno_decoded == 0)
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        l_img_comp->resno_decoded = p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_current_data += l_nb_bytes_read;
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        p_max_len -= l_nb_bytes_read;
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* INDEX >> */
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TODO_MSD
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(p_cstr_info) {
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                tp_start_packno = 0;
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (!p_cstr_info->packno) {
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        info_PK->start_pos = info_TL->end_header + 1;
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                } else if (info_TL->packet[p_cstr_info->packno-1].end_pos >= (OPJ_INT32)p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos){ /* New tile part */
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part */
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        tp_start_packno = p_cstr_info->packno;
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        curtp++;
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header+1;
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                } else {
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno - 1].end_pos + 1;
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance */
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++p_cstr_info->packno;
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* << INDEX */
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ++l_current_pi;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_free(first_pass_failed);
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* INDEX >> */
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TODO_MSD
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                (p_cstr_info) {
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part */
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* << INDEX */
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* don't forget to release pi */
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_pi_destroy(l_pi,l_nb_pocs);
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *p_data_read = (OPJ_UINT32)(l_current_data - p_src);
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Creates a Tier 2 handle
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param       p_image         Source or destination image
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param       p_cp            Image coding parameters.
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return              a new T2 handle if successful, NULL otherwise.
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovopj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp)
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* create the t2 structure */
503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        opj_t2_t *l_t2 = (opj_t2_t*)opj_calloc(1,sizeof(opj_t2_t));
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!l_t2) {
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_t2->image = p_image;
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_t2->cp = p_cp;
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return l_t2;
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_t2_destroy(opj_t2_t *t2) {
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(t2) {
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_free(t2);
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_t2_decode_packet(  opj_t2_t* p_t2,
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcd_tile_t *p_tile,
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcp_t *p_tcp,
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_pi_iterator_t *p_pi,
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE *p_src,
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 * p_data_read,
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 p_max_length,
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                opj_packet_info_t *p_pack_info,
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                opj_event_mgr_t *p_manager)
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BOOL l_read_data;
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_bytes_read = 0;
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_total_bytes_read = 0;
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *p_data_read = 0;
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info, p_manager)) {
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return OPJ_FALSE;
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        p_src += l_nb_bytes_read;
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_nb_total_bytes_read += l_nb_bytes_read;
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        p_max_length -= l_nb_bytes_read;
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* we should read data for the packet */
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (l_read_data) {
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_bytes_read = 0;
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                if (! opj_t2_read_packet_data(p_t2,p_tile,p_pi,p_src,&l_nb_bytes_read,p_max_length,p_pack_info, p_manager)) {
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        return OPJ_FALSE;
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_total_bytes_read += l_nb_bytes_read;
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *p_data_read = l_nb_total_bytes_read;
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_t2_encode_packet(  OPJ_UINT32 tileno,
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcd_tile_t * tile,
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcp_t * tcp,
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_pi_iterator_t *pi,
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE *dest,
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 * p_data_written,
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 length,
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_codestream_info_t *cstr_info)
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 bandno, cblkno;
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BYTE* c = dest;
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_bytes;
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 compno = pi->compno;     /* component value */
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 resno  = pi->resno;      /* resolution level value */
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 precno = pi->precno;     /* precinct value */
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 layno  = pi->layno;      /* quality layer value */
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_blocks;
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_band_t *band = 00;
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_cblk_enc_t* cblk = 00;
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_pass_t *pass = 00;
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_bio_t *bio = 00;    /* BIO component */
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* <SOP 0xff91> */
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (tcp->csty & J2K_CP_CSTY_SOP) {
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[0] = 255;
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[1] = 145;
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[2] = 0;
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[3] = 4;
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[4] = (tile->packno % 65536) / 256;
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[5] = (tile->packno % 65536) % 256;
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[5] = tile->packno & 0xff;
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c += 6;
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                length -= 6;
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* </SOP> */
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!layno) {
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                band = res->bands;
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for(bandno = 0; bandno < res->numbands; ++bandno) {
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_precinct_t *prc = &band->precincts[precno];
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tgt_reset(prc->incltree);
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tgt_reset(prc->imsbtree);
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_nb_blocks = prc->cw * prc->ch;
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        for     (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                cblk = &prc->cblks.enc[cblkno];
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                cblk->numpasses = 0;
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++band;
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bio = opj_bio_create();
625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (!bio) {
626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                /* FIXME event manager error callback */
627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return OPJ_FALSE;
628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_bio_init_enc(bio, c, length);
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_bio_write(bio, 1, 1);           /* Empty header bit */
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* Writing Packet header */
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        band = res->bands;
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (bandno = 0; bandno < res->numbands; ++bandno)      {
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_tcd_precinct_t *prc = &band->precincts[precno];
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_blocks = prc->cw * prc->ch;
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                cblk = prc->cblks.enc;
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_layer_t *layer = &cblk->layers[layno];
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!cblk->numpasses && layer->numpasses) {
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++cblk;
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                cblk = prc->cblks.enc;
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_layer_t *layer = &cblk->layers[layno];
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 increment = 0;
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 nump = 0;
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 len = 0, passno;
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 l_nb_passes;
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* cblk inclusion bits */
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!cblk->numpasses) {
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } else {
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_bio_write(bio, layer->numpasses != 0, 1);
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* if cblk not included, go to the next cblk  */
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!layer->numpasses) {
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++cblk;
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                continue;
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* if first instance of cblk --> zero bit-planes information */
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!cblk->numpasses) {
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                cblk->numlenbits = 3;
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* number of coding passes included */
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t2_putnumpasses(bio, layer->numpasses);
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_nb_passes = cblk->numpasses + layer->numpasses;
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        pass = cblk->passes +  cblk->numpasses;
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* computation of the increase of the length indicator and insertion in the header     */
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++nump;
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                len += pass->len;
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment, opj_int_floorlog2((OPJ_INT32)len) + 1
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        len = 0;
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        nump = 0;
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++pass;
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t2_putcommacode(bio, (OPJ_INT32)increment);
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* computation of the new Length indicator */
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        cblk->numlenbits += increment;
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        pass = cblk->passes +  cblk->numpasses;
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* insertion of the codeword segment length */
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                nump++;
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                len += pass->len;
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_bio_write(bio, (OPJ_UINT32)len, cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        len = 0;
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        nump = 0;
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++pass;
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++cblk;
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ++band;
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!opj_bio_flush(bio)) {
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_destroy(bio);
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return OPJ_FALSE;               /* modified to eliminate longjmp !! */
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c += l_nb_bytes;
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        length -= l_nb_bytes;
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_bio_destroy(bio);
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* <EPH 0xff92> */
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (tcp->csty & J2K_CP_CSTY_EPH) {
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[0] = 255;
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c[1] = 146;
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c += 2;
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                length -= 2;
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* </EPH> */
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* << INDEX */
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* End of packet header position. Currently only represents the distance to start of packet
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           Will be updated later by incrementing with packet start value*/
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(cstr_info && cstr_info->index_write) {
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* INDEX >> */
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* Writing the packet body */
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        band = res->bands;
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (bandno = 0; bandno < res->numbands; bandno++) {
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_tcd_precinct_t *prc = &band->precincts[precno];
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_blocks = prc->cw * prc->ch;
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                cblk = prc->cblks.enc;
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_layer_t *layer = &cblk->layers[layno];
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!layer->numpasses) {
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++cblk;
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                continue;
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (layer->len > length) {
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                return OPJ_FALSE;
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        memcpy(c, layer->data, layer->len);
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        cblk->numpasses += layer->numpasses;
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        c += layer->len;
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        length -= layer->len;
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* << INDEX */
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(cstr_info && cstr_info->index_write) {
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                info_PK->disto += layer->disto;
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (cstr_info->D_max < info_PK->disto) {
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        cstr_info->D_max = info_PK->disto;
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++cblk;
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* INDEX >> */
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ++band;
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        assert( c >= dest );
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        * p_data_written += (OPJ_UINT32)(c - dest);
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcd_tile_t *p_tile,
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcp_t *p_tcp,
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_pi_iterator_t *p_pi,
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE *p_src,
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 * p_data_read,
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 p_max_length,
803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_packet_info_t *p_pack_info,
804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_event_mgr_t *p_manager)
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BOOL l_read_data;
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_bytes_read = 0;
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_total_bytes_read = 0;
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *p_data_read = 0;
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info, p_manager)) {
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return OPJ_FALSE;
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        p_src += l_nb_bytes_read;
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_nb_total_bytes_read += l_nb_bytes_read;
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        p_max_length -= l_nb_bytes_read;
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* we should read data for the packet */
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (l_read_data) {
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_bytes_read = 0;
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                if (! opj_t2_skip_packet_data(p_t2,p_tile,p_pi,&l_nb_bytes_read,p_max_length,p_pack_info, p_manager)) {
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        return OPJ_FALSE;
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_total_bytes_read += l_nb_bytes_read;
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *p_data_read = l_nb_total_bytes_read;
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcd_tile_t *p_tile,
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcp_t *p_tcp,
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_pi_iterator_t *p_pi,
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BOOL * p_is_data_present,
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE *p_src_data,
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 * p_data_read,
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 p_max_length,
844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_packet_info_t *p_pack_info,
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_event_mgr_t *p_manager)
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* loop */
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 bandno, cblkno;
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_code_blocks;
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_remaining_length;
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_header_length;
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 * l_modified_length_ptr = 00;
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BYTE *l_current_data = p_src_data;
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_cp_t *l_cp = p_t2->cp;
856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_bio_t *l_bio = 00;  /* BIO component */
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_band_t *l_band = 00;
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_cblk_dec_t* l_cblk = 00;
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BYTE *l_header_data = 00;
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BYTE **l_header_data_start = 00;
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_present;
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p_pi->layno == 0) {
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_band = l_res->bands;
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                /* reset tagtrees */
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (bandno = 0; bandno < l_res->numbands; ++bandno) {
871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {
874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tgt_reset(l_prc->incltree);
875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tgt_reset(l_prc->imsbtree);
876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk = l_prc->cblks.dec;
877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_nb_code_blocks = l_prc->cw * l_prc->ch;
879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        l_cblk->numsegs = 0;
881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        l_cblk->real_num_segs = 0;
882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_cblk;
883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++l_band;
887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* SOP markers */
891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p_tcp->csty & J2K_CP_CSTY_SOP) {
893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (p_max_length < 6) {
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann												opj_event_msg(p_manager, EVT_WARNING, "Not enough space for expected SOP marker\n");
895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        opj_event_msg(p_manager, EVT_WARNING, "Expected SOP marker\n");
897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_current_data += 6;
899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                /** TODO : check the Nsop value */
902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /*
905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        This part deal with this caracteristic
907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        step 1: Read packet header in the saved structure
908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        step 2: Return to codestream for decoding
909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        */
910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_bio = opj_bio_create();
912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (! l_bio) {
913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return OPJ_FALSE;
914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (l_cp->ppm == 1) { /* PPM */
917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_header_data_start = &l_cp->ppm_data;
918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_header_data = *l_header_data_start;
919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_modified_length_ptr = &(l_cp->ppm_len);
920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        else if (p_tcp->ppt == 1) { /* PPT */
923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_header_data_start = &(p_tcp->ppt_data);
924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_header_data = *l_header_data_start;
925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_modified_length_ptr = &(p_tcp->ppt_len);
926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        else {  /* Normal Case */
928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_header_data_start = &(l_current_data);
929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_header_data = *l_header_data_start;
930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_remaining_length = (OPJ_UINT32)(p_src_data+p_max_length-l_header_data);
931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_modified_length_ptr = &(l_remaining_length);
932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_bio_init_dec(l_bio, l_header_data,*l_modified_length_ptr);
935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_present = opj_bio_read(l_bio, 1);
937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        JAS_FPRINTF(stderr, "present=%d \n", l_present );
938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!l_present) {
939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            /* TODO MSD: no test to control the output of this function*/
940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_inalign(l_bio);
941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_header_data += opj_bio_numbytes(l_bio);
942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_destroy(l_bio);
943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                /* EPH markers */
945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (p_tcp->csty & J2K_CP_CSTY_EPH) {
946e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data - *l_header_data_start)) < 2U) {
947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                opj_event_msg(p_manager, EVT_WARNING, "Not enough space for expected EPH marker\n");
948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } else {
951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_header_data += 2;
952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *l_modified_length_ptr -= l_header_length;
957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *l_header_data_start += l_header_length;
958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                /* << INDEX */
960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                /* End of packet header position. Currently only represents the distance to start of packet
961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   Will be updated later by incrementing with packet start value */
962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (p_pack_info) {
963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                /* INDEX >> */
966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                * p_is_data_present = OPJ_FALSE;
968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return OPJ_TRUE;
970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_band = l_res->bands;
973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++l_band;
978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        continue;
979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_code_blocks = l_prc->cw * l_prc->ch;
982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_cblk = l_prc->cblks.dec;
983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 l_included,l_increment, l_segno;
985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_INT32 n;
986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* if cblk not yet included before --> inclusion tagtree */
988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!l_cblk->numsegs) {
989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno, (OPJ_INT32)(p_pi->layno + 1));
990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* else one bit */
991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        else {
993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_included = opj_bio_read(l_bio, 1);
994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* if cblk not included */
997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!l_included) {
998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->numnewpasses = 0;
999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++l_cblk;
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                JAS_FPRINTF(stderr, "included=%d \n", l_included);
1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                continue;
1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* if cblk not yet included --> zero-bitplane tagtree */
1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!l_cblk->numsegs) {
1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 i = 0;
1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++i;
1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->numlenbits = 3;
1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* number of coding passes */
1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_increment = opj_t2_getcommacode(l_bio);
1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* length indicator increment */
1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_cblk->numlenbits += l_increment;
1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_segno = 0;
1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!l_cblk->numsegs) {
1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_bio_destroy(l_bio);
1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        return OPJ_FALSE;
1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        else {
1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_segno = l_cblk->numsegs - 1;
1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_segno;
1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                opj_bio_destroy(l_bio);
1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                return OPJ_FALSE;
1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        n = (OPJ_INT32)l_cblk->numnewpasses;
1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        do {
1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);
1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + opj_uint_floorlog2(l_cblk->segs[l_segno].numnewpasses));
1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n", l_included, l_cblk->segs[l_segno].numnewpasses, l_increment, l_cblk->segs[l_segno].newlen );
1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (n > 0) {
1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_segno;
1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                opj_bio_destroy(l_bio);
1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                return OPJ_FALSE;
1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } while (n > 0);
1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++l_cblk;
1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ++l_band;
1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!opj_bio_inalign(l_bio)) {
1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_bio_destroy(l_bio);
1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return OPJ_FALSE;
1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_header_data += opj_bio_numbytes(l_bio);
1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_bio_destroy(l_bio);
1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* EPH markers */
1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p_tcp->csty & J2K_CP_CSTY_EPH) {
1074e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data - *l_header_data_start)) < 2U) {
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        opj_event_msg(p_manager, EVT_WARNING, "Not enough space for expected EPH marker\n");
1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_header_data += 2;
1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        JAS_FPRINTF( stderr, "hdrlen=%d \n", l_header_length );
1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        JAS_FPRINTF( stderr, "packet body\n");
1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *l_modified_length_ptr -= l_header_length;
1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *l_header_data_start += l_header_length;
1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* << INDEX */
1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* End of packet header position. Currently only represents the distance to start of packet
1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         Will be updated later by incrementing with packet start value */
1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p_pack_info) {
1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* INDEX >> */
1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *p_is_data_present = OPJ_TRUE;
1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_t2_read_packet_data(   opj_t2_t* p_t2,
1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcd_tile_t *p_tile,
1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_pi_iterator_t *p_pi,
1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE *p_src_data,
1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 * p_data_read,
1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 p_max_length,
1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_packet_info_t *pack_info,
1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_event_mgr_t* p_manager)
1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 bandno, cblkno;
1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_code_blocks;
1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_BYTE *l_current_data = p_src_data;
1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_band_t *l_band = 00;
1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_cblk_dec_t* l_cblk = 00;
1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_ARG_NOT_USED(p_t2);
1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_ARG_NOT_USED(pack_info);
1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_band = l_res->bands;
1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++l_band;
1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        continue;
1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_code_blocks = l_prc->cw * l_prc->ch;
1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_cblk = l_prc->cblks.dec;
1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_seg_t *l_seg = 00;
1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!l_cblk->numnewpasses) {
1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* nothing to do */
1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++l_cblk;
1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                continue;
1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!l_cblk->numsegs) {
1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_seg = l_cblk->segs;
1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++l_cblk->numsegs;
1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->data_current_size = 0;
1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        else {
1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (l_seg->numpasses == l_seg->maxpasses) {
1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_seg;
1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_cblk->numsegs;
1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        do {
1158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */
1159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                if ((((OPJ_SIZE_T)l_current_data + (OPJ_SIZE_T)l_seg->newlen) < (OPJ_SIZE_T)l_current_data) || (l_current_data + l_seg->newlen > p_src_data + p_max_length)) {
1160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_msg(p_manager, EVT_ERROR, "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann																								l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        return OPJ_FALSE;
1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL
1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* we need here a j2k handle to verify if making a check to
1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        the validity of cblocks parameters is selected from user (-W) */
1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* let's check that we are not exceeding */
1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if ((l_cblk->len + l_seg->newlen) > 8192) {
1171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_msg(p_manager, EVT_WARNING,
1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (!JPWL_ASSUME) {
1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                return OPJ_FALSE;
1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        l_seg->newlen = 8192 - l_cblk->len;
1179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        break;
1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                };
1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */
1184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                /* Check possible overflow on size */
1185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                if ((l_cblk->data_current_size + l_seg->newlen) < l_cblk->data_current_size) {
1186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_msg(p_manager, EVT_ERROR, "read: segment too long (%d) with current size (%d > %d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                l_seg->newlen, l_cblk->data_current_size, 0xFFFFFFFF - l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                        return OPJ_FALSE;
1189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                }
1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* Check if the cblk->data have allocated enough memory */
1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) {
1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen);
1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    if(! new_cblk_data) {
1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        opj_free(l_cblk->data);
1195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                        l_cblk->data = NULL;
1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        l_cblk->data_max_size = 0;
1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to realloc code block cata!\n"); */
1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        return OPJ_FALSE;
1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    }
1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    l_cblk->data_max_size = l_cblk->data_current_size + l_seg->newlen;
1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    l_cblk->data = new_cblk_data;
1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                memcpy(l_cblk->data + l_cblk->data_current_size, l_current_data, l_seg->newlen);
1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (l_seg->numpasses == 0) {
1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        l_seg->data = &l_cblk->data;
1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        l_seg->dataindex = l_cblk->data_current_size;
1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_current_data += l_seg->newlen;
1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_seg->numpasses += l_seg->numnewpasses;
1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->numnewpasses -= l_seg->numnewpasses;
1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_seg->real_num_passes = l_seg->numpasses;
1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->data_current_size += l_seg->newlen;
1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_seg->len += l_seg->newlen;
1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (l_cblk->numnewpasses > 0) {
1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_seg;
1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_cblk->numsegs;
1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } while (l_cblk->numnewpasses > 0);
1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        l_cblk->real_num_segs = l_cblk->numsegs;
1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++l_cblk;
1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } /* next code_block */
1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ++l_band;
1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_t2_skip_packet_data(   opj_t2_t* p_t2,
1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcd_tile_t *p_tile,
1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_pi_iterator_t *p_pi,
1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 * p_data_read,
1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 p_max_length,
1243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_packet_info_t *pack_info,
1244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    opj_event_mgr_t *p_manager)
1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 bandno, cblkno;
1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_code_blocks;
1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_band_t *l_band = 00;
1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_cblk_dec_t* l_cblk = 00;
1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_ARG_NOT_USED(p_t2);
1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_ARG_NOT_USED(pack_info);
1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *p_data_read = 0;
1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        l_band = l_res->bands;
1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++l_band;
1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        continue;
1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_nb_code_blocks = l_prc->cw * l_prc->ch;
1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                l_cblk = l_prc->cblks.dec;
1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_seg_t *l_seg = 00;
1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!l_cblk->numnewpasses) {
1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* nothing to do */
1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++l_cblk;
1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                continue;
1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!l_cblk->numsegs) {
1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_seg = l_cblk->segs;
1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                ++l_cblk->numsegs;
1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->data_current_size = 0;
1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        else {
1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (l_seg->numpasses == l_seg->maxpasses) {
1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_seg;
1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_cblk->numsegs;
1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        do {
1293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                /* Check possible overflow then size */
1294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                if (((*p_data_read + l_seg->newlen) < (*p_data_read)) || ((*p_data_read + l_seg->newlen) > p_max_length)) {
1295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_msg(p_manager, EVT_ERROR, "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        return OPJ_FALSE;
1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL
1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* we need here a j2k handle to verify if making a check to
1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        the validity of cblocks parameters is selected from user (-W) */
1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                /* let's check that we are not exceeding */
1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if ((l_cblk->len + l_seg->newlen) > 8192) {
1306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_msg(p_manager, EVT_WARNING,
1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (!JPWL_ASSUME) {
1310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                return -999;
1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        l_seg->newlen = 8192 - l_cblk->len;
1314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        break;
1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                };
1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */
1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read, l_seg->newlen );
1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                *(p_data_read) += l_seg->newlen;
1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_seg->numpasses += l_seg->numnewpasses;
1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                l_cblk->numnewpasses -= l_seg->numnewpasses;
1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (l_cblk->numnewpasses > 0)
1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                {
1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_seg;
1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        ++l_cblk->numsegs;
1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } while (l_cblk->numnewpasses > 0);
1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ++l_cblk;
1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ++l_band;
1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_t2_init_seg(   opj_tcd_cblk_dec_t* cblk,
1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            OPJ_UINT32 index,
1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            OPJ_UINT32 cblksty,
1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            OPJ_UINT32 first)
1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_tcd_seg_t* seg = 00;
1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 l_nb_segs = index + 1;
1348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (l_nb_segs > cblk->m_current_max_segs) {
1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_tcd_seg_t* new_segs;
1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                cblk->m_current_max_segs += OPJ_J2K_DEFAULT_NB_SEGS;
1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, cblk->m_current_max_segs * sizeof(opj_tcd_seg_t));
1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(! new_segs) {
1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_free(cblk->segs);
1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        cblk->segs = NULL;
1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        cblk->m_current_max_segs = 0;
1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        return OPJ_FALSE;
1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                cblk->segs = new_segs;
1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        seg = &cblk->segs[index];
1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        memset(seg,0,sizeof(opj_tcd_seg_t));
1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                seg->maxpasses = 1;
1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (first) {
1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        seg->maxpasses = 10;
1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;
1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                seg->maxpasses = 109;
1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1382