| Index: core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c
|
| diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c
|
| index 5646896315a5571822ccfb7dfc887cb65e6fe1cf..11b72a33ffeb73c7e3ad55b4bb8726cb8bf5e2f9 100644
|
| --- a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c
|
| +++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c
|
| @@ -496,7 +496,7 @@ void opj_t1_enc_sigpass(opj_t1_t *t1,
|
| opj_t1_enc_sigpass_step(
|
| t1,
|
| &t1->flags[((j+1) * t1->flags_stride) + i + 1],
|
| - &t1->data[(j * t1->w) + i],
|
| + &t1->data[(j * t1->data_stride) + i],
|
| orient,
|
| bpno,
|
| one,
|
| @@ -718,7 +718,7 @@ void opj_t1_enc_refpass(
|
| opj_t1_enc_refpass_step(
|
| t1,
|
| &t1->flags[((j+1) * t1->flags_stride) + i + 1],
|
| - &t1->data[(j * t1->w) + i],
|
| + &t1->data[(j * t1->data_stride) + i],
|
| bpno,
|
| one,
|
| nmsedec,
|
| @@ -970,7 +970,7 @@ void opj_t1_enc_clnpass(
|
| }
|
| if (agg) {
|
| for (runlen = 0; runlen < 4; ++runlen) {
|
| - if (opj_int_abs(t1->data[((k + runlen)*t1->w) + i]) & one)
|
| + if (opj_int_abs(t1->data[((k + runlen)*t1->data_stride) + i]) & one)
|
| break;
|
| }
|
| opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
|
| @@ -989,7 +989,7 @@ void opj_t1_enc_clnpass(
|
| opj_t1_enc_clnpass_step(
|
| t1,
|
| &t1->flags[((j+1) * t1->flags_stride) + i + 1],
|
| - &t1->data[(j * t1->w) + i],
|
| + &t1->data[(j * t1->data_stride) + i],
|
| orient,
|
| bpno,
|
| one,
|
| @@ -1166,17 +1166,19 @@ OPJ_BOOL opj_t1_allocate_buffers(
|
| OPJ_UINT32 datasize=w * h;
|
| OPJ_UINT32 flagssize;
|
|
|
| - if(datasize > t1->datasize){
|
| - opj_aligned_free(t1->data);
|
| - t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
|
| - if(!t1->data){
|
| - /* FIXME event manager error callback */
|
| - return OPJ_FALSE;
|
| + /* encoder uses tile buffer, so no need to allocate */
|
| + if (!t1->encoder) {
|
| + if(datasize > t1->datasize){
|
| + opj_aligned_free(t1->data);
|
| + t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
|
| + if(!t1->data){
|
| + /* FIXME event manager error callback */
|
| + return OPJ_FALSE;
|
| + }
|
| + t1->datasize=datasize;
|
| }
|
| - t1->datasize=datasize;
|
| + memset(t1->data,0,datasize * sizeof(OPJ_INT32));
|
| }
|
| - memset(t1->data,0,datasize * sizeof(OPJ_INT32));
|
| -
|
| t1->flags_stride=w+2;
|
| flagssize=t1->flags_stride * (h+2);
|
|
|
| @@ -1205,7 +1207,7 @@ OPJ_BOOL opj_t1_allocate_buffers(
|
| * and initializes the look-up tables of the Tier-1 coder/decoder
|
| * @return a new T1 handle if successful, returns NULL otherwise
|
| */
|
| -opj_t1_t* opj_t1_create()
|
| +opj_t1_t* opj_t1_create(OPJ_BOOL isEncoder)
|
| {
|
| opj_t1_t *l_t1 = 00;
|
|
|
| @@ -1226,6 +1228,7 @@ opj_t1_t* opj_t1_create()
|
| opj_t1_destroy(l_t1);
|
| return 00;
|
| }
|
| + l_t1->encoder = isEncoder;
|
|
|
| return l_t1;
|
| }
|
| @@ -1248,7 +1251,8 @@ void opj_t1_destroy(opj_t1_t *p_t1)
|
| opj_raw_destroy(p_t1->raw);
|
| p_t1->raw = 00;
|
|
|
| - if (p_t1->data) {
|
| + /* encoder uses tile buffer, so no need to free */
|
| + if (!p_t1->encoder && p_t1->data) {
|
| opj_aligned_free(p_t1->data);
|
| p_t1->data = 00;
|
| }
|
| @@ -1482,11 +1486,10 @@ OPJ_BOOL opj_t1_encode_cblks( opj_t1_t *t1,
|
|
|
| for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
|
| opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
|
| - OPJ_INT32 * restrict datap;
|
| OPJ_INT32* restrict tiledp;
|
| OPJ_UINT32 cblk_w;
|
| OPJ_UINT32 cblk_h;
|
| - OPJ_UINT32 i, j;
|
| + OPJ_UINT32 i, j, tileIndex=0, tileLineAdvance;
|
|
|
| OPJ_INT32 x = cblk->x0 - band->x0;
|
| OPJ_INT32 y = cblk->y0 - band->y0;
|
| @@ -1507,27 +1510,32 @@ OPJ_BOOL opj_t1_encode_cblks( opj_t1_t *t1,
|
| return OPJ_FALSE;
|
| }
|
|
|
| - datap=t1->data;
|
| cblk_w = t1->w;
|
| cblk_h = t1->h;
|
| + tileLineAdvance = tile_w - cblk_w;
|
|
|
| tiledp=&tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
|
| + t1->data = tiledp;
|
| + t1->data_stride = tile_w;
|
| if (tccp->qmfbid == 1) {
|
| for (j = 0; j < cblk_h; ++j) {
|
| for (i = 0; i < cblk_w; ++i) {
|
| - OPJ_INT32 tmp = tiledp[(j * tile_w) + i];
|
| - datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
|
| + tiledp[tileIndex] <<= T1_NMSEDEC_FRACBITS;
|
| + tileIndex++;
|
| }
|
| + tileIndex += tileLineAdvance;
|
| }
|
| } else { /* if (tccp->qmfbid == 0) */
|
| for (j = 0; j < cblk_h; ++j) {
|
| for (i = 0; i < cblk_w; ++i) {
|
| - OPJ_INT32 tmp = tiledp[(j * tile_w) + i];
|
| - datap[(j * cblk_w) + i] =
|
| + OPJ_INT32 tmp = tiledp[tileIndex];
|
| + tiledp[tileIndex] =
|
| opj_int_fix_mul(
|
| tmp,
|
| bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
|
| + tileIndex++;
|
| }
|
| + tileIndex += tileLineAdvance;
|
| }
|
| }
|
|
|
| @@ -1574,14 +1582,16 @@ void opj_t1_encode_cblk(opj_t1_t *t1,
|
| OPJ_UINT32 passtype;
|
| OPJ_INT32 nmsedec = 0;
|
| OPJ_INT32 max;
|
| - OPJ_UINT32 i;
|
| + OPJ_UINT32 i, j;
|
| OPJ_BYTE type = T1_TYPE_MQ;
|
| OPJ_FLOAT64 tempwmsedec;
|
|
|
| max = 0;
|
| - for (i = 0; i < t1->w * t1->h; ++i) {
|
| - OPJ_INT32 tmp = abs(t1->data[i]);
|
| - max = opj_int_max(max, tmp);
|
| + for (i = 0; i < t1->w; ++i) {
|
| + for (j = 0; j < t1->h; ++j) {
|
| + OPJ_INT32 tmp = abs(t1->data[i + j*t1->data_stride]);
|
| + max = opj_int_max(max, tmp);
|
| + }
|
| }
|
|
|
| cblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS) : 0;
|
|
|