jas_seq_t *jpc_seq_conv(jas_seq_t *x, jas_seq_t *y) { int i; int j; int k; jas_seq_t *z; jpc_fix_t s; jpc_fix_t v; z = jas_seq_create(jas_seq_start(x) + jas_seq_start(y), jas_seq_end(x) + jas_seq_end(y) - 1); assert(z); for (i = jas_seq_start(z); i < jas_seq_end(z); i++) { s = jpc_inttofix(0); for (j = jas_seq_start(y); j < jas_seq_end(y); j++) { k = i - j; if (k < jas_seq_start(x) || k >= jas_seq_end(x)) { v = JPC_FIX_ZERO; } else { v = jas_seq_get(x, k); } s = jpc_fix_add(s, jpc_fix_mul(jas_seq_get(y, j), v)); } *jas_seq_getref(z, i) = s; } return z; }
jas_seq_t *jpc_seq_upsample(jas_seq_t *x, int m) { jas_seq_t *z; int i; if (!(z = jas_seq_create(jas_seq_start(x) * m, (jas_seq_end(x) - 1) * m + 1))) return 0; for (i = jas_seq_start(z); i < jas_seq_end(z); i++) { *jas_seq_getref(z, i) = (!JAS_MOD(i, m)) ? jas_seq_get(x, i / m) : jpc_inttofix(0); } return z; }
static int jpc_tsfbnode_getequivfilters(jpc_tsfbnode_t *tsfbnode, int cldind, int width, int height, jas_seq_t **hfilter, jas_seq_t **vfilter) { jas_seq_t *hseq; jas_seq_t *vseq; jpc_tsfbnode_t *node; jas_seq2d_t *hfilters[JPC_QMFB1D_MAXCHANS]; jas_seq2d_t *vfilters[JPC_QMFB1D_MAXCHANS]; int numhchans; int numvchans; jas_seq_t *tmpseq; hseq = 0; vseq = 0; if (!(hseq = jas_seq_create(0, 1))) { goto error; } jas_seq_set(hseq, 0, jpc_inttofix(1)); if (!(vseq = jas_seq_create(0, 1))) { goto error; } jas_seq_set(vseq, 0, jpc_inttofix(1)); node = tsfbnode; while (node) { if (node->hqmfb) { numhchans = jpc_qmfb1d_getnumchans(node->hqmfb); if (jpc_qmfb1d_getsynfilters(node->hqmfb, width, hfilters)) { goto error; } if (!(tmpseq = jpc_seq_upsample(hseq, numhchans))) { goto error; } jas_seq_destroy(hseq); hseq = tmpseq; if (!(tmpseq = jpc_seq_conv(hseq, hfilters[bandnotohind(node, cldind)]))) { goto error; } jas_seq_destroy(hfilters[0]); jas_seq_destroy(hfilters[1]); jas_seq_destroy(hseq); hseq = tmpseq; } if (node->vqmfb) { numvchans = jpc_qmfb1d_getnumchans(node->vqmfb); if (jpc_qmfb1d_getsynfilters(node->vqmfb, height, vfilters)) { abort(); } if (!(tmpseq = jpc_seq_upsample(vseq, numvchans))) { goto error; } jas_seq_destroy(vseq); vseq = tmpseq; if (!(tmpseq = jpc_seq_conv(vseq, vfilters[bandnotovind(node, cldind)]))) { goto error; } jas_seq_destroy(vfilters[0]); jas_seq_destroy(vfilters[1]); jas_seq_destroy(vseq); vseq = tmpseq; } if (node->parent) { cldind = jpc_tsfbnode_findchild(node->parent, node); } node = node->parent; } *hfilter = hseq; *vfilter = vseq; return 0; error: if (hseq) { jas_seq_destroy(hseq); } if (vseq) { jas_seq_destroy(vseq); } return -1; }