⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ebcot_lite_decode_passes.c

📁 JPEG2000实现的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
                    goto skip2;
new_sig2:         /* New significant value; update contexts & get sign. */
                  val = ebcot_sc_lut[(d_ctxt_1>>SIGN_POS_0)&0x000F];
                  csp = csp_base + SC_OFFSET + (val & 0x000F);
                  val &= MIN_IFC_INT;
                  dst_get_symbol_skewed(areg,creg,thresh,cum_delta,
                                        ct,state,symbol,csp);
                  val ^= (symbol << (IMPLEMENTATION_PRECISION-1));
                  su_flags |= 0x100;
                  if (val)
                    { /* Negative sample. */
                      d_ctxt_0     |= BC_SIG_1 | V_NVE_SIG_1;
                      d_ctxt_1     |= SELF_SIG_0 | TC_SIG_1 | V_NVE_SIG_1;
                      d_cp[-2]     |= BR_SIG_1;
                      d_cp[-1]     |= TR_SIG_1 | CR_SIG_0 | H_NVE_SIG_0;
                      d_cp[2]      |= BL_SIG_1;
                      d_cp[3]      |= TL_SIG_1 | CL_SIG_0 | H_NVE_SIG_0;
                    }
                  else
                    { /* Positive sample. */
                      d_ctxt_0     |= BC_SIG_1 | V_PVE_SIG_1;
                      d_ctxt_1     |= SELF_SIG_0 | TC_SIG_1 | V_PVE_SIG_1;
                      d_cp[-2]     |= BR_SIG_1;
                      d_cp[-1]     |= TR_SIG_1 | CR_SIG_0 | H_PVE_SIG_0;
                      d_cp[2]      |= BL_SIG_1;
                      d_cp[3]      |= TL_SIG_1 | CL_SIG_0 | H_PVE_SIG_0;
                    }
                  val |= lsb + (lsb>>1);
                  dp[2] = val; /* Write new non-zero value back to buffer. */
                }
skip2:
              if (!(d_ctxt_1 & (SELF_SIG_1 | OUT_OF_BOUNDS_1 | IS_REFINED_1)))
                {
                  csp = csp_base +
                    (ZC_OFFSET + zc_lut[(d_ctxt_1 >> ZC_SHIFT_1) & 0x00FF]);
                  cum_delta += csp[DST_ARITH_MAX_CTXTS];
                  if (cum_delta <= thresh)
                    {
                      _addto_symbol_count(1);
#ifdef DST_LOG_SYMBOLS
                      dst_arith_coder__check_logged_symbol(state,csp,0);
#endif
                      goto skip3;
                    }
                  dst_get_symbol_skewed_failed(areg,creg,thresh,cum_delta,
                                               ct,state,symbol,csp);
                  if (!symbol)
                    goto skip3;
new_sig3:         /* New significant value; update contexts & get sign. */
                  val = ebcot_sc_lut[(d_ctxt_1>>SIGN_POS_1)&0x000F];
                  csp = csp_base + SC_OFFSET + (val & 0x000F);
                  val &= MIN_IFC_INT;
                  dst_get_symbol_skewed(areg,creg,thresh,cum_delta,
                                        ct,state,symbol,csp);
                  val ^= (symbol << (IMPLEMENTATION_PRECISION-1));
                  su_flags |= 0x100;
                  sup[sup_gap-2] |= 1<<(16-i);
                  if (val)
                    { /* Negative sample. */
                      d_ctxt_1     |= SELF_SIG_1 | BC_SIG_0 | V_NVE_SIG_0;
                      d_cp[-1]     |= BR_SIG_0 | CR_SIG_1 | H_NVE_SIG_1;
                      d_cp[3]      |= BL_SIG_0 | CL_SIG_1 | H_NVE_SIG_1;
                      d_cp[d_stripe_gap-2]     |= TR_SIG_0;
                      d_cp[d_stripe_gap]       |= TC_SIG_0 | V_NVE_SIG_0;
                      d_cp[d_stripe_gap+2]     |= TL_SIG_0;
                    }
                  else
                    { /* Positive sample. */
                      d_ctxt_1     |= SELF_SIG_1 | BC_SIG_0 | V_PVE_SIG_0;
                      d_cp[-1]     |= BR_SIG_0 | CR_SIG_1 | H_PVE_SIG_1;
                      d_cp[3]      |= BL_SIG_0 | CL_SIG_1 | H_PVE_SIG_1;
                      d_cp[d_stripe_gap-2]     |= TR_SIG_0;
                      d_cp[d_stripe_gap]       |= TC_SIG_0 | V_PVE_SIG_0;
                      d_cp[d_stripe_gap+2]     |= TL_SIG_0;
                    }
                  val |= lsb + (lsb>>1);
                  dp[3] = val; /* Write new non-zero value to buffer. */
                }
skip3:
              d_ctxt_1 &= ~(IS_REFINED_0 | IS_REFINED_1);
              d_cp[0] = d_ctxt_0; d_cp[1] = d_ctxt_1;
            }
          sup[-2] = (su_flags & 0x00FF) << 8;
        }
    }
  areg -= cum_delta; creg -= ((unsigned) cum_delta) << 16;
  state->mqd.areg = areg; state->mqd.creg = creg; state->mqd.ct = ct;
}

/*****************************************************************************/
/* STATIC               su_raw_zero_refinement_pass_func                     */
/*****************************************************************************/

static void
  su_raw_zero_refinement_pass_func(block_master_ptr master)
{
  register std_int su_flags;
  register int i;
  register std_int d_ctxt_0, d_ctxt_1;
  register std_int *d_cp;
      /* Note: it is most beneficial if the above five variables are
         held in registers. */
  register ifc_int *dp;
  register ifc_int shift;
  register ifc_int symbol, val;
  register dst_arith_state_ptr state;
  register std_int word;
  register int current_lsb;
  ifc_int lsb;
  std_int *supp, *sup;
  std_int non_causal;
  int eighth_cols, d_stripe_gap, sup_gap, r, c;

  shift = master->bit_idx - 1;
  lsb = 1 << shift;
  state = &(master->coder_state);
  word = state->word; current_lsb = state->current_lsb;
  non_causal = 1 - master->causal;
  eighth_cols = (master->width+7)>>3;
  d_stripe_gap = (master->interleaved_row_gap >> 1);
  sup_gap = master->speed_up_row_gap;
  d_cp = (std_int *)(master->interleaved_context_buffer);
  dp = master->interleaved_sample_buffer;
  supp = master->speed_up_buffer;
  for (r=master->stripes; r > 0; r--,
       dp+=(d_stripe_gap<<1)-(eighth_cols<<5),
       d_cp+=d_stripe_gap-(eighth_cols<<4),
       supp+=sup_gap)
    {
      sup = supp;
      su_flags = *(sup++);
      for (c=eighth_cols; c > 0; c--)
        {
          su_flags |= *(sup++) << 8;
          for (i=8; i > 0; i--, dp+=4, d_cp+=2, su_flags>>=1)
            {
              if ((su_flags & 0x00000380) == 0)
                continue; /* Whole column has insignificant neighbours. */
              d_ctxt_0 = d_cp[0]; d_ctxt_1 = d_cp[1];
              if ((d_ctxt_0 & ZC_MASK_0) &&
                  !(d_ctxt_0 & (IS_REFINED_0|SELF_SIG_0|OUT_OF_BOUNDS_0)))
                {
                  d_ctxt_0 |= IS_REFINED_0;
                  dst_get_raw_bit(current_lsb,word,symbol,state);
                  if (symbol)
                    { /* New significant value; update contexts & code sign */
                      dst_get_raw_bit(current_lsb,word,symbol,state);
                      val = symbol << (IMPLEMENTATION_PRECISION-1);
                      su_flags |= 0x100;
                      if (val)
                        { /* Negative sample. */
                          d_ctxt_0     |= SELF_SIG_0 | TC_SIG_1 | V_NVE_SIG_1;
                          d_cp[-2]     |= TR_SIG_1 | CR_SIG_0 | H_NVE_SIG_0;
                          d_cp[2]      |= TL_SIG_1 | CL_SIG_0 | H_NVE_SIG_0;
                          if (non_causal)
                            {
                              d_cp[-d_stripe_gap-1] |= BR_SIG_1;
                              d_cp[-d_stripe_gap+1] |= BC_SIG_1 | V_NVE_SIG_1;
                              d_cp[-d_stripe_gap+3] |= BL_SIG_1;
                              sup[-sup_gap-2] |= 1<<(16-i);
                            }
                        }
                      else
                        { /* Positive sample. */
                          d_ctxt_0     |= SELF_SIG_0 | TC_SIG_1 | V_PVE_SIG_1;
                          d_cp[-2]     |= TR_SIG_1 | CR_SIG_0 | H_PVE_SIG_0;
                          d_cp[2]      |= TL_SIG_1 | CL_SIG_0 | H_PVE_SIG_0;
                          if (non_causal)
                            {
                              d_cp[-d_stripe_gap-1] |= BR_SIG_1;
                              d_cp[-d_stripe_gap+1] |= BC_SIG_1 | V_PVE_SIG_1;
                              d_cp[-d_stripe_gap+3] |= BL_SIG_1;
                              sup[-sup_gap-2] |= 1<<(16-i);
                            }
                        }
                      val |= lsb + (lsb>>1);
                      dp[0] = val;
                    }
                }

              if ((d_ctxt_0 & ZC_MASK_1) &&
                  !(d_ctxt_0 & (IS_REFINED_1|SELF_SIG_1|OUT_OF_BOUNDS_1)))
                {
                  d_ctxt_0 |= IS_REFINED_1;
                  dst_get_raw_bit(current_lsb,word,symbol,state);
                  if (symbol)
                    { /* New significant value; update contexts & code sign */
                      dst_get_raw_bit(current_lsb,word,symbol,state);
                      val = symbol << (IMPLEMENTATION_PRECISION-1);
                      su_flags |= 0x100;
                      if (val)
                        { /* Negative sample. */
                          d_ctxt_0     |= SELF_SIG_1 | BC_SIG_0 | V_NVE_SIG_0;
                          d_ctxt_1     |= TC_SIG_0 | V_NVE_SIG_0;
                          d_cp[-2]     |= BR_SIG_0 | CR_SIG_1 | H_NVE_SIG_1;
                          d_cp[-1]     |= TR_SIG_0;
                          d_cp[2]      |= BL_SIG_0 | CL_SIG_1 | H_NVE_SIG_1;
                          d_cp[3]      |= TL_SIG_0;
                        }
                      else
                        { /* Positive sample. */
                          d_ctxt_0     |= SELF_SIG_1 | BC_SIG_0 | V_PVE_SIG_0;
                          d_ctxt_1     |= TC_SIG_0 | V_PVE_SIG_0;
                          d_cp[-2]     |= BR_SIG_0 | CR_SIG_1 | H_PVE_SIG_1;
                          d_cp[-1]     |= TR_SIG_0;
                          d_cp[2]      |= BL_SIG_0 | CL_SIG_1 | H_PVE_SIG_1;
                          d_cp[3]      |= TL_SIG_0;
                        }
                      val |= lsb + (lsb>>1);
                      dp[1] = val;
                    }
                }

              if ((d_ctxt_1 & ZC_MASK_0) &&
                  !(d_ctxt_1 & (IS_REFINED_0|SELF_SIG_0|OUT_OF_BOUNDS_0)))
                {
                  d_ctxt_1 |= IS_REFINED_0;
                  dst_get_raw_bit(current_lsb,word,symbol,state);
                  if (symbol)
                    { /* New significant value; update contexts & code sign */
                      dst_get_raw_bit(current_lsb,word,symbol,state);
                      val = symbol << (IMPLEMENTATION_PRECISION-1);
                      su_flags |= 0x100;
                      if (val)
                        { /* Negative sample. */
                          d_ctxt_0     |= BC_SIG_1 | V_NVE_SIG_1;
                          d_ctxt_1     |= SELF_SIG_0 | TC_SIG_1 | V_NVE_SIG_1;
                          d_cp[-2]     |= BR_SIG_1;
                          d_cp[-1]     |= TR_SIG_1 | CR_SIG_0 | H_NVE_SIG_0;
                          d_cp[2]      |= BL_SIG_1;
                          d_cp[3]      |= TL_SIG_1 | CL_SIG_0 | H_NVE_SIG_0;
                        }
                      else
                        { /* Positive sample. */
                          d_ctxt_0     |= BC_SIG_1 | V_PVE_SIG_1;
                          d_ctxt_1     |= SELF_SIG_0 | TC_SIG_1 | V_PVE_SIG_1;
                          d_cp[-2]     |= BR_SIG_1;
                          d_cp[-1]     |= TR_SIG_1 | CR_SIG_0 | H_PVE_SIG_0;
                          d_cp[2]      |= BL_SIG_1;
                          d_cp[3]      |= TL_SIG_1 | CL_SIG_0 | H_PVE_SIG_0;
                        }
                      val |= lsb + (lsb>>1);
                      dp[2] = val;
                    }
                }

              if ((d_ctxt_1 & ZC_MASK_1) &&
                  !(d_ctxt_1 & (IS_REFINED_1|SELF_SIG_1|OUT_OF_BOUNDS_1)))
                {
                  d_ctxt_1 |= IS_REFINED_1;
                  dst_get_raw_bit(current_lsb,word,symbol,state);
                  if (symbol)
                    { /* New significant value; update contexts & code sign */
                      dst_get_raw_bit(current_lsb,word,symbol,state);
                      val = symbol << (IMPLEMENTATION_PRECISION-1);
                      su_flags |= 0x100;
                      sup[sup_gap-2] |= 1<<(16-i);
                      if (val)
                        { /* Negative sample. */
                          d_ctxt_1     |= SELF_SIG_1 | BC_SIG_0 | V_NVE_SIG_0;
                          d_cp[-1]     |= BR_SIG_0 | CR_SIG_1 | H_NVE_SIG_1;
                          d_cp[3]      |= BL_SIG_0 | CL_SIG_1 | H_NVE_SIG_1;
                          d_cp[d_stripe_gap-2]     |= TR_SIG_0;
                          d_cp[d_stripe_gap]       |= TC_SIG_0 | V_NVE_SIG_0;
                          d_cp[d_stripe_gap+2]     |= TL_SIG_0;
                        }
                      else
                        { /* Positive sample. */
                          d_ctxt_1     |= SELF_SIG_1 | BC_SIG_0 | V_PVE_SIG_0;
                          d_cp[-1]     |= BR_SIG_0 | CR_SIG_1 | H_PVE_SIG_1;
                          d_cp[3]      |= BL_SIG_0 | CL_SIG_1 | H_PVE_SIG_1;
                          d_cp[d_stripe_gap-2]     |= TR_SIG_0;
                          d_cp[d_stripe_gap]       |= TC_SIG_0 | V_PVE_SIG_0;
                          d_cp[d_stripe_gap+2]     |= TL_SIG_0;
                        }
                      val |= lsb + (lsb>>1);
                      dp[3] = val;
                    }
                }
              d_cp[0] = d_ctxt_0; d_cp[1] = d_ctxt_1;
            }
          sup[-2] = (su_flags & 0x00FF) << 8;
        }
    }
  state->current_lsb = current_lsb; state->word = word;
}

/*****************************************************************************/
/* STATIC                  su_zero_refinement_pass_func                      */
/*****************************************************************************/

static void
  su_zero_refinement_pass_func(block_master_ptr master)

 /* This function refines all samples which have not yet been found to be
    significant and whose context word matches that supplied by the
    `context_mask' field in `ma

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -