12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316 |
- /*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2007, Callum Lerwick <[email protected]>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
- #include "opj_includes.h"
- #include "t1_luts.h"
- /** @defgroup T1 T1 - Implementation of the tier-1 coding */
- /*@{*/
- /** @name Local static functions */
- /*@{*/
- static INLINE char t1_getctxno_zc(int f, int orient);
- static char t1_getctxno_sc(int f);
- static INLINE int t1_getctxno_mag(int f);
- static char t1_getspb(int f);
- static short t1_getnmsedec_sig(int x, int bitpos);
- static short t1_getnmsedec_ref(int x, int bitpos);
- static void t1_updateflags(flag_t* flagsp, int s, int stride);
- /**
- Encode significant pass
- */
- static void t1_enc_sigpass_step(opj_t1_t* t1, flag_t* flagsp, int* datap, int orient,
- int bpno, int one, int* nmsedec, char type, int vsc);
- /**
- Decode significant pass
- */
- static INLINE void t1_dec_sigpass_step_raw(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf, int vsc);
- static INLINE void t1_dec_sigpass_step_mqc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf);
- static INLINE void t1_dec_sigpass_step_mqc_vsc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf, int vsc);
- /**
- Encode significant pass
- */
- static void t1_enc_sigpass(opj_t1_t* t1, int bpno, int orient, int* nmsedec,
- char type, int cblksty);
- /**
- Decode significant pass
- */
- static void t1_dec_sigpass_raw(opj_t1_t* t1, int bpno, int orient, int cblksty);
- static void t1_dec_sigpass_mqc(opj_t1_t* t1, int bpno, int orient);
- static void t1_dec_sigpass_mqc_vsc(opj_t1_t* t1, int bpno, int orient);
- /**
- Encode refinement pass
- */
- static void t1_enc_refpass_step(opj_t1_t* t1, flag_t* flagsp, int* datap, int bpno,
- int one, int* nmsedec, char type, int vsc);
- /**
- Decode refinement pass
- */
- static INLINE void t1_dec_refpass_step_raw(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int poshalf, int neghalf, int vsc);
- static INLINE void t1_dec_refpass_step_mqc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int poshalf, int neghalf);
- static INLINE void t1_dec_refpass_step_mqc_vsc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int poshalf, int neghalf, int vsc);
- /**
- Encode refinement pass
- */
- static void t1_enc_refpass(opj_t1_t* t1, int bpno, int* nmsedec, char type, int cblksty);
- /**
- Decode refinement pass
- */
- static void t1_dec_refpass_raw(opj_t1_t* t1, int bpno, int cblksty);
- static void t1_dec_refpass_mqc(opj_t1_t* t1, int bpno);
- static void t1_dec_refpass_mqc_vsc(opj_t1_t* t1, int bpno);
- /**
- Encode clean-up pass
- */
- static void t1_enc_clnpass_step(opj_t1_t* t1, flag_t* flagsp, int* datap, int orient,
- int bpno, int one, int* nmsedec, int partial, int vsc);
- /**
- Decode clean-up pass
- */
- static void t1_dec_clnpass_step_partial(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf);
- static void t1_dec_clnpass_step(opj_t1_t *t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf);
- static void t1_dec_clnpass_step_vsc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf, int partial, int vsc);
- /**
- Encode clean-up pass
- */
- static void t1_enc_clnpass(opj_t1_t* t1, int bpno, int orient, int* nmsedec, int cblksty);
- /**
- Decode clean-up pass
- */
- static void t1_dec_clnpass(opj_t1_t* t1, int bpno, int orient, int cblksty);
- static double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno,
- int qmfbid, double stepsize, int numcomps, int mct);
- /**
- Encode 1 code-block
- @param t1 T1 handle
- @param cblk Code-block coding parameters
- @param orient
- @param compno Component number
- @param level
- @param qmfbid
- @param stepsize
- @param cblksty Code-block style
- @param numcomps
- @param tile
- */
- static void t1_encode_cblk(opj_t1_t* t1, opj_tcd_cblk_enc_t* cblk, int orient,
- int compno, int level, int qmfbid, double stepsize,
- int cblksty, int numcomps, int mct, opj_tcd_tile_t* tile);
- /**
- Decode 1 code-block
- @param t1 T1 handle
- @param cblk Code-block coding parameters
- @param orient
- @param roishift Region of interest shifting value
- @param cblksty Code-block style
- */
- static void t1_decode_cblk(opj_t1_t* t1, opj_tcd_cblk_dec_t* cblk,
- int orient, int roishift, int cblksty);
- /*@}*/
- /*@}*/
- /* ----------------------------------------------------------------------- */
- static char t1_getctxno_zc(int f, int orient) {
- return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
- }
- static char t1_getctxno_sc(int f) {
- return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
- }
- static int t1_getctxno_mag(int f) {
- int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
- int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
- return (tmp2);
- }
- static char t1_getspb(int f) {
- return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
- }
- static short t1_getnmsedec_sig(int x, int bitpos) {
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
- }
- return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
- }
- static short t1_getnmsedec_ref(int x, int bitpos) {
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
- }
- return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
- }
- static void t1_updateflags(flag_t* flagsp, int s, int stride) {
- flag_t* np = flagsp - stride;
- flag_t* sp = flagsp + stride;
- static const flag_t mod[] = {
- T1_SIG_S, T1_SIG_S|T1_SGN_S,
- T1_SIG_E, T1_SIG_E|T1_SGN_E,
- T1_SIG_W, T1_SIG_W|T1_SGN_W,
- T1_SIG_N, T1_SIG_N|T1_SGN_N
- };
- np[-1] |= T1_SIG_SE;
- np[0] |= mod[s];
- np[1] |= T1_SIG_SW;
- flagsp[-1] |= mod[s + 2];
- flagsp[0] |= T1_SIG;
- flagsp[1] |= mod[s + 4];
- sp[-1] |= T1_SIG_NE;
- sp[0] |= mod[s + 6];
- sp[1] |= T1_SIG_NW;
- }
- static void t1_enc_sigpass_step(opj_t1_t* t1, flag_t* flagsp, int* datap, int orient,
- int bpno, int one, int* nmsedec, char type, int vsc)
- {
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int flag = vsc ? *flagsp & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)) : *flagsp;
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- int v = int_abs(*datap) & one ? 1 : 0;
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v);
- }
- if (v) {
- v = *datap < 0 ? 1 : 0;
- *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v ^ t1_getspb(flag));
- }
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
- }
- static INLINE void t1_dec_sigpass_step_raw(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf, int vsc)
- {
- opj_raw_t* raw = t1->raw; /* RAW component */
- int flag = vsc ? *flagsp & ~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S) : *flagsp;
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- if (raw_decode(raw)) {
- int v = raw_decode(raw); /* ESSAI */
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
- } /* VSC and BYPASS by Antonin */
- static INLINE void t1_dec_sigpass_step_mqc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf)
- {
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int flag = *flagsp;
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- int v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
- } /* VSC and BYPASS by Antonin */
- static INLINE void t1_dec_sigpass_step_mqc_vsc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf, int vsc)
- {
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int flag = vsc ? *flagsp & ~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S) : *flagsp;
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- int v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
- } /* VSC and BYPASS by Antonin */
- static void t1_enc_sigpass(opj_t1_t* t1, int bpno, int orient, int* nmsedec, char type,
- int cblksty)
- {
- int i, j, k, vsc;
- *nmsedec = 0;
- int one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- const int height = t1->h;
- const int width = t1->w;
- for (k = 0; k < height; k += 4) {
- for (i = 0; i < width; ++i) {
- int jw = k * width; /* j * width */
- for (j = k; j < k + 4 && j < height; ++j) {
- vsc = (cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == height - 1) ? 1 : 0;
- t1_enc_sigpass_step(t1, &t1->flags[(j + 1) * t1->flags_stride + i + 1],
- &t1->data[jw + i], orient, bpno, one, nmsedec, type, vsc);
- jw += width;
- }
- }
- }
- }
- static void t1_dec_sigpass_raw(opj_t1_t* t1, int bpno, int orient, int cblksty)
- {
- int i, j, k, vsc;
- int one = 1 << bpno;
- int half = one >> 1;
- int oneplushalf = one | half;
- const int height = t1->h;
- const int width = t1->w;
- for (k = 0; k < height; k += 4) {
- for (i = 0; i < width; ++i) {
- int jw = k * width; /* j * width */
- for (j = k; j < k + 4 && j < height; ++j) {
- vsc = (cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == height - 1) ? 1 : 0;
- t1_dec_sigpass_step_raw(t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[jw + i], orient, oneplushalf, vsc);
- jw += width;
- }
- }
- }
- } /* VSC and BYPASS by Antonin */
- static void t1_dec_sigpass_mqc(opj_t1_t* t1, int bpno, int orient)
- {
- int i, j, k;
- int* data1 = t1->data;
- flag_t* flags1 = &t1->flags[1];
- int one = 1 << bpno;
- int half = one >> 1;
- int oneplushalf = one | half;
- const int cnt = t1->h & ~3;
- const int width = t1->w;
- for (k = 0; k < cnt; k += 4) {
- for (i = 0; i < width; ++i) {
- int* data2 = data1 + i;
- flag_t* flags2 = flags1 + i;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- }
- data1 += width << 2;
- flags1 += t1->flags_stride << 2;
- }
- const int height = t1->h;
- for (i = 0; i < width; ++i) {
- int* data2 = data1 + i;
- flag_t* flags2 = flags1 + i;
- for (j = k; j < height; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- }
- }
- } /* VSC and BYPASS by Antonin */
- static void t1_dec_sigpass_mqc_vsc(opj_t1_t* t1, int bpno, int orient)
- {
- int i, j, k, vsc;
- int one = 1 << bpno;
- int half = one >> 1;
- int oneplushalf = one | half;
- const int height = t1->h;
- const int width = t1->w;
- for (k = 0; k < height; k += 4) {
- for (i = 0; i < width; ++i) {
- int jw = k * width; /* j * width */
- for (j = k; j < k + 4 && j < height; ++j) {
- vsc = j == k + 3 || j == height - 1 ? 1 : 0;
- t1_dec_sigpass_step_mqc_vsc(t1, &t1->flags[(j + 1) * t1->flags_stride + i + 1],
- &t1->data[jw + i], orient, oneplushalf, vsc);
- jw += width;
- }
- }
- }
- } /* VSC and BYPASS by Antonin */
- static void t1_enc_refpass_step(opj_t1_t* t1, flag_t* flagsp, int* datap, int bpno,
- int one, int* nmsedec, char type, int vsc)
- {
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
- int flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- int v = int_abs(*datap) & one ? 1 : 0;
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v);
- }
- *flagsp |= T1_REFINE;
- }
- }
- static INLINE void t1_dec_refpass_step_raw(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int poshalf, int neghalf, int vsc)
- {
- opj_raw_t* raw = t1->raw; /* RAW component */
- int flag = vsc ? *flagsp & ~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S) : *flagsp;
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- int v = raw_decode(raw);
- int t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
- } /* VSC and BYPASS by Antonin */
- static INLINE void t1_dec_refpass_step_mqc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int poshalf, int neghalf)
- {
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int flag = *flagsp;
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- int v = mqc_decode(mqc);
- int t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
- } /* VSC and BYPASS by Antonin */
- static INLINE void t1_dec_refpass_step_mqc_vsc(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int poshalf, int neghalf, int vsc)
- {
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int flag = vsc ? *flagsp & ~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S) : *flagsp;
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- int v = mqc_decode(mqc);
- int t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
- } /* VSC and BYPASS by Antonin */
- static void t1_enc_refpass(opj_t1_t* t1, int bpno, int* nmsedec, char type, int cblksty)
- {
- int i, j, k, vsc;
- *nmsedec = 0;
- int one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- const int height = t1->h;
- const int width = t1->w;
- for (k = 0; k < height; k += 4) {
- for (i = 0; i < width; ++i) {
- int jw = k * width; /* j * width */
- for (j = k; j < k + 4 && j < height; ++j) {
- vsc = (cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == height - 1) ? 1 : 0;
- t1_enc_refpass_step(t1, &t1->flags[(j + 1) * t1->flags_stride + i + 1],
- &t1->data[jw + i], bpno, one, nmsedec, type, vsc);
- jw += width;
- }
- }
- }
- }
- static void t1_dec_refpass_raw(opj_t1_t* t1, int bpno, int cblksty)
- {
- int i, j, k, vsc;
- int one = 1 << bpno;
- int poshalf = one >> 1;
- int neghalf = bpno > 0 ? -poshalf : -1;
- const int height = t1->h;
- const int width = t1->w;
- for (k = 0; k < height; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- int jw = k * width; /* j * width */
- for (j = k; j < k + 4 && j < height; ++j) {
- vsc = (cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == height - 1) ? 1 : 0;
- t1_dec_refpass_step_raw(t1, &t1->flags[(j + 1) * t1->flags_stride + i + 1],
- &t1->data[jw + i], poshalf, neghalf, vsc);
- jw += width;
- }
- }
- }
- } /* VSC and BYPASS by Antonin */
- static void t1_dec_refpass_mqc(opj_t1_t* t1, int bpno)
- {
- int i, j, k;
- int* data1 = t1->data;
- flag_t* flags1 = &t1->flags[1];
- int one = 1 << bpno;
- int poshalf = one >> 1;
- int neghalf = bpno > 0 ? -poshalf : -1;
- const int width = t1->w;
- const int cnt = t1->h & ~3;
- for (k = 0; k < cnt; k += 4) {
- for (i = 0; i < width; ++i) {
- int* data2 = data1 + i;
- flag_t* flags2 = flags1 + i;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += width;
- }
- data1 += width << 2;
- flags1 += t1->flags_stride << 2;
- }
- const int height = t1->h;
- for (i = 0; i < width; ++i) {
- int* data2 = data1 + i;
- flag_t* flags2 = flags1 + i;
- for (j = k; j < height; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += width;
- }
- }
- } /* VSC and BYPASS by Antonin */
- static void t1_dec_refpass_mqc_vsc(opj_t1_t* t1, int bpno)
- {
- int i, j, k;
- int vsc;
- int one = 1 << bpno;
- int poshalf = one >> 1;
- int neghalf = bpno > 0 ? -poshalf : -1;
- const int width = t1->w;
- const int height = t1->h;
- for (k = 0; k < height; k += 4) {
- for (i = 0; i < width; ++i) {
- int jw = k * width; /* j * width */
- for (j = k; j < k + 4 && j < height; ++j) {
- vsc = j == k + 3 || j == height - 1 ? 1 : 0;
- t1_dec_refpass_step_mqc_vsc(t1, &t1->flags[(j + 1) * t1->flags_stride + i + 1],
- &t1->data[jw + i], poshalf, neghalf, vsc);
- }
- }
- }
- } /* VSC and BYPASS by Antonin */
- static void t1_enc_clnpass_step(opj_t1_t* t1, flag_t* flagsp, int* datap, int orient,
- int bpno, int one, int* nmsedec, int partial, int vsc)
- {
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int flag = vsc ? *flagsp & ~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S) : *flagsp;
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(*flagsp & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- int v = int_abs(*datap) & one ? 1 : 0;
- mqc_encode(mqc, v);
- if (v) {
- LABEL_PARTIAL:
- *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = *datap < 0 ? 1 : 0;
- mqc_encode(mqc, v ^ t1_getspb(flag));
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
- }
- static void t1_dec_clnpass_step_partial(opj_t1_t* t1, flag_t* flagsp, int* datap,
- int orient, int oneplushalf)
- {
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int flag = *flagsp;
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- int v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- *flagsp &= ~T1_VISIT;
- } /* VSC and BYPASS by Antonin */
- static void t1_dec_clnpass_step(opj_t1_t* t1, flag_t* flagsp, int* datap, int orient,
- int oneplushalf)
- {
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int flag = *flagsp;
- if (!(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- int v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
- } /* VSC and BYPASS by Antonin */
- static void t1_dec_clnpass_step_vsc(opj_t1_t* t1, flag_t* flagsp, int* datap, int orient,
- int oneplushalf, int partial, int vsc)
- {
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
- int flag = vsc ? *flagsp & ~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S) : *flagsp;
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- LABEL_PARTIAL:
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- int v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
- }
- static void t1_enc_clnpass(opj_t1_t* t1, int bpno, int orient, int* nmsedec, int cblksty)
- {
- int i, j, k, agg, runlen, vsc;
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- *nmsedec = 0;
- int one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- if (k + 3 < t1->h) {
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || (MACRO_t1_flags(1 + k + 3,1 + i)
- & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- } else {
- agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- }
- } else {
- agg = 0;
- }
- if (agg) {
- for (runlen = 0; runlen < 4; ++runlen) {
- if (int_abs(t1->data[((k + runlen) * t1->w) + i]) & one)
- break;
- }
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- mqc_encode(mqc, runlen != 4);
- if (runlen == 4) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- mqc_encode(mqc, runlen >> 1);
- mqc_encode(mqc, runlen & 1);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
- vsc = (cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1) ? 1 : 0;
- t1_enc_clnpass_step(t1,
- &t1->flags[(j + 1) * t1->flags_stride + i + 1],
- &t1->data[j * t1->w + i], orient, bpno, one, nmsedec,
- agg && (j == k + runlen), vsc);
- }
- }
- }
- }
- static void t1_dec_clnpass(opj_t1_t* t1, int bpno, int orient, int cblksty)
- {
- int i, j, k, agg, runlen, vsc;
- int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int one = 1 << bpno;
- int half = one >> 1;
- int oneplushalf = one | half;
- const int width = t1->w;
- const int height = t1->h;
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- for (k = 0; k < height; k += 4) {
- for (i = 0; i < width; ++i) {
- if (k + 3 < height) {
- agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || (MACRO_t1_flags(1 + k + 3, 1 + i)
- & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- } else {
- agg = 0;
- }
- if (agg) {
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- if (!mqc_decode(mqc)) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- runlen = mqc_decode(mqc);
- runlen = (runlen << 1) | mqc_decode(mqc);
- } else {
- runlen = 0;
- }
- int jw = (k + runlen) * width; /* j * width */
- for (j = k + runlen; j < k + 4 && j < height; ++j) {
- vsc = j == k + 3 || j == height - 1 ? 1 : 0;
- t1_dec_clnpass_step_vsc(t1, &t1->flags[(j + 1) * t1->flags_stride + i + 1],
- &t1->data[jw + i], orient, oneplushalf,
- agg && (j == k + runlen), vsc);
- jw += width;
- }
- }
- }
- } else {
- int* data1 = t1->data;
- flag_t *flags1 = &t1->flags[1];
- for (k = 0; k < (height & ~3); k += 4) {
- for (i = 0; i < width; ++i) {
- int* data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 3, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- if (agg) {
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- if (!mqc_decode(mqc)) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- runlen = mqc_decode(mqc);
- runlen = (runlen << 1) | mqc_decode(mqc);
- flags2 += runlen * t1->flags_stride;
- data2 += runlen * width;
- for (j = k + runlen; j < k + 4 && j < height; ++j) {
- flags2 += t1->flags_stride;
- if (agg && j == k + runlen) {
- t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
- } else {
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- }
- data2 += width;
- }
- } else {
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- }
- }
- data1 += width << 2;
- flags1 += t1->flags_stride << 2;
- }
- for (i = 0; i < width; ++i) {
- int* data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- for (j = k; j < height; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += width;
- }
- }
- }
- if (segsym) {
- int v = 0;
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- v = mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- /*
- if (v != 0xa) {
- opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
- }
- */
- }
- } /* VSC and BYPASS by Antonin */
- /** mod fixed_quality */
- static double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno,
- int qmfbid, double stepsize, int numcomps, int mct)
- {
- double w1 = 1, w2, wmsedec;
- // Prevent running an MCT on more than 3 components. NB openjpeg v2.0 will support this via
- // custom MCT tables that can be passed as encode parameters, 1.3 cannot support this as it
- // uses a static table of 3 entries and there for can only cope with 3 components with out an
- // array overflow
- if (numcomps == 3) {
- if (qmfbid == 1) {
- w1 = numcomps > 1 ? mct_getnorm(compno) : 1.0;
- } else {
- w1 = numcomps > 1 ? mct_getnorm_real(compno) : 1.0;
- }
- }
- if (qmfbid == 1) {
- w2 = dwt_getnorm(level, orient);
- } else { /* if (qmfbid == 0) */
- w2 = dwt_getnorm_real(level, orient);
- }
- wmsedec = w1 * w2 * stepsize * (1 << bpno);
- wmsedec *= wmsedec * nmsedec / 8192.0;
- return wmsedec;
- }
- static bool allocate_buffers(opj_t1_t* t1, int w, int h)
- {
- int datasize = w * h;
- if (datasize > t1->datasize) {
- opj_aligned_free(t1->data);
- t1->data = (int*)opj_aligned_malloc(datasize * sizeof(int));
- if (!t1->data) {
- return false;
- }
- t1->datasize = datasize;
- }
- memset(t1->data,0,datasize * sizeof(int));
- t1->flags_stride = w + 2;
- int flagssize = t1->flags_stride * (h + 2);
- if (flagssize > t1->flagssize){
- opj_aligned_free(t1->flags);
- t1->flags = (flag_t*)opj_aligned_malloc(flagssize * sizeof(flag_t));
- if (!t1->flags) {
- return false;
- }
- t1->flagssize = flagssize;
- }
- memset(t1->flags, 0, flagssize * sizeof(flag_t));
- t1->w = w;
- t1->h = h;
- return true;
- }
- /** mod fixed_quality */
- static void t1_encode_cblk(opj_t1_t* t1, opj_tcd_cblk_enc_t* cblk, int orient,
- int compno, int level, int qmfbid, double stepsize,
- int cblksty, int numcomps, int mct, opj_tcd_tile_t* tile)
- {
- double cumwmsedec = 0.0;
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- int passno, bpno, passtype;
- int nmsedec = 0;
- char type = T1_TYPE_MQ;
- int max = 0;
- int i;
- for (i = 0; i < t1->w * t1->h; ++i) {
- int tmp = abs(t1->data[i]);
- max = int_max(max, tmp);
- }
- cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
- bpno = cblk->numbps - 1;
- passtype = 2;
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
- mqc_init_enc(mqc, cblk->data);
- for (passno = 0; bpno >= 0; ++passno) {
- opj_tcd_pass_t* pass = &cblk->passes[passno];
- int correction = 3;
- type = bpno < cblk->numbps - 4 && passtype < 2 && (cblksty & J2K_CCP_CBLKSTY_LAZY) ? T1_TYPE_RAW : T1_TYPE_MQ;
- switch (passtype) {
- case 0:
- t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
- break;
- case 1:
- t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
- break;
- case 2:
- t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
- /* code switch SEGMARK (i.e. SEGSYM) */
- if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) {
- mqc_segmark_enc(mqc);
- }
- }
- /* fixed_quality */
- double tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno,
- qmfbid, stepsize, numcomps, mct);
- cumwmsedec += tempwmsedec;
- tile->distotile += tempwmsedec;
- /* Code switch "RESTART" (i.e. TERMALL) */
- if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !(passtype == 2 && bpno - 1 < 0)) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else if (((bpno < cblk->numbps - 4 && passtype > 0) ||
- (bpno == cblk->numbps - 4 && passtype == 2)) &&
- (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- pass->term = 0;
- }
- if (++passtype == 3) {
- passtype = 0;
- --bpno;
- }
- if (pass->term && bpno > 0) {
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- if (type == T1_TYPE_RAW) {
- mqc_bypass_init_enc(mqc);
- } else {
- mqc_restart_init_enc(mqc);
- }
- }
- pass->distortiondec = cumwmsedec;
- pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */
- /* Code-switch "RESET" */
- if (cblksty & J2K_CCP_CBLKSTY_RESET) {
- mqc_reset_enc(mqc);
- }
- }
- /* Code switch "ERTERM" (i.e. PTERM) */
- if (cblksty & J2K_CCP_CBLKSTY_PTERM) {
- mqc_erterm_enc(mqc);
- } else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) {
- mqc_flush(mqc);
- }
- cblk->totalpasses = passno;
- for (passno = 0; passno < cblk->totalpasses; ++passno) {
- opj_tcd_pass_t* pass = &cblk->passes[passno];
- if (pass->rate > mqc_numbytes(mqc)) {
- pass->rate = mqc_numbytes(mqc);
- }
- /*Preventing generation of FF as last data byte of a pass*/
- if (pass->rate > 1 && cblk->data[pass->rate - 1] == 0xFF) {
- --pass->rate;
- }
- pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
- }
- }
- static void t1_decode_cblk(opj_t1_t* t1, opj_tcd_cblk_dec_t* cblk, int orient,
- int roishift, int cblksty)
- {
- opj_raw_t* raw = t1->raw; /* RAW component */
- opj_mqc_t* mqc = t1->mqc; /* MQC component */
- if (!allocate_buffers(t1, cblk->x1 - cblk->x0, cblk->y1 - cblk->y0))
- {
- return;
- }
- int bpno;
- int segno, passno;
- char type = T1_TYPE_MQ; /* BYPASS mode */
- bpno = roishift + cblk->numbps - 1;
- int passtype = 2;
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
- for (segno = 0; segno < cblk->numsegs; ++segno) {
- opj_tcd_seg_t* seg = &cblk->segs[segno];
- /* BYPASS mode */
- type = bpno <= cblk->numbps - 5 && passtype < 2 && (cblksty & J2K_CCP_CBLKSTY_LAZY) ? T1_TYPE_RAW : T1_TYPE_MQ;
- /* FIXME: slviewer gets here with a null pointer.
- Why? Partially downloaded and/or corrupt textures ? */
- if (!seg->data) {
- continue;
- }
- if (type == T1_TYPE_RAW) {
- raw_init_dec(raw, *seg->data + seg->dataindex, seg->len);
- } else {
- mqc_init_dec(mqc, *seg->data + seg->dataindex, seg->len);
- }
- for (passno = 0; passno < seg->numpasses; ++passno) {
- switch (passtype) {
- case 0:
- if (type == T1_TYPE_RAW) {
- t1_dec_sigpass_raw(t1, bpno + 1, orient, cblksty);
- } else if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- t1_dec_sigpass_mqc_vsc(t1, bpno + 1, orient);
- } else {
- t1_dec_sigpass_mqc(t1, bpno + 1, orient);
- }
- break;
- case 1:
- if (type == T1_TYPE_RAW) {
- t1_dec_refpass_raw(t1, bpno + 1, cblksty);
- } else if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- t1_dec_refpass_mqc_vsc(t1, bpno + 1);
- } else {
- t1_dec_refpass_mqc(t1, bpno + 1);
- }
- break;
- case 2:
- t1_dec_clnpass(t1, bpno+1, orient, cblksty);
- }
- if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
- }
- if (++passtype == 3) {
- passtype = 0;
- --bpno;
- }
- }
- }
- }
- /* ----------------------------------------------------------------------- */
- opj_t1_t* t1_create(opj_common_ptr cinfo) {
- opj_t1_t* t1 = (opj_t1_t*)opj_malloc(sizeof(opj_t1_t));
- if (!t1) {
- return NULL;
- }
- t1->cinfo = cinfo;
- /* create MQC and RAW handles */
- t1->mqc = mqc_create();
- t1->raw = raw_create();
- t1->data = NULL;
- t1->flags = NULL;
- t1->datasize = 0;
- t1->flagssize = 0;
- return t1;
- }
- void t1_destroy(opj_t1_t* t1) {
- if (t1) {
- /* destroy MQC and RAW handles */
- mqc_destroy(t1->mqc);
- raw_destroy(t1->raw);
- opj_aligned_free(t1->data);
- opj_aligned_free(t1->flags);
- opj_free(t1);
- }
- }
- void t1_encode_cblks(opj_t1_t* t1, opj_tcd_tile_t* tile, opj_tcp_t* tcp)
- {
- tile->distotile = 0; /* fixed_quality */
- int compno;
- for (compno = 0; compno < tile->numcomps; ++compno) {
- opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
- opj_tccp_t* tccp = &tcp->tccps[compno];
- int tile_w = tilec->x1 - tilec->x0;
- opj_tcd_resolution_t* pres = NULL;
- int resno;
- for (resno = 0; resno < tilec->numresolutions; ++resno) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- int res_h, res_v;
- if (pres) {
- res_h = pres->x1 - pres->x0;
- res_v = pres->y1 - pres->y0;
- } else {
- res_h = res_v = 0;
- }
- pres = res;
- int bandno;
- for (bandno = 0; bandno < res->numbands; ++bandno) {
- opj_tcd_band_t* restrict band = &res->bands[bandno];
- int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192));
- int precno;
- for (precno = 0; precno < res->pw * res->ph; ++precno) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- int cblkno;
- for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- int x = cblk->x0 - band->x0;
- int y = cblk->y0 - band->y0;
- if (band->bandno & 1) {
- x += res_h;
- }
- if (band->bandno & 2) {
- y += res_v;
- }
- if (!allocate_buffers(t1, cblk->x1 - cblk->x0, cblk->y1 - cblk->y0))
- {
- return;
- }
- int* restrict datap = t1->data;
- int cblk_w = t1->w;
- int cblk_h = t1->h;
- int* restrict tiledp = &tilec->data[y * tile_w + x];
- if (tccp->qmfbid == 1) {
- int i, j;
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int tmp = tiledp[j * tile_w + i];
- datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
- }
- }
- } else { /* if (tccp->qmfbid == 0) */
- int i, j;
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int tmp = tiledp[j * tile_w + i];
- datap[j * cblk_w + i] =
- fix_mul(tmp,
- bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
- }
- }
- }
- t1_encode_cblk(t1, cblk, band->bandno, compno,
- tilec->numresolutions - 1 - resno,
- tccp->qmfbid, band->stepsize, tccp->cblksty,
- tile->numcomps, tcp->mct, tile);
- } /* cblkno */
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
- }
- void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp)
- {
- int tile_w = tilec->x1 - tilec->x0;
- opj_tcd_resolution_t* pres = NULL;
- int resno;
- for (resno = 0; resno < tilec->numresolutions; ++resno) {
- opj_tcd_resolution_t* res = &tilec->resolutions[resno];
- int res_h, res_v;
- if (pres) {
- res_h = pres->x1 - pres->x0;
- res_v = pres->y1 - pres->y0;
- } else {
- res_h = res_v = 0;
- }
- pres = res;
- int bandno;
- for (bandno = 0; bandno < res->numbands; ++bandno) {
- opj_tcd_band_t* restrict band = &res->bands[bandno];
- int precno;
- for (precno = 0; precno < res->pw * res->ph; ++precno) {
- opj_tcd_precinct_t* precinct = &band->precincts[precno];
- int cnt = precinct->cw * precinct->ch;
- int cblkno;
- for (cblkno = 0; cblkno < cnt; ++cblkno) {
- opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
- t1_decode_cblk(t1, cblk, band->bandno, tccp->roishift, tccp->cblksty);
- int x = cblk->x0 - band->x0;
- int y = cblk->y0 - band->y0;
- if (band->bandno & 1) {
- x += res_h;
- }
- if (band->bandno & 2) {
- y += res_v;
- }
- int* restrict datap = t1->data;
- int cblk_w = t1->w;
- int cblk_h = t1->h;
- int i = tccp->roishift;
- if (i >= 31) {
- memset((void*)datap, 0, cblk_h * cblk_w * sizeof(int));
- } else if (i) {
- int thresh = 1 << i;
- int j;
- for (j = 0; j < cblk_h; ++j) {
- const int jcblkw = j * cblk_w;
- for (i = 0; i < cblk_w; ++i) {
- int val = datap[jcblkw + i];
- int mag = abs(val);
- if (mag >= thresh) {
- mag >>= tccp->roishift;
- datap[jcblkw + i] = val < 0 ? -mag : mag;
- }
- }
- }
- }
- if (tccp->qmfbid == 1) {
- int* restrict tiledp = &tilec->data[(y * tile_w) + x];
- int j;
- for (j = 0; j < cblk_h; ++j) {
- const int jcblkw = j * cblk_w;
- const int jtilew = j * tile_w;
- int cnt = cblk_w & ~3U;
- int i = 0;
- for ( ; i < cnt; i += 4) {
- int tmp0 = datap[jcblkw + i];
- int tmp1 = datap[jcblkw + i + 1];
- int tmp2 = datap[jcblkw + i + 2];
- int tmp3 = datap[jcblkw + i + 3];
- ((int*)tiledp)[jtilew + i] = tmp0 / 2;
- ((int*)tiledp)[jtilew + i + 1] = tmp1 / 2;
- ((int*)tiledp)[jtilew + i + 2] = tmp2 / 2;
- ((int*)tiledp)[jtilew + i + 3] = tmp3 / 2;
- }
- for ( ; i < cblk_w; ++i) {
- int tmp = datap[jcblkw + i];
- ((int*)tiledp)[jtilew + i] = tmp / 2;
- }
- }
- } else { /* if (tccp->qmfbid == 0) */
- float* restrict tiledp = (float*)&tilec->data[(y * tile_w) + x];
- int i, j;
- for (j = 0; j < cblk_h; ++j) {
- float* restrict tiledp2 = tiledp;
- for (i = 0; i < cblk_w; ++i) {
- *tiledp2 = (float)(*datap * band->stepsize);
- ++datap;
- ++tiledp2;
- }
- tiledp += tile_w;
- }
- }
- opj_free(cblk->data);
- opj_free(cblk->segs);
- } /* cblkno */
- opj_free(precinct->cblks.dec);
- } /* precno */
- } /* bandno */
- } /* resno */
- }
|