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) 2007, Callum Lerwick <seg@haxxed.com>
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * All rights reserved.
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Redistribution and use in source and binary forms, with or without
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * modification, are permitted provided that the following conditions
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are met:
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1. Redistributions of source code must retain the above copyright
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    notice, this list of conditions and the following disclaimer.
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 2. Redistributions in binary form must reproduce the above copyright
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    notice, this list of conditions and the following disclaimer in the
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    documentation and/or other materials provided with the distribution.
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSSIBILITY OF SUCH DAMAGE.
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "opj_includes.h"
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1_luts.h"
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @defgroup T1 T1 - Implementation of the tier-1 coding */
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @name Local static functions */
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient);
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f);
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f);
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f);
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos);
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos);
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride);
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovEncode significant pass
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_enc_sigpass_step(opj_t1_t *t1,
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_flag_t *flagsp,
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 *datap,
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 orient,
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 bpno,
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 one,
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 *nmsedec,
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE type,
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 vsc);
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDecode significant pass
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_sigpass_step(opj_t1_t *t1,
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_flag_t *flagsp,
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 *datap,
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 orient,
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 oneplushalf,
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE type,
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 vsc);
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE void opj_t1_dec_sigpass_step_raw(
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient,
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 oneplushalf,
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 vsc);
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE void opj_t1_dec_sigpass_step_mqc(
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient,
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 oneplushalf);
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient,
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 oneplushalf,
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 vsc);
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovEncode significant pass
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_enc_sigpass( opj_t1_t *t1,
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 bpno,
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 orient,
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 *nmsedec,
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE type,
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 cblksty);
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDecode significant pass
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_sigpass_raw(
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno,
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient,
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 cblksty);
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_sigpass_mqc(
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno,
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient);
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_sigpass_mqc_vsc(
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno,
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient);
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovEncode refinement pass
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_enc_refpass_step(opj_t1_t *t1,
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_flag_t *flagsp,
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 *datap,
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 bpno,
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 one,
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 *nmsedec,
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE type,
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 vsc);
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovEncode refinement pass
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_enc_refpass( opj_t1_t *t1,
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 bpno,
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 *nmsedec,
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE type,
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 cblksty);
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDecode refinement pass
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_refpass_raw(
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno,
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 cblksty);
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_refpass_mqc(
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_refpass_mqc_vsc(
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno);
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDecode refinement pass
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_refpass_step(opj_t1_t *t1,
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_flag_t *flagsp,
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 *datap,
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 poshalf,
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_INT32 neghalf,
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_BYTE type,
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 vsc);
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE void  opj_t1_dec_refpass_step_raw(
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 poshalf,
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 neghalf,
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 vsc);
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE void opj_t1_dec_refpass_step_mqc(
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 poshalf,
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 neghalf);
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE void opj_t1_dec_refpass_step_mqc_vsc(
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 poshalf,
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 neghalf,
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 vsc);
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovEncode clean-up pass
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_enc_clnpass_step(
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flagsp,
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *datap,
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 orient,
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 one,
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *nmsedec,
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 partial,
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 vsc);
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDecode clean-up pass
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_clnpass_step_partial(
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flagsp,
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *datap,
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 orient,
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 oneplushalf);
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_clnpass_step(
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flagsp,
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *datap,
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 orient,
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 oneplushalf);
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_clnpass_step_vsc(
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flagsp,
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *datap,
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 orient,
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 oneplushalf,
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 partial,
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 vsc);
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovEncode clean-up pass
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_enc_clnpass(
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 orient,
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *nmsedec,
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 cblksty);
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDecode clean-up pass
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_clnpass(
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 orient,
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 cblksty);
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_FLOAT64 opj_t1_getwmsedec(
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 nmsedec,
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 compno,
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 level,
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 orient,
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 qmfbid,
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_FLOAT64 stepsize,
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 numcomps,
268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		const OPJ_FLOAT64 * mct_norms,
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		OPJ_UINT32 mct_numcomps);
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_encode_cblk( opj_t1_t *t1,
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcd_cblk_enc_t* cblk,
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 orient,
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 compno,
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 level,
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 qmfbid,
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_FLOAT64 stepsize,
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 cblksty,
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 numcomps,
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcd_tile_t * tile,
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                const OPJ_FLOAT64 * mct_norms,
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                OPJ_UINT32 mct_numcomps);
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDecode 1 code-block
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param t1 T1 handle
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param cblk Code-block coding parameters
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param orient
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param roishift Region of interest shifting value
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param cblksty Code-block style
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_t1_decode_cblk( opj_t1_t *t1,
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    opj_tcd_cblk_dec_t* cblk,
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 orient,
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 roishift,
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 cblksty);
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_t1_allocate_buffers(   opj_t1_t *t1,
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 w,
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    OPJ_UINT32 h);
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient) {
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f) {
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f) {
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (tmp2);
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f) {
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos) {
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (bitpos > 0) {
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return lut_nmsedec_sig[(x >> (bitpos)) & ((1 << T1_NMSEDEC_BITS) - 1)];
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos) {
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (bitpos > 0) {
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return lut_nmsedec_ref[(x >> (bitpos)) & ((1 << T1_NMSEDEC_BITS) - 1)];
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride) {
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_flag_t *np = flagsp - stride;
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_flag_t *sp = flagsp + stride;
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static const opj_flag_t mod[] = {
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		T1_SIG_S, T1_SIG_S|T1_SGN_S,
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		T1_SIG_E, T1_SIG_E|T1_SGN_E,
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		T1_SIG_W, T1_SIG_W|T1_SGN_W,
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		T1_SIG_N, T1_SIG_N|T1_SGN_N
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	};
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	np[-1] |= T1_SIG_SE;
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	np[0]  |= mod[s];
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	np[1]  |= T1_SIG_SW;
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flagsp[-1] |= mod[s+2];
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flagsp[0]  |= T1_SIG;
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flagsp[1]  |= mod[s+4];
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	sp[-1] |= T1_SIG_NE;
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	sp[0]  |= mod[s+6];
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	sp[1]  |= T1_SIG_NW;
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_enc_sigpass_step(   opj_t1_t *t1,
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_flag_t *flagsp,
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 *datap,
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 orient,
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 bpno,
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 one,
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 *nmsedec,
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE type,
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 vsc
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                )
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 v;
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OPJ_UINT32 flag;
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v = opj_int_abs(*datap) & one ? 1 : 0;
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));	/* ESSAI */
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} else {
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_encode(mqc, (OPJ_UINT32)v);
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (v) {
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v = *datap < 0 ? 1 : 0;
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			*nmsedec +=	opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno));
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));	/* ESSAI */
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			} else {
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		*flagsp |= T1_VISIT;
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic INLINE void opj_t1_dec_sigpass_step_raw(
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient,
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 oneplushalf,
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 vsc)
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 v, flag;
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_raw_t *raw = t1->raw;       /* RAW component */
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_ARG_NOT_USED(orient);
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (opj_raw_decode(raw)) {
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                v = (OPJ_INT32)opj_raw_decode(raw);    /* ESSAI */
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                *datap = v ? -oneplushalf : oneplushalf;
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *flagsp |= T1_VISIT;
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic INLINE void opj_t1_dec_sigpass_step_mqc(
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient,
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 oneplushalf)
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 v, flag;
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = *flagsp;
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (opj_mqc_decode(mqc)) {
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                *datap = v ? -oneplushalf : oneplushalf;
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *flagsp |= T1_VISIT;
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin */
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient,
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 oneplushalf,
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 vsc)
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 v, flag;
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (opj_mqc_decode(mqc)) {
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        *datap = v ? -oneplushalf : oneplushalf;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *flagsp |= T1_VISIT;
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin */
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_enc_sigpass(opj_t1_t *t1,
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_INT32 bpno,
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 orient,
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_INT32 *nmsedec,
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_BYTE type,
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 cblksty
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        )
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 i, j, k, vsc;
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OPJ_INT32 one;
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*nmsedec = 0;
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (k = 0; k < t1->h; k += 4) {
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (i = 0; i < t1->w; ++i) {
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			for (j = k; j < k + 4 && j < t1->h; ++j) {
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_enc_sigpass_step(
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						t1,
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						&t1->data[(j * t1->data_stride) + i],
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						orient,
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						bpno,
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						one,
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						nmsedec,
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						type,
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						vsc);
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_dec_sigpass_raw(
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno,
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient,
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 cblksty)
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 one, half, oneplushalf, vsc;
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 i, j, k;
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        one = 1 << bpno;
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        half = one >> 1;
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        oneplushalf = one | half;
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (k = 0; k < t1->h; k += 4) {
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (i = 0; i < t1->w; ++i) {
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        for (j = k; j < k + 4 && j < t1->h; ++j) {
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_t1_dec_sigpass_step_raw(
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                t1,
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                &t1->data[(j * t1->w) + i],
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                orient,
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                oneplushalf,
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                vsc);
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin */
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_dec_sigpass_mqc(
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno,
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient)
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 one, half, oneplushalf;
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 i, j, k;
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 *data1 = t1->data;
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_flag_t *flags1 = &t1->flags[1];
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        one = 1 << bpno;
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        half = one >> 1;
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        oneplushalf = one | half;
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (k = 0; k < (t1->h & ~3u); k += 4) {
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (i = 0; i < t1->w; ++i) {
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_INT32 *data2 = data1 + i;
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_flag_t *flags2 = flags1 + i;
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                data1 += t1->w << 2;
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                flags1 += t1->flags_stride << 2;
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (i = 0; i < t1->w; ++i) {
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *data2 = data1 + i;
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flags2 = flags1 + i;
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (j = k; j < t1->h; ++j) {
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin */
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_dec_sigpass_mqc_vsc(
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno,
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 orient)
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 one, half, oneplushalf, vsc;
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 i, j, k;
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        one = 1 << bpno;
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        half = one >> 1;
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        oneplushalf = one | half;
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (k = 0; k < t1->h; k += 4) {
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (i = 0; i < t1->w; ++i) {
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        for (j = k; j < k + 4 && j < t1->h; ++j) {
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_t1_dec_sigpass_step_mqc_vsc(
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                t1,
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                &t1->data[(j * t1->w) + i],
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                orient,
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                oneplushalf,
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                vsc);
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin */
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_enc_refpass_step(   opj_t1_t *t1,
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_flag_t *flagsp,
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 *datap,
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 bpno,
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 one,
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 *nmsedec,
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE type,
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 vsc)
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 v;
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 flag;
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*nmsedec += opj_t1_getnmsedec_ref((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno));
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v = opj_int_abs(*datap) & one ? 1 : 0;
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag));	/* ESSAI */
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} else {
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_encode(mqc, (OPJ_UINT32)v);
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		*flagsp |= T1_REFINE;
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic INLINE void opj_t1_dec_refpass_step_raw(
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 poshalf,
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 neghalf,
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 vsc)
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 v, t, flag;
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_raw_t *raw = t1->raw;       /* RAW component */
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        v = (OPJ_INT32)opj_raw_decode(raw);
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                t = v ? poshalf : neghalf;
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *datap += *datap < 0 ? -t : t;
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *flagsp |= T1_REFINE;
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin  */
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic INLINE void opj_t1_dec_refpass_step_mqc(
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 poshalf,
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 neghalf)
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 v, t, flag;
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = *flagsp;
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag));      /* ESSAI */
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        v = opj_mqc_decode(mqc);
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                t = v ? poshalf : neghalf;
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *datap += *datap < 0 ? -t : t;
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *flagsp |= T1_REFINE;
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin  */
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic INLINE void opj_t1_dec_refpass_step_mqc_vsc(
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flagsp,
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *datap,
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 poshalf,
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 neghalf,
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 vsc)
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 v, t, flag;
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag));      /* ESSAI */
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                v = opj_mqc_decode(mqc);
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                t = v ? poshalf : neghalf;
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *datap += *datap < 0 ? -t : t;
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                *flagsp |= T1_REFINE;
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin  */
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_enc_refpass(
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *nmsedec,
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_BYTE type,
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 cblksty)
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 i, j, k, vsc;
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OPJ_INT32 one;
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*nmsedec = 0;
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (k = 0; k < t1->h; k += 4) {
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (i = 0; i < t1->w; ++i) {
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			for (j = k; j < k + 4 && j < t1->h; ++j) {
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_enc_refpass_step(
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						t1,
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						&t1->data[(j * t1->data_stride) + i],
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						bpno,
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						one,
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						nmsedec,
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						type,
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						vsc);
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_dec_refpass_raw(
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno,
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 cblksty)
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 one, poshalf, neghalf;
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 i, j, k;
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 vsc;
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        one = 1 << bpno;
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        poshalf = one >> 1;
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        neghalf = bpno > 0 ? -poshalf : -1;
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (k = 0; k < t1->h; k += 4) {
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (i = 0; i < t1->w; ++i) {
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        for (j = k; j < k + 4 && j < t1->h; ++j) {
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_t1_dec_refpass_step_raw(
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                t1,
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                &t1->data[(j * t1->w) + i],
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                poshalf,
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                neghalf,
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                vsc);
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin */
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_dec_refpass_mqc(
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno)
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 one, poshalf, neghalf;
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 i, j, k;
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 *data1 = t1->data;
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        opj_flag_t *flags1 = &t1->flags[1];
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        one = 1 << bpno;
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        poshalf = one >> 1;
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        neghalf = bpno > 0 ? -poshalf : -1;
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (k = 0; k < (t1->h & ~3u); k += 4) {
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (i = 0; i < t1->w; ++i) {
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_INT32 *data2 = data1 + i;
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_flag_t *flags2 = flags1 + i;
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                data1 += t1->w << 2;
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                flags1 += t1->flags_stride << 2;
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (i = 0; i < t1->w; ++i) {
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 *data2 = data1 + i;
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_flag_t *flags2 = flags1 + i;
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (j = k; j < t1->h; ++j) {
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        flags2 += t1->flags_stride;
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        data2 += t1->w;
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin */
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_dec_refpass_mqc_vsc(
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                opj_t1_t *t1,
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bpno)
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 one, poshalf, neghalf;
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_UINT32 i, j, k;
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OPJ_INT32 vsc;
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        one = 1 << bpno;
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        poshalf = one >> 1;
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        neghalf = bpno > 0 ? -poshalf : -1;
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (k = 0; k < t1->h; k += 4) {
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (i = 0; i < t1->w; ++i) {
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        for (j = k; j < k + 4 && j < t1->h; ++j) {
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_t1_dec_refpass_step_mqc_vsc(
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                t1,
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                &t1->data[(j * t1->w) + i],
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                poshalf,
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                neghalf,
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                vsc);
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}                               /* VSC and  BYPASS by Antonin */
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_enc_clnpass_step(
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flagsp,
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *datap,
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 orient,
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 one,
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *nmsedec,
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 partial,
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 vsc)
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 v;
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 flag;
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (partial) {
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		goto LABEL_PARTIAL;
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!(*flagsp & (T1_SIG | T1_VISIT))) {
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v = opj_int_abs(*datap) & one ? 1 : 0;
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_encode(mqc, (OPJ_UINT32)v);
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (v) {
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLABEL_PARTIAL:
856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			*nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno));
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v = *datap < 0 ? 1 : 0;
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*flagsp &= ~T1_VISIT;
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_clnpass_step_partial(
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flagsp,
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *datap,
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 orient,
871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 oneplushalf)
872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 v, flag;
874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_ARG_NOT_USED(orient);
877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flag = *flagsp;
879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*datap = v ? -oneplushalf : oneplushalf;
882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*flagsp &= ~T1_VISIT;
884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}				/* VSC and  BYPASS by Antonin */
885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_clnpass_step(
887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flagsp,
889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *datap,
890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 orient,
891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 oneplushalf)
892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 v, flag;
894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flag = *flagsp;
898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!(flag & (T1_SIG | T1_VISIT))) {
899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (opj_mqc_decode(mqc)) {
901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			*datap = v ? -oneplushalf : oneplushalf;
904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*flagsp &= ~T1_VISIT;
908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}				/* VSC and  BYPASS by Antonin */
909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_clnpass_step_vsc(
911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flagsp,
913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *datap,
914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 orient,
915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 oneplushalf,
916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 partial,
917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 vsc)
918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 v, flag;
920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (partial) {
925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		goto LABEL_PARTIAL;
926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!(flag & (T1_SIG | T1_VISIT))) {
928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (opj_mqc_decode(mqc)) {
930ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLABEL_PARTIAL:
931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			*datap = v ? -oneplushalf : oneplushalf;
934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*flagsp &= ~T1_VISIT;
938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_enc_clnpass(
941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 orient,
944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *nmsedec,
945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 cblksty)
946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 i, j, k;
948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 one;
949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 agg, runlen, vsc;
950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*nmsedec = 0;
954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (k = 0; k < t1->h; k += 4) {
956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (i = 0; i < t1->w; ++i) {
957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (k + 3 < t1->h) {
958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (cblksty & J2K_CCP_CBLKSTY_VSC) {
959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						|| (MACRO_t1_flags(1 + k + 3,1 + i)
963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						& (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW |	T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				} else {
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann					agg = !((MACRO_t1_flags(1 + k,1 + i) |
966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann						    MACRO_t1_flags(1 + k + 1,1 + i) |
967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann						    MACRO_t1_flags(1 + k + 2,1 + i) |
968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann						     MACRO_t1_flags(1 + k + 3,1 + i)) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			} else {
971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				agg = 0;
972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (agg) {
974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				for (runlen = 0; runlen < 4; ++runlen) {
975e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov					if (opj_int_abs(t1->data[((k + runlen)*t1->data_stride) + i]) & one)
976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						break;
977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_encode(mqc, runlen != 4);
980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (runlen == 4) {
981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					continue;
982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_encode(mqc, runlen >> 1);
985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_encode(mqc, runlen & 1);
986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			} else {
987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				runlen = 0;
988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_enc_clnpass_step(
992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						t1,
993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
994e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						&t1->data[(j * t1->data_stride) + i],
995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						orient,
996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						bpno,
997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						one,
998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						nmsedec,
999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						agg && (j == k + runlen),
1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						vsc);
1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_t1_dec_clnpass(
1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 orient,
1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 cblksty)
1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 one, half, oneplushalf, agg, runlen, vsc;
1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OPJ_UINT32 i, j, k;
1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	one = 1 << bpno;
1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	half = one >> 1;
1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	oneplushalf = one | half;
1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (k = 0; k < t1->h; k += 4) {
1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (i = 0; i < t1->w; ++i) {
1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (k + 3 < t1->h) {
1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						|| (MACRO_t1_flags(1 + k + 3,1 + i)
1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						& (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW |	T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				} else {
1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				agg = 0;
1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (agg) {
1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (!opj_mqc_decode(mqc)) {
1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					continue;
1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				runlen = opj_mqc_decode(mqc);
1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				runlen = (runlen << 1) | opj_mqc_decode(mqc);
1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			} else {
1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				runlen = 0;
1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			for (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) {
1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_t1_dec_clnpass_step_vsc(
1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						t1,
1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						&t1->data[(j * t1->w) + i],
1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						orient,
1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						oneplushalf,
1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						agg && (j == k + (OPJ_UINT32)runlen),
1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						vsc);
1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	} else {
1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 *data1 = t1->data;
1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_flag_t *flags1 = &t1->flags[1];
1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (k = 0; k < (t1->h & ~3u); k += 4) {
1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			for (i = 0; i < t1->w; ++i) {
1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				OPJ_INT32 *data2 = data1 + i;
1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_flag_t *flags2 = flags1 + i;
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann				agg = !((MACRO_t1_flags(1 + k, 1 + i) |
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann							MACRO_t1_flags(1 + k + 1, 1 + i) |
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann							MACRO_t1_flags(1 + k + 2, 1 + i) |
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann							MACRO_t1_flags(1 + k + 3, 1 + i)) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (agg) {
1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					if (!opj_mqc_decode(mqc)) {
1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						continue;
1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					}
1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					runlen = opj_mqc_decode(mqc);
1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					runlen = (runlen << 1) | opj_mqc_decode(mqc);
1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					flags2 += (OPJ_UINT32)runlen * t1->flags_stride;
1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					data2 += (OPJ_UINT32)runlen * t1->w;
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann					for (j = (OPJ_UINT32)runlen; j < 4 && j < t1->h; ++j) {
1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						flags2 += t1->flags_stride;
1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann						if (agg && (j == (OPJ_UINT32)runlen)) {
1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							opj_t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						} else {
1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						}
1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						data2 += t1->w;
1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					}
1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				} else {
1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					flags2 += t1->flags_stride;
1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					data2 += t1->w;
1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					flags2 += t1->flags_stride;
1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					data2 += t1->w;
1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					flags2 += t1->flags_stride;
1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					data2 += t1->w;
1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					flags2 += t1->flags_stride;
1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					data2 += t1->w;
1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			data1 += t1->w << 2;
1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			flags1 += t1->flags_stride << 2;
1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (i = 0; i < t1->w; ++i) {
1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			OPJ_INT32 *data2 = data1 + i;
1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_flag_t *flags2 = flags1 + i;
1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			for (j = k; j < t1->h; ++j) {
1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				flags2 += t1->flags_stride;
1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				data2 += t1->w;
1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (segsym) {
1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 v = 0;
1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v = opj_mqc_decode(mqc);
1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v = (v << 1) | opj_mqc_decode(mqc);
1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v = (v << 1) | opj_mqc_decode(mqc);
1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v = (v << 1) | opj_mqc_decode(mqc);
1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/*
1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (v!=0xa) {
1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		*/
1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}				/* VSC and  BYPASS by Antonin */
1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** mod fixed_quality */
1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_FLOAT64 opj_t1_getwmsedec(
1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 nmsedec,
1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 compno,
1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 level,
1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 orient,
1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_INT32 bpno,
1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 qmfbid,
1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_FLOAT64 stepsize,
1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 numcomps,
1142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		const OPJ_FLOAT64 * mct_norms,
1143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		OPJ_UINT32 mct_numcomps)
1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_FLOAT64 w1 = 1, w2, wmsedec;
1146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	OPJ_ARG_NOT_USED(numcomps);
1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (mct_norms && (compno < mct_numcomps)) {
1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		w1 = mct_norms[compno];
1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (qmfbid == 1) {
1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		w2 = opj_dwt_getnorm(level, orient);
1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	} else {	/* if (qmfbid == 0) */
1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		w2 = opj_dwt_getnorm_real(level, orient);
1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	wmsedec = w1 * w2 * stepsize * (1 << bpno);
1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	wmsedec *= wmsedec * nmsedec / 8192.0;
1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return wmsedec;
1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_t1_allocate_buffers(
1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_t *t1,
1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 w,
1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 h)
1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 datasize=w * h;
1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 flagssize;
1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	/* encoder uses tile buffer, so no need to allocate */
1173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (!t1->encoder) {
1174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		if(datasize > t1->datasize){
1175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			opj_aligned_free(t1->data);
11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann			if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(OPJ_INT32) < datasize) {
11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann				return OPJ_FALSE;
11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann			}
1179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
1180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			if(!t1->data){
1181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				/* FIXME event manager error callback */
1182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				return OPJ_FALSE;
1183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			}
1184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			t1->datasize=datasize;
1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		memset(t1->data,0,datasize * sizeof(OPJ_INT32));
1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	t1->flags_stride=w+2;
1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flagssize=t1->flags_stride * (h+2);
1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(flagssize > t1->flagssize){
1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_aligned_free(t1->flags);
11934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann		if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(opj_flag_t) < flagssize) {
11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann			return OPJ_FALSE;
11954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann		}
1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		t1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(opj_flag_t));
1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(!t1->flags){
1198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			/* FIXME event manager error callback */
1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return OPJ_FALSE;
1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		t1->flagssize=flagssize;
1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	memset(t1->flags,0,flagssize * sizeof(opj_flag_t));
1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	t1->w=w;
1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	t1->h=h;
1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return OPJ_TRUE;
1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */
1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */
1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Creates a new Tier 1 handle
1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * and initializes the look-up tables of the Tier-1 coder/decoder
1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return a new T1 handle if successful, returns NULL otherwise
1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
1219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovopj_t1_t* opj_t1_create(OPJ_BOOL isEncoder)
1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_t1_t *l_t1 = 00;
1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	l_t1 = (opj_t1_t*) opj_calloc(1,sizeof(opj_t1_t));
1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!l_t1) {
1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 00;
1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	/* create MQC and RAW handles */
1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	l_t1->mqc = opj_mqc_create();
1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (! l_t1->mqc) {
1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_destroy(l_t1);
1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 00;
1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	l_t1->raw = opj_raw_create();
1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (! l_t1->raw) {
1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_t1_destroy(l_t1);
1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 00;
1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	l_t1->encoder = isEncoder;
1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return l_t1;
1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**
1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Destroys a previously created T1 handle
1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_t1 Tier 1 handle to destroy
1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_t1_destroy(opj_t1_t *p_t1)
1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (! p_t1) {
1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	/* destroy MQC and RAW handles */
1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_destroy(p_t1->mqc);
1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	p_t1->mqc = 00;
1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_raw_destroy(p_t1->raw);
1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	p_t1->raw = 00;
1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	/* encoder uses tile buffer, so no need to free */
1264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	if (!p_t1->encoder && p_t1->data) {
1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_aligned_free(p_t1->data);
1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		p_t1->data = 00;
1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (p_t1->flags) {
1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_aligned_free(p_t1->flags);
1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		p_t1->flags = 00;
1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_free(p_t1);
1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_t1_decode_cblks(   opj_t1_t* t1,
1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            opj_tcd_tilecomp_t* tilec,
1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            opj_tccp_t* tccp
1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            )
1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 resno, bandno, precno, cblkno;
1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) {
1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_tcd_resolution_t* res = &tilec->resolutions[resno];
1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (bandno = 0; bandno < res->numbands; ++bandno) {
1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_tcd_band_t* restrict band = &res->bands[bandno];
1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			for (precno = 0; precno < res->pw * res->ph; ++precno) {
1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_tcd_precinct_t* precinct = &band->precincts[precno];
1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
1295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					OPJ_INT32* restrict datap;
1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					OPJ_UINT32 cblk_w, cblk_h;
1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					OPJ_INT32 x, y;
1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					OPJ_UINT32 i, j;
1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (OPJ_FALSE == opj_t1_decode_cblk(
1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            t1,
1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            cblk,
1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            band->bandno,
1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            (OPJ_UINT32)tccp->roishift,
1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            tccp->cblksty)) {
1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            return OPJ_FALSE;
1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					x = cblk->x0 - band->x0;
1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					y = cblk->y0 - band->y0;
1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					if (band->bandno & 1) {
1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						x += pres->x1 - pres->x0;
1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					}
1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					if (band->bandno & 2) {
1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						y += pres->y1 - pres->y0;
1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					}
1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					datap=t1->data;
1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					cblk_w = t1->w;
1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					cblk_h = t1->h;
1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					if (tccp->roishift) {
1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						OPJ_INT32 thresh = 1 << tccp->roishift;
1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						for (j = 0; j < cblk_h; ++j) {
1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							for (i = 0; i < cblk_w; ++i) {
1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								OPJ_INT32 val = datap[(j * cblk_w) + i];
1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								OPJ_INT32 mag = abs(val);
1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								if (mag >= thresh) {
1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov									mag >>= tccp->roishift;
1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov									datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								}
1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							}
1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						}
1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					}
1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					if (tccp->qmfbid == 1) {
1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_INT32* restrict tiledp = &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						for (j = 0; j < cblk_h; ++j) {
1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							for (i = 0; i < cblk_w; ++i) {
1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								OPJ_INT32 tmp = datap[(j * cblk_w) + i];
1343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann								((OPJ_INT32*)tiledp)[(j * tile_w) + i] = tmp/2;
1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							}
1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						}
1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					} else {		/* if (tccp->qmfbid == 0) */
1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_FLOAT32* restrict tiledp = (OPJ_FLOAT32*) &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
1348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						for (j = 0; j < cblk_h; ++j) {
1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            OPJ_FLOAT32* restrict tiledp2 = tiledp;
1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							for (i = 0; i < cblk_w; ++i) {
1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_FLOAT32 tmp = (OPJ_FLOAT32)*datap * band->stepsize;
1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                *tiledp2 = tmp;
1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                datap++;
1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                tiledp2++;
1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							}
1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            tiledp += tile_w;
1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						}
1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					}
1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				} /* cblkno */
1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			} /* precno */
1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} /* bandno */
1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	} /* resno */
1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return OPJ_TRUE;
1364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            opj_tcd_cblk_dec_t* cblk,
1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            OPJ_UINT32 orient,
1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            OPJ_UINT32 roishift,
1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            OPJ_UINT32 cblksty)
1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_raw_t *raw = t1->raw;	/* RAW component */
1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	OPJ_INT32 bpno_plus_one;
1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 passtype;
1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 segno, passno;
1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */
1380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!opj_t1_allocate_buffers(
1382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				t1,
1383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				(OPJ_UINT32)(cblk->x1 - cblk->x0),
1384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				(OPJ_UINT32)(cblk->y1 - cblk->y0)))
1385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
1386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return OPJ_FALSE;
1387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	bpno_plus_one = (OPJ_INT32)(roishift + cblk->numbps);
1390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	passtype = 2;
1391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_resetstates(mqc);
1393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (segno = 0; segno < cblk->real_num_segs; ++segno) {
1398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_tcd_seg_t *seg = &cblk->segs[segno];
1399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/* BYPASS mode */
1401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		type = ((bpno_plus_one <= ((OPJ_INT32) (cblk->numbps)) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
1403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(seg->data == 00){
1404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			continue;
1405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (type == T1_TYPE_RAW) {
1407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
1408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} else {
1409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (OPJ_FALSE == opj_mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len)) {
1410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return OPJ_FALSE;
1411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
14145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann		for (passno = 0; (passno < seg->real_num_passes) && (bpno_plus_one >= 1); ++passno) {
1415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            switch (passtype) {
1416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 0:
1417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (type == T1_TYPE_RAW) {
1418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        opj_t1_dec_sigpass_raw(t1, bpno_plus_one, (OPJ_INT32)orient, (OPJ_INT32)cblksty);
1419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
1420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            opj_t1_dec_sigpass_mqc_vsc(t1, bpno_plus_one, (OPJ_INT32)orient);
1422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } else {
1423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            opj_t1_dec_sigpass_mqc(t1, bpno_plus_one, (OPJ_INT32)orient);
1424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
1426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
1427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 1:
1428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (type == T1_TYPE_RAW) {
1429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            opj_t1_dec_refpass_raw(t1, bpno_plus_one, (OPJ_INT32)cblksty);
1430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
1431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            opj_t1_dec_refpass_mqc_vsc(t1, bpno_plus_one);
1433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } else {
1434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            opj_t1_dec_refpass_mqc(t1, bpno_plus_one);
1435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
1436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
1437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
1438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 2:
1439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    opj_t1_dec_clnpass(t1, bpno_plus_one, (OPJ_INT32)orient, (OPJ_INT32)cblksty);
1440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
1441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
1444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_resetstates(mqc);
1445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (++passtype == 3) {
1450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				passtype = 0;
1451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann				bpno_plus_one--;
1452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return OPJ_TRUE;
1456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1461ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,
1462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcd_tile_t *tile,
1463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_tcp_t *tcp,
1464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                const OPJ_FLOAT64 * mct_norms,
1465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                OPJ_UINT32 mct_numcomps
1466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                )
1467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 compno, resno, bandno, precno, cblkno;
1469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	tile->distotile = 0;		/* fixed_quality */
1471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (compno = 0; compno < tile->numcomps; ++compno) {
1473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
1474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_tccp_t* tccp = &tcp->tccps[compno];
1475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
1476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (resno = 0; resno < tilec->numresolutions; ++resno) {
1478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_tcd_resolution_t *res = &tilec->resolutions[resno];
1479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			for (bandno = 0; bandno < res->numbands; ++bandno) {
1481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_tcd_band_t* restrict band = &res->bands[bandno];
1482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                OPJ_INT32 bandconst = 8192 * 8192 / ((OPJ_INT32) floor(band->stepsize * 8192));
1483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				for (precno = 0; precno < res->pw * res->ph; ++precno) {
1485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_tcd_precinct_t *prc = &band->precincts[precno];
1486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
1488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
1489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						OPJ_INT32* restrict tiledp;
1490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						OPJ_UINT32 cblk_w;
1491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						OPJ_UINT32 cblk_h;
1492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						OPJ_UINT32 i, j, tileIndex=0, tileLineAdvance;
1493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						OPJ_INT32 x = cblk->x0 - band->x0;
1495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						OPJ_INT32 y = cblk->y0 - band->y0;
1496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						if (band->bandno & 1) {
1497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
1498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							x += pres->x1 - pres->x0;
1499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						}
1500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						if (band->bandno & 2) {
1501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
1502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							y += pres->y1 - pres->y0;
1503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						}
1504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						if(!opj_t1_allocate_buffers(
1506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov									t1,
1507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov									(OPJ_UINT32)(cblk->x1 - cblk->x0),
1508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov									(OPJ_UINT32)(cblk->y1 - cblk->y0)))
1509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						{
1510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							return OPJ_FALSE;
1511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						}
1512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						cblk_w = t1->w;
1514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						cblk_h = t1->h;
1515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						tileLineAdvance = tile_w - cblk_w;
1516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						tiledp=&tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
1518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						t1->data = tiledp;
1519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov						t1->data_stride = tile_w;
1520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						if (tccp->qmfbid == 1) {
1521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							for (j = 0; j < cblk_h; ++j) {
1522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								for (i = 0; i < cblk_w; ++i) {
1523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov									tiledp[tileIndex] <<= T1_NMSEDEC_FRACBITS;
1524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov									tileIndex++;
1525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								}
1526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								tileIndex += tileLineAdvance;
1527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							}
1528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						} else {		/* if (tccp->qmfbid == 0) */
1529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							for (j = 0; j < cblk_h; ++j) {
1530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								for (i = 0; i < cblk_w; ++i) {
1531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov									OPJ_INT32 tmp = tiledp[tileIndex];
1532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov									tiledp[tileIndex] =
1533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov										opj_int_fix_mul_t1(
1534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov										tmp,
1535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov										bandconst);
1536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov									tileIndex++;
1537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								}
1538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								tileIndex += tileLineAdvance;
1539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov							}
1540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						}
1541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						opj_t1_encode_cblk(
1543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								t1,
1544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								cblk,
1545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								band->bandno,
1546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								compno,
1547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								tilec->numresolutions - 1 - resno,
1548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								tccp->qmfbid,
1549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								band->stepsize,
1550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								tccp->cblksty,
1551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								tile->numcomps,
1552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov								tile,
1553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								mct_norms,
1554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov								mct_numcomps);
1555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					} /* cblkno */
1557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				} /* precno */
1558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			} /* bandno */
1559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} /* resno  */
1560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	} /* compno  */
1561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return OPJ_TRUE;
1562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** mod fixed_quality */
1565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_encode_cblk(opj_t1_t *t1,
1566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_cblk_enc_t* cblk,
1567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 orient,
1568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 compno,
1569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 level,
1570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 qmfbid,
1571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_FLOAT64 stepsize,
1572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 cblksty,
1573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        OPJ_UINT32 numcomps,
1574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        opj_tcd_tile_t * tile,
1575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        const OPJ_FLOAT64 * mct_norms,
1576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        OPJ_UINT32 mct_numcomps)
1577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_FLOAT64 cumwmsedec = 0.0;
1579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
1581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 passno;
1583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 bpno;
1584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 passtype;
1585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 nmsedec = 0;
1586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32 max;
1587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	OPJ_UINT32 i, j;
1588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_BYTE type = T1_TYPE_MQ;
1589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_FLOAT64 tempwmsedec;
1590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	max = 0;
1592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov	for (i = 0; i < t1->w; ++i) {
1593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		for (j = 0; j < t1->h; ++j) {
1594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			OPJ_INT32 tmp = abs(t1->data[i + j*t1->data_stride]);
1595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			max = opj_int_max(max, tmp);
1596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		}
1597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	cblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS) : 0;
1600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	bpno = (OPJ_INT32)(cblk->numbps - 1);
1602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	passtype = 2;
1603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_resetstates(mqc);
1605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_init_enc(mqc, cblk->data);
1609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (passno = 0; bpno >= 0; ++passno) {
1611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_tcd_pass_t *pass = &cblk->passes[passno];
1612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		OPJ_UINT32 correction = 3;
1613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		switch (passtype) {
1616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			case 0:
1617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
1618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				break;
1619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			case 1:
1620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
1621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				break;
1622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			case 2:
1623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
1624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				/* code switch SEGMARK (i.e. SEGSYM) */
1625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
1626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_mqc_segmark_enc(mqc);
1627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				break;
1628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/* fixed_quality */
1631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps,mct_norms, mct_numcomps) ;
1632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cumwmsedec += tempwmsedec;
1633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		tile->distotile += tempwmsedec;
1634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/* Code switch "RESTART" (i.e. TERMALL) */
1636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if ((cblksty & J2K_CCP_CBLKSTY_TERMALL)	&& !((passtype == 2) && (bpno - 1 < 0))) {
1637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (type == T1_TYPE_RAW) {
1638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_flush(mqc);
1639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				correction = 1;
1640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				/* correction = mqc_bypass_flush_enc(); */
1641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			} else {			/* correction = mqc_restart_enc(); */
1642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_flush(mqc);
1643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				correction = 1;
1644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pass->term = 1;
1646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} else {
1647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (((bpno < ((OPJ_INT32) (cblk->numbps) - 4) && (passtype > 0))
1648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				|| ((bpno == ((OPJ_INT32)cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
1649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (type == T1_TYPE_RAW) {
1650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_mqc_flush(mqc);
1651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					correction = 1;
1652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					/* correction = mqc_bypass_flush_enc(); */
1653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				} else {		/* correction = mqc_restart_enc(); */
1654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					opj_mqc_flush(mqc);
1655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					correction = 1;
1656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
1657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pass->term = 1;
1658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			} else {
1659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pass->term = 0;
1660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (++passtype == 3) {
1664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			passtype = 0;
1665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			bpno--;
1666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (pass->term && bpno > 0) {
1669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (type == T1_TYPE_RAW)
1671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_bypass_init_enc(mqc);
1672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			else
1673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_restart_init_enc(mqc);
1674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pass->distortiondec = cumwmsedec;
1677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pass->rate = opj_mqc_numbytes(mqc) + correction;	/* FIXME */
1678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/* Code-switch "RESET" */
1680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (cblksty & J2K_CCP_CBLKSTY_RESET)
1681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_reset_enc(mqc);
1682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	/* Code switch "ERTERM" (i.e. PTERM) */
1685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (cblksty & J2K_CCP_CBLKSTY_PTERM)
1686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_erterm_enc(mqc);
1687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
1688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_flush(mqc);
1689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	cblk->totalpasses = passno;
1691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (passno = 0; passno<cblk->totalpasses; passno++) {
1693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_tcd_pass_t *pass = &cblk->passes[passno];
1694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (pass->rate > opj_mqc_numbytes(mqc))
1695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pass->rate = opj_mqc_numbytes(mqc);
1696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		/*Preventing generation of FF as last data byte of a pass*/
1697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){
1698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pass->rate--;
1699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
1701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0
1705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_dec_refpass_step(   opj_t1_t *t1,
1706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_flag_t *flagsp,
1707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 *datap,
1708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 poshalf,
1709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 neghalf,
1710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE type,
1711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 vsc)
1712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_INT32  t;
1714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 v,flag;
1715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
1717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_raw_t *raw = t1->raw;	/* RAW component */
1718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
1720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
1721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag));	/* ESSAI */
1722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (type == T1_TYPE_RAW) {
1723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v = opj_raw_decode(raw);
1724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} else {
1725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v = opj_mqc_decode(mqc);
1726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		t = v ? poshalf : neghalf;
1728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		*datap += *datap < 0 ? -t : t;
1729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		*flagsp |= T1_REFINE;
1730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}				/* VSC and  BYPASS by Antonin  */
1732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
1733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0
1737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_t1_dec_sigpass_step(   opj_t1_t *t1,
1738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                opj_flag_t *flagsp,
1739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 *datap,
1740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 orient,
1741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_INT32 oneplushalf,
1742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_BYTE type,
1743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                OPJ_UINT32 vsc)
1744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OPJ_UINT32 v, flag;
1746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_raw_t *raw = t1->raw;	/* RAW component */
1748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
1749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
1751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
1752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (type == T1_TYPE_RAW) {
1753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (opj_raw_decode(raw)) {
1754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				v = opj_raw_decode(raw);	/* ESSAI */
1755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				*datap = v ? -oneplushalf : oneplushalf;
1756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_updateflags(flagsp, v, t1->flags_stride);
1757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		} else {
1759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));
1760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (opj_mqc_decode(mqc)) {
1761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));
1762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				v = opj_mqc_decode(mqc) ^ opj_t1_getspb(flag);
1763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				*datap = v ? -oneplushalf : oneplushalf;
1764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				opj_t1_updateflags(flagsp, v, t1->flags_stride);
1765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
1766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
1767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		*flagsp |= T1_VISIT;
1768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
1769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}				/* VSC and  BYPASS by Antonin */
1770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
1771