📄 jpc_qmfb.c
字号:
ptr = &startptr[((llen - 1) << 1) * step]; n = llen >> 1; tmpptr = buf; while (n-- > 0) { *tmpptr = *ptr; *ptr = *lptr; ++tmpptr; ptr -= twostep; lptr -= step; } n = llen - (llen >> 1); while (n-- > 0) { *ptr = *lptr; ptr -= twostep; lptr -= step; } /* Copy the appropriate samples into the second phase of the output signal (corresponding to odd indexed samples). */ ptr = &startptr[step]; hptr = hstartptr; state = !(llen & 1); n = hlen; while (n-- > 0) { if (state) { --tmpptr; *ptr = *tmpptr; } else { *ptr = *hptr; } hptr += step; ptr += twostep; state ^= 1; } }#if defined(WIN32) /* If the join buffer was allocated on the heap, free this memory. */ if (buf != joinbuf) { jas_free(buf); }#endif}/******************************************************************************\* Code for 5/3 transform.\******************************************************************************/static int jpc_ft_getnumchans(jpc_qmfb1d_t *qmfb){ /* Avoid compiler warnings about unused parameters. */ qmfb = 0; return 2;}static int jpc_ft_getanalfilters(jpc_qmfb1d_t *qmfb, int len, jas_seq2d_t **filters){ /* Avoid compiler warnings about unused parameters. */ qmfb = 0; len = 0; filters = 0; abort(); return -1;}static int jpc_ft_getsynfilters(jpc_qmfb1d_t *qmfb, int len, jas_seq2d_t **filters){ jas_seq_t *lf; jas_seq_t *hf; /* Avoid compiler warnings about unused parameters. */ qmfb = 0; lf = 0; hf = 0; if (len > 1 || (!len)) { if (!(lf = jas_seq_create(-1, 2))) { goto error; } jas_seq_set(lf, -1, jpc_dbltofix(0.5)); jas_seq_set(lf, 0, jpc_dbltofix(1.0)); jas_seq_set(lf, 1, jpc_dbltofix(0.5)); if (!(hf = jas_seq_create(-1, 4))) { goto error; } jas_seq_set(hf, -1, jpc_dbltofix(-0.125)); jas_seq_set(hf, 0, jpc_dbltofix(-0.25)); jas_seq_set(hf, 1, jpc_dbltofix(0.75)); jas_seq_set(hf, 2, jpc_dbltofix(-0.25)); jas_seq_set(hf, 3, jpc_dbltofix(-0.125)); } else if (len == 1) { if (!(lf = jas_seq_create(0, 1))) { goto error; } jas_seq_set(lf, 0, jpc_dbltofix(1.0)); if (!(hf = jas_seq_create(0, 1))) { goto error; } jas_seq_set(hf, 0, jpc_dbltofix(2.0)); } else { abort(); } filters[0] = lf; filters[1] = hf; return 0;error: if (lf) { jas_seq_destroy(lf); } if (hf) { jas_seq_destroy(hf); } return -1;}#define NFT_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pluseq) \{ \ register jpc_fix_t *lptr = (lstartptr); \ register jpc_fix_t *hptr = (hstartptr); \ register int n = (hendind) - (hstartind); \ if ((hstartind) < (lstartind)) { \ pluseq(*hptr, *lptr); \ hptr += (step); \ --n; \ } \ if ((hendind) >= (lendind)) { \ --n; \ } \ while (n-- > 0) { \ pluseq(*hptr, jpc_fix_asr(jpc_fix_add(*lptr, lptr[(step)]), 1)); \ hptr += (step); \ lptr += (step); \ } \ if ((hendind) >= (lendind)) { \ pluseq(*hptr, *lptr); \ } \}#define NFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pluseq) \{ \ register jpc_fix_t *lptr = (lstartptr); \ register jpc_fix_t *hptr = (hstartptr); \ register int n = (lendind) - (lstartind); \ if ((hstartind) >= (lstartind)) { \ pluseq(*lptr, *hptr); \ lptr += (step); \ --n; \ } \ if ((lendind) > (hendind)) { \ --n; \ } \ while (n-- > 0) { \ pluseq(*lptr, jpc_fix_asr(jpc_fix_add(*hptr, hptr[(step)]), 2)); \ lptr += (step); \ hptr += (step); \ } \ if ((lendind) > (hendind)) { \ pluseq(*lptr, *hptr); \ } \}#define RFT_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pmeqop) \{ \ register jpc_fix_t *lptr = (lstartptr); \ register jpc_fix_t *hptr = (hstartptr); \ register int n = (hendind) - (hstartind); \ if ((hstartind) < (lstartind)) { \ *hptr pmeqop *lptr; \ hptr += (step); \ --n; \ } \ if ((hendind) >= (lendind)) { \ --n; \ } \ while (n-- > 0) { \ *hptr pmeqop (*lptr + lptr[(step)]) >> 1; \ hptr += (step); \ lptr += (step); \ } \ if ((hendind) >= (lendind)) { \ *hptr pmeqop *lptr; \ } \}#define RFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pmeqop) \{ \ register jpc_fix_t *lptr = (lstartptr); \ register jpc_fix_t *hptr = (hstartptr); \ register int n = (lendind) - (lstartind); \ if ((hstartind) >= (lstartind)) { \ *lptr pmeqop ((*hptr << 1) + 2) >> 2; \ lptr += (step); \ --n; \ } \ if ((lendind) > (hendind)) { \ --n; \ } \ while (n-- > 0) { \ *lptr pmeqop ((*hptr + hptr[(step)]) + 2) >> 2; \ lptr += (step); \ hptr += (step); \ } \ if ((lendind) > (hendind)) { \ *lptr pmeqop ((*hptr << 1) + 2) >> 2; \ } \}static void jpc_ft_analyze(jpc_qmfb1d_t *qmfb, int flags, jas_seq2d_t *x){ jpc_fix_t *startptr; int startind; int endind; jpc_fix_t * lstartptr; int lstartind; int lendind; jpc_fix_t * hstartptr; int hstartind; int hendind; int interstep; int intrastep; int numseq; /* Avoid compiler warnings about unused parameters. */ qmfb = 0; if (flags & JPC_QMFB1D_VERT) { interstep = 1; intrastep = jas_seq2d_rowstep(x); numseq = jas_seq2d_width(x); startind = jas_seq2d_ystart(x); endind = jas_seq2d_yend(x); } else { interstep = jas_seq2d_rowstep(x); intrastep = 1; numseq = jas_seq2d_height(x); startind = jas_seq2d_xstart(x); endind = jas_seq2d_xend(x); } assert(startind < endind); startptr = jas_seq2d_getref(x, jas_seq2d_xstart(x), jas_seq2d_ystart(x)); if (flags & JPC_QMFB1D_RITIMODE) { while (numseq-- > 0) { jpc_qmfb1d_setup(startptr, startind, endind, intrastep, &lstartptr, &lstartind, &lendind, &hstartptr, &hstartind, &hendind); if (endind - startind > 1) { jpc_qmfb1d_split(startptr, startind, endind, intrastep, lstartptr, lstartind, lendind, hstartptr, hstartind, hendind); RFT_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, intrastep, -=); RFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, intrastep, +=); } else { if (lstartind == lendind) { *startptr <<= 1; } } startptr += interstep; } } else { while (numseq-- > 0) { jpc_qmfb1d_setup(startptr, startind, endind, intrastep, &lstartptr, &lstartind, &lendind, &hstartptr, &hstartind, &hendind); if (endind - startind > 1) { jpc_qmfb1d_split(startptr, startind, endind, intrastep, lstartptr, lstartind, lendind, hstartptr, hstartind, hendind); NFT_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, intrastep, jpc_fix_minuseq); NFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, intrastep, jpc_fix_pluseq); } else { if (lstartind == lendind) { *startptr = jpc_fix_asl(*startptr, 1); } } startptr += interstep; } }}static void jpc_ft_synthesize(jpc_qmfb1d_t *qmfb, int flags, jas_seq2d_t *x){ jpc_fix_t *startptr; int startind; int endind; jpc_fix_t *lstartptr; int lstartind; int lendind; jpc_fix_t *hstartptr; int hstartind; int hendind; int interstep; int intrastep; int numseq; /* Avoid compiler warnings about unused parameters. */ qmfb = 0; if (flags & JPC_QMFB1D_VERT) { interstep = 1; intrastep = jas_seq2d_rowstep(x); numseq = jas_seq2d_width(x); startind = jas_seq2d_ystart(x); endind = jas_seq2d_yend(x); } else { interstep = jas_seq2d_rowstep(x); intrastep = 1; numseq = jas_seq2d_height(x); startind = jas_seq2d_xstart(x); endind = jas_seq2d_xend(x); } assert(startind < endind); startptr = jas_seq2d_getref(x, jas_seq2d_xstart(x), jas_seq2d_ystart(x)); if (flags & JPC_QMFB1D_RITIMODE) { while (numseq-- > 0) { jpc_qmfb1d_setup(startptr, startind, endind, intrastep, &lstartptr, &lstartind, &lendind, &hstartptr, &hstartind, &hendind); if (endind - startind > 1) { RFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, intrastep, -=); RFT_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, intrastep, +=); jpc_qmfb1d_join(startptr, startind, endind, intrastep, lstartptr, lstartind, lendind, hstartptr, hstartind, hendind); } else { if (lstartind == lendind) { *startptr >>= 1; } } startptr += interstep; } } else { while (numseq-- > 0) { jpc_qmfb1d_setup(startptr, startind, endind, intrastep, &lstartptr, &lstartind, &lendind, &hstartptr, &hstartind, &hendind); if (endind - startind > 1) { NFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, intrastep, jpc_fix_minuseq); NFT_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, intrastep, jpc_fix_pluseq); jpc_qmfb1d_join(startptr, startind, endind, intrastep, lstartptr, lstartind, lendind, hstartptr, hstartind, hendind); } else { if (lstartind == lendind) { *startptr = jpc_fix_asr(*startptr, 1); } } startptr += interstep; } }}/******************************************************************************\* Code for 9/7 transform.\******************************************************************************/static int jpc_ns_getnumchans(jpc_qmfb1d_t *qmfb){ /* Avoid compiler warnings about unused parameters. */ qmfb = 0; return 2;}static int jpc_ns_getanalfilters(jpc_qmfb1d_t *qmfb, int len, jas_seq2d_t **filters){ /* Avoid compiler warnings about unused parameters. */ qmfb = 0; len = 0; filters = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -