diff options
| author | Mickael Savinaud <savmickael@users.noreply.github.com> | 2011-10-05 16:27:16 +0000 |
|---|---|---|
| committer | Mickael Savinaud <savmickael@users.noreply.github.com> | 2011-10-05 16:27:16 +0000 |
| commit | ee0e8a3aadbf56004ff51649cfe5d06cb5c61326 (patch) | |
| tree | c049eec446b8d43cbb3ff6d3e6e7396a9d1ec647 /libopenjpeg/dwt.c | |
| parent | f4734d6b4dd45e744b6f088414486353721d4b4c (diff) | |
[trunk] WIP: fix the decoding process with conformance files and V2 framework
Diffstat (limited to 'libopenjpeg/dwt.c')
| -rw-r--r-- | libopenjpeg/dwt.c | 108 |
1 files changed, 60 insertions, 48 deletions
diff --git a/libopenjpeg/dwt.c b/libopenjpeg/dwt.c index bb40fd02..0f08806a 100644 --- a/libopenjpeg/dwt.c +++ b/libopenjpeg/dwt.c @@ -764,8 +764,10 @@ static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, in float* restrict bi = (float*) (w->wavelet + w->cas); int count = w->sn; int i, k; + for(k = 0; k < 2; ++k){ - if (count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0) { + if (count + 3 * x < size && ((size_t) a & 0x0f) == 0 && + ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0) { /* Fast code path */ for(i = 0; i < count; ++i){ int j = i; @@ -777,22 +779,24 @@ static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, in j += x; bi[i*8 + 3] = a[j]; } - } else { - /* Slow code path */ - for(i = 0; i < count; ++i){ - int j = i; - bi[i*8 ] = a[j]; - j += x; - if(j > size) continue; - bi[i*8 + 1] = a[j]; - j += x; - if(j > size) continue; - bi[i*8 + 2] = a[j]; - j += x; - if(j > size) continue; - bi[i*8 + 3] = a[j]; } + else { + /* Slow code path */ + for(i = 0; i < count; ++i){ + int j = i; + bi[i*8 ] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 1] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 2] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 3] = a[j]; + } } + bi = (float*) (w->wavelet + 1 - w->cas); a += w->sn; size -= w->sn; @@ -1087,58 +1091,66 @@ opj_bool dwt_decode_real_v2(opj_tcd_tilecomp_v2_t* restrict tilec, OPJ_UINT32 nu rh = res->y1 - res->y0; /* height of the resolution level computed */ h.dn = rw - h.sn; - h.cas = res->x0 & 1; + h.cas = res->x0 % 2; - for(j = rh; j > 0; j -= 4) { + for(j = rh; j > 3; j -= 4) { + OPJ_INT32 k; v4dwt_interleave_h(&h, aj, w, bufsize); v4dwt_decode(&h); - if(j >= 4){ - OPJ_INT32 k = rw; - - while (--k >= 0) { - aj[k ] = h.wavelet[k].f[0]; - aj[k+w ] = h.wavelet[k].f[1]; - aj[k+w*2] = h.wavelet[k].f[2]; - aj[k+w*3] = h.wavelet[k].f[3]; - } - } - else { - OPJ_INT32 k = rw; - - while (--k >= 0) { - switch(j) { - case 3: aj[k+w*2] = h.wavelet[k].f[2]; - case 2: aj[k+w ] = h.wavelet[k].f[1]; - case 1: aj[k ] = h.wavelet[k].f[0]; - } - } + for(k = rw; --k >= 0;){ + aj[k ] = h.wavelet[k].f[0]; + aj[k+w ] = h.wavelet[k].f[1]; + aj[k+w*2] = h.wavelet[k].f[2]; + aj[k+w*3] = h.wavelet[k].f[3]; } aj += w*4; bufsize -= w*4; } + if (rh & 0x03) { + int k; + j = rh & 0x03; + v4dwt_interleave_h(&h, aj, w, bufsize); + v4dwt_decode(&h); + for(k = rw; --k >= 0;){ + switch(j) { + case 3: aj[k+w*2] = h.wavelet[k].f[2]; + case 2: aj[k+w ] = h.wavelet[k].f[1]; + case 1: aj[k ] = h.wavelet[k].f[0]; + } + } + } + v.dn = rh - v.sn; v.cas = res->y0 % 2; aj = (OPJ_FLOAT32*) tilec->data; - for(j = rw; j > 0; j -= 4){ + for(j = rw; j > 3; j -= 4){ + OPJ_INT32 k; + v4dwt_interleave_v(&v, aj, w); v4dwt_decode(&v); - if(j >= 4){ - OPJ_UINT32 k; - for(k = 0; k < rh; ++k){ - memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(OPJ_FLOAT32)); - } - }else{ - OPJ_UINT32 k; - for(k = 0; k < rh; ++k){ - memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(OPJ_FLOAT32)); - } + + for(k = 0; k < rh; ++k){ + memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(OPJ_FLOAT32)); } aj += 4; } + + if (rw & 0x03){ + OPJ_INT32 k; + + j = rw & 0x03; + + v4dwt_interleave_v(&v, aj, w); + v4dwt_decode(&v); + + for(k = 0; k < rh; ++k){ + memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(OPJ_FLOAT32)); + } + } } opj_aligned_free(h.wavelet); |
