j2k[c/h] j2kdec.c: Implement 2 code block styles
This commit is contained in:
		
				
					committed by
					
						
						Michael Niedermayer
					
				
			
			
				
	
			
			
			
						parent
						
							cbe60f3451
						
					
				
				
					commit
					88e9397ef1
				
			@@ -105,17 +105,19 @@ static void tag_tree_zero(J2kTgtNode *t, int w, int h)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
uint8_t ff_j2k_nbctxno_lut[256][4];
 | 
					uint8_t ff_j2k_nbctxno_lut[256][4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int getnbctxno(int flag, int bandno)
 | 
					static int getnbctxno(int flag, int bandno, int vert_causal_ctx_csty_symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int h, v, d;
 | 
					    int h, v, d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    h = ((flag & J2K_T1_SIG_E) ? 1:0)+
 | 
					    h = ((flag & J2K_T1_SIG_E) ? 1:0)+
 | 
				
			||||||
        ((flag & J2K_T1_SIG_W) ? 1:0);
 | 
					        ((flag & J2K_T1_SIG_W) ? 1:0);
 | 
				
			||||||
    v = ((flag & J2K_T1_SIG_N) ? 1:0)+
 | 
					    v = ((flag & J2K_T1_SIG_N) ? 1:0);
 | 
				
			||||||
        ((flag & J2K_T1_SIG_S) ? 1:0);
 | 
					    if (!vert_causal_ctx_csty_symbol)
 | 
				
			||||||
 | 
					         v = v + ((flag & J2K_T1_SIG_S) ? 1:0);
 | 
				
			||||||
    d = ((flag & J2K_T1_SIG_NE) ? 1:0)+
 | 
					    d = ((flag & J2K_T1_SIG_NE) ? 1:0)+
 | 
				
			||||||
        ((flag & J2K_T1_SIG_NW) ? 1:0)+
 | 
					        ((flag & J2K_T1_SIG_NW) ? 1:0);
 | 
				
			||||||
        ((flag & J2K_T1_SIG_SE) ? 1:0)+
 | 
					    if (!vert_causal_ctx_csty_symbol)
 | 
				
			||||||
 | 
					        d = d + ((flag & J2K_T1_SIG_SE) ? 1:0)+
 | 
				
			||||||
                ((flag & J2K_T1_SIG_SW) ? 1:0);
 | 
					                ((flag & J2K_T1_SIG_SW) ? 1:0);
 | 
				
			||||||
    if (bandno < 3){
 | 
					    if (bandno < 3){
 | 
				
			||||||
            if (bandno == 1)
 | 
					            if (bandno == 1)
 | 
				
			||||||
@@ -171,7 +173,7 @@ void ff_j2k_init_tier1_luts(void)
 | 
				
			|||||||
    int i, j;
 | 
					    int i, j;
 | 
				
			||||||
    for (i = 0; i < 256; i++)
 | 
					    for (i = 0; i < 256; i++)
 | 
				
			||||||
        for (j = 0; j < 4; j++)
 | 
					        for (j = 0; j < 4; j++)
 | 
				
			||||||
            ff_j2k_nbctxno_lut[i][j] = getnbctxno(i, j);
 | 
					            ff_j2k_nbctxno_lut[i][j] = getnbctxno(i, j, 0);
 | 
				
			||||||
    for (i = 0; i < 16; i++)
 | 
					    for (i = 0; i < 16; i++)
 | 
				
			||||||
        for (j = 0; j < 16; j++)
 | 
					        for (j = 0; j < 16; j++)
 | 
				
			||||||
            ff_j2k_sgnctxno_lut[i][j] = getsgnctxno(i + (j << 8), &ff_j2k_xorbit_lut[i][j]);
 | 
					            ff_j2k_sgnctxno_lut[i][j] = getsgnctxno(i + (j << 8), &ff_j2k_xorbit_lut[i][j]);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -208,7 +208,7 @@ void ff_j2k_set_significant(J2kT1Context *t1, int x, int y, int negative);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
extern uint8_t ff_j2k_nbctxno_lut[256][4];
 | 
					extern uint8_t ff_j2k_nbctxno_lut[256][4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int ff_j2k_getnbctxno(int flag, int bandno)
 | 
					static inline int ff_j2k_getnbctxno(int flag, int bandno, int vert_causal_ctx_csty_symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return ff_j2k_nbctxno_lut[flag&255][bandno];
 | 
					    return ff_j2k_nbctxno_lut[flag&255][bandno];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -592,7 +592,8 @@ static int decode_packets(J2kDecoderContext *s, J2kTile *tile)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TIER-1 routines */
 | 
					/* TIER-1 routines */
 | 
				
			||||||
static void decode_sigpass(J2kT1Context *t1, int width, int height, int bpno, int bandno)
 | 
					static void decode_sigpass(J2kT1Context *t1, int width, int height, int bpno, int bandno, int bpass_csty_symbol,
 | 
				
			||||||
 | 
					                           int vert_causal_ctx_csty_symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int mask = 3 << (bpno - 1), y0, x, y;
 | 
					    int mask = 3 << (bpno - 1), y0, x, y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -601,10 +602,15 @@ static void decode_sigpass(J2kT1Context *t1, int width, int height, int bpno, in
 | 
				
			|||||||
            for (y = y0; y < height && y < y0+4; y++){
 | 
					            for (y = y0; y < height && y < y0+4; y++){
 | 
				
			||||||
                if ((t1->flags[y+1][x+1] & J2K_T1_SIG_NB)
 | 
					                if ((t1->flags[y+1][x+1] & J2K_T1_SIG_NB)
 | 
				
			||||||
                && !(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS))){
 | 
					                && !(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS))){
 | 
				
			||||||
                    if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_j2k_getnbctxno(t1->flags[y+1][x+1], bandno))){
 | 
					                    int vert_causal_ctx_csty_loc_symbol = vert_causal_ctx_csty_symbol && (x == 3 && y == 3);
 | 
				
			||||||
 | 
					                    if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_j2k_getnbctxno(t1->flags[y+1][x+1], bandno,
 | 
				
			||||||
 | 
					                                      vert_causal_ctx_csty_loc_symbol))){
 | 
				
			||||||
                        int xorbit, ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
 | 
					                        int xorbit, ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
 | 
				
			||||||
 | 
					                        if (bpass_csty_symbol)
 | 
				
			||||||
                        t1->data[y][x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ? -mask : mask;
 | 
					                             t1->data[y][x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask;
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                             t1->data[y][x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ?
 | 
				
			||||||
 | 
					                                               -mask : mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        ff_j2k_set_significant(t1, x, y, t1->data[y][x] < 0);
 | 
					                        ff_j2k_set_significant(t1, x, y, t1->data[y][x] < 0);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -658,7 +664,8 @@ static void decode_clnpass(J2kDecoderContext *s, J2kT1Context *t1, int width, in
 | 
				
			|||||||
            for (y = y0 + runlen; y < y0 + 4 && y < height; y++){
 | 
					            for (y = y0 + runlen; y < y0 + 4 && y < height; y++){
 | 
				
			||||||
                if (!dec){
 | 
					                if (!dec){
 | 
				
			||||||
                    if (!(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS)))
 | 
					                    if (!(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS)))
 | 
				
			||||||
                        dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_j2k_getnbctxno(t1->flags[y+1][x+1], bandno));
 | 
					                        dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_j2k_getnbctxno(t1->flags[y+1][x+1],
 | 
				
			||||||
 | 
					                                                                                             bandno, 0));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (dec){
 | 
					                if (dec){
 | 
				
			||||||
                    int xorbit, ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
 | 
					                    int xorbit, ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
 | 
				
			||||||
@@ -685,7 +692,7 @@ static void decode_clnpass(J2kDecoderContext *s, J2kT1Context *t1, int width, in
 | 
				
			|||||||
static int decode_cblk(J2kDecoderContext *s, J2kCodingStyle *codsty, J2kT1Context *t1, J2kCblk *cblk,
 | 
					static int decode_cblk(J2kDecoderContext *s, J2kCodingStyle *codsty, J2kT1Context *t1, J2kCblk *cblk,
 | 
				
			||||||
                       int width, int height, int bandpos)
 | 
					                       int width, int height, int bandpos)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1, y;
 | 
					    int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1, y, clnpass_cnt = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (y = 0; y < height+2; y++)
 | 
					    for (y = 0; y < height+2; y++)
 | 
				
			||||||
        memset(t1->flags[y], 0, (width+2)*sizeof(int));
 | 
					        memset(t1->flags[y], 0, (width+2)*sizeof(int));
 | 
				
			||||||
@@ -697,14 +704,23 @@ static int decode_cblk(J2kDecoderContext *s, J2kCodingStyle *codsty, J2kT1Contex
 | 
				
			|||||||
    cblk->data[cblk->length] = 0xff;
 | 
					    cblk->data[cblk->length] = 0xff;
 | 
				
			||||||
    cblk->data[cblk->length+1] = 0xff;
 | 
					    cblk->data[cblk->length+1] = 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int bpass_csty_symbol = J2K_CBLK_BYPASS & codsty->cblk_style;
 | 
				
			||||||
 | 
					    int vert_causal_ctx_csty_symbol = J2K_CBLK_VSC & codsty->cblk_style;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while(passno--){
 | 
					    while(passno--){
 | 
				
			||||||
        switch(pass_t){
 | 
					        switch(pass_t){
 | 
				
			||||||
            case 0: decode_sigpass(t1, width, height, bpno+1, bandpos);
 | 
					            case 0: decode_sigpass(t1, width, height, bpno+1, bandpos,
 | 
				
			||||||
 | 
					                                  bpass_csty_symbol && (clnpass_cnt >= 4), vert_causal_ctx_csty_symbol);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            case 1: decode_refpass(t1, width, height, bpno+1);
 | 
					            case 1: decode_refpass(t1, width, height, bpno+1);
 | 
				
			||||||
 | 
					                    if (bpass_csty_symbol && clnpass_cnt >= 4)
 | 
				
			||||||
 | 
					                        ff_mqc_initdec(&t1->mqc, cblk->data);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            case 2: decode_clnpass(s, t1, width, height, bpno+1, bandpos,
 | 
					            case 2: decode_clnpass(s, t1, width, height, bpno+1, bandpos,
 | 
				
			||||||
                                   codsty->cblk_style & J2K_CBLK_SEGSYM);
 | 
					                                   codsty->cblk_style & J2K_CBLK_SEGSYM);
 | 
				
			||||||
 | 
					                    clnpass_cnt = clnpass_cnt + 1;
 | 
				
			||||||
 | 
					                    if (bpass_csty_symbol && clnpass_cnt >= 4)
 | 
				
			||||||
 | 
					                       ff_mqc_initdec(&t1->mqc, cblk->data);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user