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