]> granicus.if.org Git - openjpeg/commitdiff
[trunk] check number of components when getting mct norm (fixes issue 436)
authorAntonin Descampe <antonin@gmail.com>
Tue, 9 Dec 2014 12:09:08 +0000 (12:09 +0000)
committerAntonin Descampe <antonin@gmail.com>
Tue, 9 Dec 2014 12:09:08 +0000 (12:09 +0000)
src/lib/openjp2/j2k.c
src/lib/openjp2/t1.c
src/lib/openjp2/t1.h
src/lib/openjp2/tcd.c

index c93b558f56641bd01c8796567cc6eac16074276e..ff00d7c4d4c8bb0f045736861bceeb89e06cd8ba 100644 (file)
@@ -6571,7 +6571,7 @@ OPJ_BOOL opj_j2k_setup_encoder(     opj_j2k_t *p_j2k,
                     }
                 }
                 else {
-                    if(tcp->mct==1 && image->numcomps == 3) { /* RGB->YCC MCT is enabled */
+                    if(tcp->mct==1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
                         if ((image->comps[0].dx != image->comps[1].dx) ||
                                 (image->comps[0].dx != image->comps[2].dx) ||
                                 (image->comps[0].dy != image->comps[1].dy) ||
index 11b72a33ffeb73c7e3ad55b4bb8726cb8bf5e2f9..e61cd3c94a6f18dd4899403fa824d7e971b72c13 100644 (file)
@@ -265,7 +265,8 @@ static OPJ_FLOAT64 opj_t1_getwmsedec(
                OPJ_UINT32 qmfbid,
                OPJ_FLOAT64 stepsize,
                OPJ_UINT32 numcomps,
-               const OPJ_FLOAT64 * mct_norms);
+               const OPJ_FLOAT64 * mct_norms,
+               OPJ_UINT32 mct_numcomps);
 
 static void opj_t1_encode_cblk( opj_t1_t *t1,
                                 opj_tcd_cblk_enc_t* cblk,
@@ -277,7 +278,8 @@ static void opj_t1_encode_cblk( opj_t1_t *t1,
                                 OPJ_UINT32 cblksty,
                                 OPJ_UINT32 numcomps,
                                 opj_tcd_tile_t * tile,
-                                const OPJ_FLOAT64 * mct_norms);
+                                const OPJ_FLOAT64 * mct_norms,
+                                OPJ_UINT32 mct_numcomps);
 
 /**
 Decode 1 code-block
@@ -1137,12 +1139,13 @@ static OPJ_FLOAT64 opj_t1_getwmsedec(
                OPJ_UINT32 qmfbid,
                OPJ_FLOAT64 stepsize,
                OPJ_UINT32 numcomps,
-               const OPJ_FLOAT64 * mct_norms)
+               const OPJ_FLOAT64 * mct_norms,
+               OPJ_UINT32 mct_numcomps)
 {
        OPJ_FLOAT64 w1 = 1, w2, wmsedec;
-    OPJ_ARG_NOT_USED(numcomps);
+       OPJ_ARG_NOT_USED(numcomps);
 
-       if (mct_norms) {
+       if (mct_norms && (compno < mct_numcomps)) {
                w1 = mct_norms[compno];
        }
 
@@ -1462,7 +1465,8 @@ OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
 OPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,
                                 opj_tcd_tile_t *tile,
                                 opj_tcp_t *tcp,
-                                const OPJ_FLOAT64 * mct_norms
+                                const OPJ_FLOAT64 * mct_norms,
+                                OPJ_UINT32 mct_numcomps
                                 )
 {
        OPJ_UINT32 compno, resno, bandno, precno, cblkno;
@@ -1550,7 +1554,8 @@ OPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,
                                                                tccp->cblksty,
                                                                tile->numcomps,
                                                                tile,
-                                                               mct_norms);
+                                                               mct_norms,
+                                                               mct_numcomps);
 
                                        } /* cblkno */
                                } /* precno */
@@ -1571,7 +1576,8 @@ void opj_t1_encode_cblk(opj_t1_t *t1,
                         OPJ_UINT32 cblksty,
                         OPJ_UINT32 numcomps,
                         opj_tcd_tile_t * tile,
-                        const OPJ_FLOAT64 * mct_norms)
+                        const OPJ_FLOAT64 * mct_norms,
+                        OPJ_UINT32 mct_numcomps)
 {
        OPJ_FLOAT64 cumwmsedec = 0.0;
 
@@ -1626,7 +1632,7 @@ void opj_t1_encode_cblk(opj_t1_t *t1,
                }
 
                /* fixed_quality */
-               tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps,mct_norms) ;
+               tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps,mct_norms, mct_numcomps) ;
                cumwmsedec += tempwmsedec;
                tile->distotile += tempwmsedec;
 
index e1d41ed56f528d1fbcbb147448cd8693afb6af88..3bc0ad9ea7fbc3bb85ae95e87938239b22bb0a27 100644 (file)
@@ -126,11 +126,13 @@ Encode the code-blocks of a tile
 @param tile The tile to encode
 @param tcp Tile coding parameters
 @param mct_norms  FIXME DOC
+@param mct_numcomps Number of components used for MCT
 */
 OPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,
                                 opj_tcd_tile_t *tile,
                                 opj_tcp_t *tcp,
-                                const OPJ_FLOAT64 * mct_norms);
+                                const OPJ_FLOAT64 * mct_norms,
+                                OPJ_UINT32 mct_numcomps);
 
 /**
 Decode the code-blocks of a tile
index 31e05997b7aaf429829ca2e9473a25fd800fdc07..83b02c08a17c16ec0047a60c996c8aa0790622ca 100644 (file)
@@ -1989,6 +1989,7 @@ OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd )
 {
         opj_t1_t * l_t1;
         const OPJ_FLOAT64 * l_mct_norms;
+        OPJ_UINT32 l_mct_numcomps = 0U;
         opj_tcp_t * l_tcp = p_tcd->tcp;
 
         l_t1 = opj_t1_create(OPJ_TRUE);
@@ -1997,6 +1998,7 @@ OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd )
         }
 
         if (l_tcp->mct == 1) {
+                l_mct_numcomps = 3U;
                 /* irreversible encoding */
                 if (l_tcp->tccps->qmfbid == 0) {
                         l_mct_norms = opj_mct_get_mct_norms_real();
@@ -2006,10 +2008,11 @@ OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd )
                 }
         }
         else {
+                l_mct_numcomps = p_tcd->image->numcomps;
                 l_mct_norms = (const OPJ_FLOAT64 *) (l_tcp->mct_norms);
         }
 
-        if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles , l_tcp, l_mct_norms)) {
+        if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles , l_tcp, l_mct_norms, l_mct_numcomps)) {
         opj_t1_destroy(l_t1);
                 return OPJ_FALSE;
         }