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

📄 hpdz_dequant.c

📁 JPEG2000实现的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
{
  hpdz_dequantizer_ref self = (hpdz_dequantizer_ref) base;

  start_tile(self);
  self->decoder->next_tile(self->decoder);
}

/* MITRE General Offset/SQ Begin mods */
/*****************************************************************************/
/* STATIC                      __pull_line_float                             */
/*****************************************************************************/

static void
  __pull_line_float(dequantizer_ref base, float *line_buf,
                    int component_idx, int level_idx, int band_idx, int width)
{
  hpdz_dequantizer_ref self = (hpdz_dequantizer_ref) base;
  hpdz_component_info_ptr comp;
  hpdz_level_info_ptr lev;
  float scale, *dp;
  ifc_int *cast_buf, *sp, val;
  int i;
  double nz;

  /* SAIC TCQ begin */
  int extra_lsbs;
  ifc_int mask;
  /* SAIC TCQ end */

  assert(component_idx < self->num_components);
  comp = self->components + component_idx;
  assert(level_idx <= comp->num_levels);
  lev = comp->levels + level_idx;
  assert((band_idx >= lev->min_band) && (band_idx <= lev->max_band));
  scale = lev->bands[band_idx].scale;
  nz = lev->bands[band_idx].nz;

  /* SAIC TCQ begin */
  extra_lsbs = lev->bands[band_idx].extra_lsbs;
  mask = -1 * (1 << extra_lsbs);
  /* SAIC TCQ end */

  cast_buf = (ifc_int *) line_buf;
  self->decoder->pull_line(self->decoder,cast_buf,
                           component_idx,level_idx,band_idx,width);  
  if (self->three_eighths_mag)
    { /* Modify representation levels. */
      ifc_int mag, lsb_idx, max_mag;

      max_mag = self->three_eighths_mag;
      for (i=width, sp=cast_buf; i > 0; i--, sp++)
        {
          val = *sp;

          /* SAIC TCQ begin */
          if (!(val & mask)) {
            val = 0;
          }
          /* SAIC TCQ end */

          if ((mag = val & MAX_IFC_INT) != 0)
            {
              designal_lsb_idx(mag,lsb_idx);
              if ((mag >> lsb_idx) <= max_mag)
                *sp = val - ((1<<lsb_idx)>>3);
            }
        }
    }
  for (i=width, dp=line_buf+i-1, sp=cast_buf+i-1; i > 0; i--, sp--, dp--)
    {
      val = *sp;

      /* SAIC TCQ begin */
      if (!(val & mask)) {
        val = 0;
      }
      /* SAIC TCQ end */

      val = (val<0)?(MIN_IFC_INT-val):val; /* Make two's-complement. */
      *dp = ((float) val) * scale;
      /* MITRE Generalized Scalar Quant begin */
      if (nz != 0) {
        if (*dp > 0)  *dp -= nz;
        else if (*dp < 0) *dp += nz;
      }
    }

  /* SAIC General Decomp. Begin */
  if (self->wt_output_file != NULL) {
    int line_num;
    int j;

    line_num = self->band_dims[level_idx][band_idx].top_row+
               self->current_band_line[level_idx][band_idx];
    assert(self->band_dims[level_idx][band_idx].cols == width);
    assert(self->current_band_line[level_idx][band_idx] <
           self->band_dims[level_idx][band_idx].rows);
    for (j=self->band_dims[level_idx][band_idx].left_col;
         j<self->band_dims[level_idx][band_idx].left_col +
           self->band_dims[level_idx][band_idx].cols; j++) {
      self->wt_output[line_num][j] =
        line_buf[j-self->band_dims[level_idx][band_idx].left_col];
    }
    self->current_band_line[level_idx][band_idx]++;
  }
  /* SAIC General Decomp. End */

}
/* MITRE General Offset/SQ End mods */

/*****************************************************************************/
/* STATIC                      __pull_line_fixed                             */
/*****************************************************************************/

static void
  __pull_line_fixed(dequantizer_ref base, ifc_int *line_buf,
                    int component_idx, int level_idx, int band_idx, int width)
{
  hpdz_dequantizer_ref self = (hpdz_dequantizer_ref) base;
  hpdz_component_info_ptr comp;
  hpdz_level_info_ptr lev;
  ifc_int *sp, shift, val;
  int i;

  /* SAIC TCQ begin */
  int extra_lsbs;
  ifc_int mask;
  /* SAIC TCQ end */

  assert(component_idx < self->num_components);
  comp = self->components + component_idx;
  assert(level_idx <= comp->num_levels);
  lev = comp->levels + level_idx;
  assert((band_idx >= lev->min_band) && (band_idx <= lev->max_band));
  shift = lev->bands[band_idx].left_shift;

  /* SAIC TCQ begin */
  extra_lsbs = lev->bands[band_idx].extra_lsbs;
  mask = -1 * (1 << extra_lsbs);
  /* SAIC TCQ end */

  self->decoder->pull_line(self->decoder,line_buf,
                           component_idx,level_idx,band_idx,width);
  if (self->three_eighths_mag)
    { /* Modify representation levels. */
      ifc_int mag, lsb_idx, max_mag;

      max_mag = self->three_eighths_mag;
      for (i=width, sp=line_buf; i > 0; i--, sp++)
        {
          val = *sp;

          /* SAIC TCQ begin */
          if (!(val & mask)) {
            val = 0;
          }
          /* SAIC TCQ end */

          if ((mag = val & MAX_IFC_INT) != 0)
            {
              designal_lsb_idx(mag,lsb_idx);
              if ((mag >> lsb_idx) <= max_mag)
                *sp = val - ((1<<lsb_idx)>>3);
            }
        }
    }
  if (shift == 0)
    for (sp=line_buf, i=width; i > 0; i--, sp++)
      { /* The `shift'=0 case occurs almost always in practice. */
        val = *sp;

        /* SAIC TCQ begin */
        if (!(val & mask)) {
          val = 0;
        }
        /* SAIC TCQ end */

        val = (val<0)?(MIN_IFC_INT-val):val;
        *sp = val;
      }
  else if (shift > 0)
    for (sp=line_buf, i=width; i > 0; i--, sp++)
      {
        val = *sp;

        /* SAIC TCQ begin */
        if (!(val & mask)) {
          val = 0;
        }
        /* SAIC TCQ end */

        if (val < 0)
          val = - ((val & MAX_IFC_INT) << shift);
        else
          val <<= shift;
        *sp = val;
      }
  else
    for (shift=-shift, sp=line_buf, i=width; i > 0; i--, sp++)
      {
        val = *sp;

        /* SAIC TCQ begin */
        if (!(val & mask)) {
          val = 0;
        }
        /* SAIC TCQ end */

        if (val < 0)
          val = - ((val & MAX_IFC_INT) >> shift);
        else
          val >>= shift;
        *sp = val;
      }

  /* SAIC General Decomp. Begin */
  if (self->wt_output_file != NULL) {
    int line_num;
    int j;

    line_num = self->band_dims[level_idx][band_idx].top_row+
               self->current_band_line[level_idx][band_idx];
    assert(self->band_dims[level_idx][band_idx].cols == width);
    assert(self->current_band_line[level_idx][band_idx] <
           self->band_dims[level_idx][band_idx].rows);
    for (j=self->band_dims[level_idx][band_idx].left_col;
         j<self->band_dims[level_idx][band_idx].left_col +
           self->band_dims[level_idx][band_idx].cols; j++) {
      self->wt_output[line_num][j] = (float)
        line_buf[j-self->band_dims[level_idx][band_idx].left_col];
    }
    self->current_band_line[level_idx][band_idx]++;
  }
  /* SAIC General Decomp. End */

}

/*****************************************************************************/
/* STATIC                         __terminate                                */
/*****************************************************************************/

static void
  __terminate(dequantizer_ref base)
{
  hpdz_dequantizer_ref self = (hpdz_dequantizer_ref) base;
  int c;

  /* SAIC General Decomp. Begin */
  if (self->wt_output_file != NULL) {
    canvas_dims tile_dims;
    hpdz_component_info_ptr comp;
    hpdz_level_info_ptr lev;
    float max, min;
    int num_levels;
    int i, j, n, b;
    unsigned char **usc_wt_output;
    FILE *fp;


    comp = self->components;
    num_levels = comp->num_levels;
    /* Begin Aerospace MCT mods */
    self->info->get_fixed_tile_info(self->info, 0, 0, NULL, NULL, &tile_dims,
                                    NULL, NULL, NULL, NULL,NULL,NULL,NULL);
    /* End Aerospace MCT mods */
    usc_wt_output = (unsigned char **)
      local_malloc(HPDZ_MEM_KEY, tile_dims.rows * sizeof(unsigned char *));
    usc_wt_output[0] = (unsigned char *)
      local_malloc(HPDZ_MEM_KEY, tile_dims.rows * tile_dims.cols *
                                 sizeof(unsigned char));
    for (i=1; i<tile_dims.rows; i++) {
      usc_wt_output[i] = usc_wt_output[i-1] + tile_dims.cols;
    }
    for (n=0; n<=num_levels; n++) {
      lev = comp->levels + n;
      for (b=lev->min_band; b<=lev->max_band; b++) {
        if (!self->valid_band[n][b])
          continue;
        max = min =
          self->wt_output[self->band_dims[n][b].top_row]
                         [self->band_dims[n][b].left_col];
        for (i=self->band_dims[n][b].top_row;
             i<self->band_dims[n][b].top_row +
               self->band_dims[n][b].rows; i++) {
          for (j=self->band_dims[n][b].left_col;
               j<self->band_dims[n][b].left_col +
                 self->band_dims[n][b].cols; j++) {
            if (self->wt_output[i][j] > max)
              max = self->wt_output[i][j];
            if (self->wt_output[i][j] < min)
              min = self->wt_output[i][j];
          }
        }
        if ((min == 0.0F) && (max == 0.0F))
          max = 1.0F;  /* Avoid divide by zero */
        for (i=self->band_dims[n][b].top_row;
             i<self->band_dims[n][b].top_row +
               self->band_dims[n][b].rows; i++) {
          for (j=self->band_dims[n][b].left_col;
               j<self->band_dims[n][b].left_col +
                 self->band_dims[n][b].cols; j++) {
            if (n == 0) {
              self->wt_output[i][j] =
                255*(self->wt_output[i][j] - min)/(max - min);
            }
            else {
              self->wt_output[i][j] = (float)
                (1024*fabs(self->wt_output[i][j])/MAX(fabs(min), fabs(max)));
              if (self->wt_output[i][j] > 255)
                self->wt_output[i][j] = 255;
            }
            usc_wt_output[i-tile_dims.top_row][j-tile_dims.left_col] =
              (unsigned char) self->wt_output[i][j];
          }
        }
      }
      local_free(self->valid_band[n]);
      local_free(self->current_band_line[n]);
      local_free(self->band_dims[n]);
    }
    local_free(self->valid_band);
    local_free(self->current_band_line);
    local_free(self->band_dims);
    local_free(self->min_band);
    local_free(self->max_band);

    fp = fopen(self->wt_output_file, "wb");
    fprintf(fp, "P5\n%d %d\n255\n", tile_dims.cols, tile_dims.rows);
    fwrite(usc_wt_output[0], sizeof(unsigned char), tile_dims.rows * tile_dims.cols, fp);
    fclose(fp);
    self->wt_output[tile_dims.top_row] += tile_dims.left_col;
    local_free(self->wt_output[tile_dims.top_row]);
    self->wt_output += tile_dims.top_row;
    local_free(self->wt_output);
    local_free(usc_wt_output[0]);
    local_free(usc_wt_output);
  }
  /* SAIC General Decomp. End */

  if (self->components != NULL)
    {
      for (c=0; c < self->num_components; c++)
        destroy_component_structures(self->components + c);
      local_free(self->components);
    }
  local_free(self);
}

/*****************************************************************************/
/* EXTERN                  create_deadzone_dequantizer                       */
/*****************************************************************************/

dequantizer_ref
  create_deadzone_dequantizer(void)
{
  hpdz_dequantizer_ref result;

  result = (hpdz_dequantizer_ref)
    local_malloc(HPDZ_MEM_KEY,sizeof(hpdz_dequantizer_obj));
  result->base.initialize = __initialize;
  result->base.get_usage = __get_usage;
  result->base.pull_line_float = __pull_line_float;
  result->base.pull_line_fixed = __pull_line_fixed;
  result->base.next_tile = __next_tile;
  result->base.terminate = __terminate;
  return((dequantizer_ref) result);
}

⌨️ 快捷键说明

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