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

📄 hplx_dummy_quant.c

📁 JPEG2000 EBCOT算法源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************/
/* Copyright 1998, Hewlett-Packard Company                                   */
/* All rights reserved                                                       */
/* Author: David Taubman                                                     */
/* Version: V2.0                                                             */
/* Last Revised: 9/22/98                                                     */
/*****************************************************************************/
#include "local_heap.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "line_block_ifc.h"

/* ========================================================================= */
/* ------------------- Implementation of dummy quantizer ------------------- */
/* ========================================================================= */

typedef
  struct component_quant_info {
    float *buf;
    ifc_int *buf_fixed;
    int cols;
    int *offsets;
    int *widths;
  } component_quant_info, *component_quant_info_ptr;

typedef
  struct dummy_quantizer_obj {
    quantizer_obj base;
    int num_components;
    component_quant_info_ptr components;
  } dummy_quantizer_obj, *dummy_quantizer_ref;

/*****************************************************************************/
/* STATIC                     quantizer__initialize                          */
/*****************************************************************************/

static void
  quantizer__initialize(quantizer_ref base, int decomposition, int levels,
                        int components, int component_rows[],
                        int component_cols[], filter_info_ref info,
                        encoder_ref buf_cast, int argc, char *argv[])
{
  dummy_quantizer_ref self = (dummy_quantizer_ref) base;
  component_quant_info_ptr comp_info;
  int comp, n, tmp_rows, tmp_cols, new_rows, new_cols;

  if (decomposition != DECOMPOSITION__MALLAT)
    {
      fprintf(stderr,"The dummy quantizer implementation does not currently\n"
              "support anything other than Mallat decompositions!\n");
      exit(-1);
    }
  self->num_components = components;
  self->components = (component_quant_info_ptr)
    local_malloc(sizeof(component_quant_info)*(size_t) components);
  memset(self->components,0,sizeof(component_quant_info)*(size_t) components);
  for (comp=0; comp < components; comp++)
    {
      comp_info = self->components + comp;
      comp_info->buf = ((float **) buf_cast)[comp];
      comp_info->buf_fixed = ((ifc_int **) buf_cast)[comp];
      comp_info->cols = component_cols[comp];
      comp_info->offsets = (int *)
        local_malloc(sizeof(int)*(size_t)(1+3*levels));
      comp_info->widths = (int *)
        local_malloc(sizeof(int)*(size_t)(1+3*levels));
      tmp_rows = component_rows[comp];
      tmp_cols = component_cols[comp];
      for (n=levels-1; n >= 0; n--, tmp_rows=new_rows, tmp_cols=new_cols)
        {
          new_rows = (tmp_rows+1) >> 1;
          new_cols = (tmp_cols+1) >> 1;
          comp_info->offsets[3*n+HL_BAND] = new_cols;
          comp_info->widths[3*n+HL_BAND] = tmp_cols-new_cols;
          comp_info->offsets[3*n+LH_BAND] = comp_info->cols*new_rows;
          comp_info->widths[3*n+LH_BAND] = new_cols;
          comp_info->offsets[3*n+HH_BAND] = comp_info->cols*new_rows+new_cols;
          comp_info->widths[3*n+HH_BAND] = tmp_cols-new_cols;
        }
      comp_info->offsets[LL_BAND] = 0;
      comp_info->widths[LL_BAND] = tmp_cols;
    }
}

/*****************************************************************************/
/* STATIC                    quantizer__print_usage                          */
/*****************************************************************************/

static void
  quantizer__print_usage(quantizer_ref base, FILE *dest)
{
  return; /* No special command-line options for this object. */
}

/*****************************************************************************/
/* STATIC                  quantizer__push_line_float                        */
/*****************************************************************************/

static void
  quantizer__push_line_float(quantizer_ref base, float *line_buf,
                             int component_idx, int level_idx, int band_idx,
                             int width)
{
  dummy_quantizer_ref self = (dummy_quantizer_ref) base;
  component_quant_info_ptr comp_info;
  float *dp;

  assert(component_idx < self->num_components);
  comp_info = self->components + component_idx;
  assert(width == comp_info->widths[3*level_idx+band_idx]);
  dp = comp_info->buf + comp_info->offsets[3*level_idx+band_idx];
  for (; width > 0; width--)
    *(dp++) = *(line_buf++);
  comp_info->offsets[3*level_idx+band_idx] += comp_info->cols;
}

/*****************************************************************************/
/* STATIC                  quantizer__push_line_fixed                        */
/*****************************************************************************/

static void
  quantizer__push_line_fixed(quantizer_ref base, ifc_int *line_buf,
                             int component_idx, int level_idx, int band_idx,
                             int width)
{
  dummy_quantizer_ref self = (dummy_quantizer_ref) base;
  component_quant_info_ptr comp_info;
  ifc_int *dp;

  assert(component_idx < self->num_components);
  comp_info = self->components + component_idx;
  assert(width == comp_info->widths[3*level_idx+band_idx]);
  dp = comp_info->buf_fixed + comp_info->offsets[3*level_idx+band_idx];
  for (; width > 0; width--)
    *(dp++) = *(line_buf++);
  comp_info->offsets[3*level_idx+band_idx] += comp_info->cols;
}

/*****************************************************************************/
/* STATIC                 quantizer__push_block_float                        */
/*****************************************************************************/

static void
  quantizer__push_block_float(quantizer_ref base, float **block_buf,
                              int component_idx, int level_idx, int band_idx,
                              int block_rows, int block_cols,
                              int top_row, int left_col)
{
  fprintf(stderr,"The \"push_block_float\" function is not implemented by "
          "\"dummy_quantizer\"!\n");
  exit(-1);
}

/*****************************************************************************/
/* STATIC                 quantizer__push_block_fixed                        */
/*****************************************************************************/

static void
  quantizer__push_block_fixed(quantizer_ref base, ifc_int **block_buf,
                              int component_idx, int level_idx, int band_idx,
                              int block_rows, int block_cols,
                              int top_row, int left_col)
{
  fprintf(stderr,"The \"push_block_fixed\" function is not implemented by "
          "\"dummy_quantizer\"!\n");
  exit(-1);
}

/*****************************************************************************/
/* STATIC                  quantizer__push_tree_float                        */
/*****************************************************************************/

static void
  quantizer__push_tree_float(quantizer_ref base, float **tree_buf, int levels,
                             int component_idx, int root_row, int root_col)
{
  fprintf(stderr,"The \"push_tree_float\" function is not implemented by "
          "\"dummy_quantizer\"!\n");
  exit(-1);
}

/*****************************************************************************/
/* STATIC                  quantizer__push_tree_fixed                        */
/*****************************************************************************/

static void
  quantizer__push_tree_fixed(quantizer_ref base, ifc_int **tree_buf,
                             int levels, int component_idx,
                             int root_row, int root_col)
{
  fprintf(stderr,"The \"push_tree_fixed\" function is not implemented by "
          "\"dummy_quantizer\"!\n");
  exit(-1);
}

/*****************************************************************************/
/* STATIC                     quantizer__terminate                           */
/*****************************************************************************/

static void
  quantizer__terminate(quantizer_ref base)
{
  dummy_quantizer_ref self = (dummy_quantizer_ref) base;
  component_quant_info_ptr comp_info;
  int n;

  if (self->components != NULL)
    {
      for (n=0; n < self->num_components; n++)
        {
          comp_info = self->components + n;
          local_free(comp_info->offsets);
          local_free(comp_info->widths);
        }
      local_free(self->components);
    }
  local_free(self);
}

/*****************************************************************************/
/* EXTERN                     create_dummy_quantizer                         */
/*****************************************************************************/

quantizer_ref
  create_dummy_quantizer(void)
{
  dummy_quantizer_ref result;

  result = (dummy_quantizer_ref)
    local_malloc(sizeof(dummy_quantizer_obj));
  memset(result,0,sizeof(dummy_quantizer_obj));
  result->base.initialize = quantizer__initialize;
  result->base.print_usage = quantizer__print_usage;

⌨️ 快捷键说明

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