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

📄 hplx_vert.c

📁 JPEG2000 EBCOT算法源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  
  for(i=0;i<self->h;i++){
    self->_data[i]=self->RawData+i*self->w;
    for( j = 0; j < self->w ; j++)self->_data[i][j]=0;}
  
   self->RawData = self->_data[self->Middle];
  
  if(bufferstogo>1)
    {
      self->next = (transform_ref)
        local_malloc(sizeof(transform_obj));
      memset(self->next,0,sizeof(transform_obj));
      self->next->UsedAsAnalysis = self->UsedAsAnalysis;
      internal_initialize(self->next,component_idx,(rows+1)>>1,(cols+1)>>1,
                          lev+1,bufferstogo-1,info,quant);
    }
  else
    assert(self->next == NULL);
  
  if(self->UsedAsAnalysis)
    {
      if (bufferstogo)
        {
          self->frd=create_decimator(); 
          self->frd->coeff_precision=self->coeff_precision;
          self->frd->fixed=self->fixed;
          self->frd->initialize(self->frd,cols,info,0xF0+bufferstogo-1,
                                self->component_idx);
        }
    }
  else
    {
      if (bufferstogo)
        {
          self->inv=create_interpolator();
          self->inv->coeff_precision=self->coeff_precision;
          self->inv->fixed=self->fixed;
          self->inv->initialize(self->inv,cols,info,0xF0+bufferstogo-1,
                                self->component_idx);
        }
    }
}

/*****************************************************************************/
/* STATIC                 internal_initialize_fixed                          */
/*****************************************************************************/
#if (IMPLEMENTATION_PRECISION == 16)
static int 
  internal_initialize_fixed(transform_ref self, int component_idx, int rows,
                            int cols, int lev, int bufferstogo,
                            filter_info_ref info, quantizer_ref quant,
                            int precision)
{
  static float impulse[] = {1.0F};
  int k, i,j,V_max, V_min;
  int h_neg, h_pos, l_neg, l_pos, Lmin, Lbeyond, Hmin, Hbeyond;
  float *h_taps, *l_taps;
  float band_factors[4], max_factor, min_factor;
  int zero_based_lev;
  int analysis_shift, synthesis_shift;
  
  self->quant = quant;      
  self->dequant = (dequantizer_ref) quant;
  self->component_idx = component_idx;
  self->fixed = (precision==0)?0:1;
  self->coeff_precision = precision;

  if (self->UsedAsAnalysis)
    self->dequant = NULL;
  else
    self->quant= NULL;
  
  self->ZLevel= bufferstogo;
  self->CmpLevel=lev;
  self->term=0;
  self->TrueExtra=0;
  self->ImageRows= rows ;
  
  /*****************************************/
  
  /*****************************************/
  self->Cpoke=self->Cpeek=0;
  self->w=cols;
  
  zero_based_lev = max(0,bufferstogo - 1);
  if (zero_based_lev == 0)
    {
      min_factor = 100.0F;
      max_factor = 0.0F;
      k = 0;
    }
  else
    {
      band_factors[0] = min_factor = max_factor = 1.0F;
      k = 1;
    }
  for (; k < ((bufferstogo)?4:1); k++)
   {
       int exponent;
       float step;
    
       info->get_quant_info(info,self->component_idx,zero_based_lev,k,
                           &step,&exponent,NULL,NULL);
       if (exponent >= 0)
         band_factors[k] = ((float)(1<<exponent)) / step;
       else
         band_factors[k] = 1.0F / (((float)(1<<-exponent)) * step);
       if (band_factors[k] > max_factor)
         max_factor = band_factors[k];
       if (band_factors[k] < min_factor)
         min_factor = band_factors[k];
    }

  if (bufferstogo)
    {
      l_taps = info->get_taps(info,FILTER__VERT,self->component_idx,
                              zero_based_lev,&l_neg,&l_pos,NULL);
      h_taps = info->get_taps(info,FILTER__VERT | FILTER__HIGH,
                              self->component_idx,
                              zero_based_lev,&h_neg,&h_pos,NULL);
    }
  else
    {
      l_neg = l_pos = h_neg = h_pos = 0;
      l_taps = h_taps = impulse;
    }
  analysis_shift = compute_shift_factor(l_taps,l_neg+l_pos+1,
                                        h_taps,h_neg+h_pos+1,
                                        self->coeff_precision,max_factor);
  self->EvenFilter = (l_neg+l_pos) & 1;
  Lmin = -l_pos; Lbeyond = l_neg+1;
  Hmin = -h_pos; Hbeyond = h_neg+1;
  
  if (self->EvenFilter)
    { Hmin--; Hbeyond--; }

  /*Height of the Vertical Buffer*/ 
  self->h = max(Lbeyond-Lmin,Hbeyond-Hmin); 

  /* set if even length filters and odd number of rows*/
  self->LoneLine = (rows & 1) & ! (self->h&1);

  /* Effective Length of signal*/
  self->maxY =self->LoneLine? ( ( rows >> 1 ) << 1) : rows;

  self->Middle = self->h >> 1 ;
  self->SecBuf_I=(short int *)
    local_malloc(self->w*sizeof(short int ));
  self->BufFast=( int *)
    local_malloc(self->w*sizeof( int ));

  for(i=0;i<self->w;i++)
    self->SecBuf_I[i]=(short int)0;
  
  if ( self->LoneLine)
    self->ExtraLine_I= (short int *)
      local_malloc(self->w*sizeof(short int ));
  for (k=0; k < 2; k++)
    {
      float l_factor, h_factor;
    
      if (k == 0)
        {
          l_factor = band_factors[LL_BAND];
          h_factor = band_factors[LH_BAND];
        }
      else
        {
          l_factor = band_factors[HL_BAND];
          h_factor = band_factors[HH_BAND];
        }
      self->LowA_I[k] = ( int *)
        local_malloc(2*self->h*sizeof( int ));
      self->HighA_I[k] = ( int *)
        local_malloc(2*self->h*sizeof( int )); 
      
      /*****************************************
       ********* set to zero all coefficients
       *****************************************/
    
    for( i = 0 ; i < 2 * self->h ; i++ ) 
      (self->LowA_I[k])[i] = (self->HighA_I[k])[i] = 0;
    
    /* analysis filters*/
    
    for(i = (Lbeyond-Lmin-1), j=self->h-Lmin-self->Middle-1;
        i >= 0; i--, j--)  
      (self->LowA_I[k])[j] =
        (self->LowA_I[k])[self->h+j] =
          roundshift(l_taps[i]*l_factor,analysis_shift);
    
    for (i = (Hbeyond-Hmin-1), j=self->h-Hmin-self->Middle-1;
         i >= 0; i--, j--) 
      (self->HighA_I[k])[j] =
        (self->HighA_I[k])[self->h+j] =
          roundshift(h_taps[i]*h_factor,analysis_shift);
    }
  
  /**************************************************************/
  
  /**************************************************************/
  
  V_max = (self->h+1)>>1;
  V_min = -((self->h)>>1);
  
  /* synthesis filters*/

  if (bufferstogo)
    {
      l_taps = info->get_taps(info,FILTER__VERT | FILTER__SYNTH,
                              component_idx,zero_based_lev,&l_neg,&l_pos,NULL);
      h_taps = info->get_taps(info,FILTER__VERT | FILTER__HIGH | FILTER__SYNTH,
                              component_idx,zero_based_lev,&h_neg,&h_pos,NULL);
    }
  synthesis_shift = compute_shift_factor(l_taps,l_neg+l_pos+1,
                                         h_taps,h_neg+h_pos+1,
                                         self->coeff_precision,
                                         1.0F/min_factor);
  l_taps -= Hmin;
  h_taps -= Lmin;
  for (k=0; k < 2; k++)
    {
      float l_factor, h_factor;
    
      if (k == 0)
        {
          l_factor = 1.0F / band_factors[LL_BAND];
          h_factor = 1.0F / band_factors[LH_BAND];
        }
      else
        {
          l_factor = 1.0F / band_factors[HL_BAND];
          h_factor = 1.0F / band_factors[HH_BAND];
        }
    self->LowS_I[k] = ( int *)
      local_malloc(2*self->h*sizeof( int ));
    self->HighS_I[k] = ( int *)
      local_malloc(2*self->h*sizeof( int )); 
    for( i = 0 ; i < 2 * self->h ; i++ ) 
      (self->LowS_I[k])[i] = (self->HighS_I[k])[i] = 0;
    for(i=0; i < V_max; i+=2)
      {
        if (i-self->EvenFilter < Lbeyond)
          (self->HighS_I[k])[-i-V_min] =
            roundshift(h_taps[i-self->EvenFilter]*h_factor,
                       synthesis_shift);
        else
          (self->HighS_I[k])[-i-V_min]=0;
        if(i<Hbeyond)
          (self->LowS_I[k])[-i-self->EvenFilter-V_min] =
            roundshift(l_taps[i]*l_factor,synthesis_shift);
        else
          (self->LowS_I[k])[-i-self->EvenFilter-V_min] = 0;
      }
    
    for(i=-2;i>=V_min;i-=2)
      {
        if (i>=Hmin)
          (self->LowS_I[k])[-i-self->EvenFilter-V_min] =
            roundshift(l_taps[i]*l_factor,synthesis_shift);
        else
          (self->LowS_I[k])[-i-self->EvenFilter-V_min] = 0;
        if (i-self->EvenFilter >= Lmin)
          (self->HighS_I[k])[-i-V_min] =
          roundshift(h_taps[i-self->EvenFilter]*h_factor,synthesis_shift);
        else
          (self->HighS_I[k])[-i-V_min]=0;
      }       
    for(i=1;i<V_max;i+=2)
      {
        if (i+self->EvenFilter < Lbeyond)
          (self->LowS_I[k])[-i-self->EvenFilter-V_min] =
            roundshift(h_taps[i+self->EvenFilter]*h_factor,synthesis_shift);
        else
          (self->LowS_I[k])[-i-self->EvenFilter-V_min]=0;
      }
    
    for(i=1;i<=-V_min;i+=2)
      {                       
        if (i-2*self->EvenFilter < Hbeyond)
          (self->HighS_I[k])[-i-V_min] =
            roundshift(l_taps[i-2*self->EvenFilter]*l_factor,synthesis_shift);
        else
          self->HighS_I[k][-i-V_min]=0;
      }
    
    for(i=-1;i>=V_min;i-=2)
      {
        if (i+self->EvenFilter >= Lmin)
          (self->LowS_I[k])[-i-self->EvenFilter-V_min] =
            roundshift(h_taps[i+self->EvenFilter]*h_factor,synthesis_shift);
        else
          (self->LowS_I[k])[-i-self->EvenFilter-V_min] = 0;
        if (i-2*self->EvenFilter >= Hmin)
          (self->HighS_I[k])[-i-V_min] =
            roundshift(l_taps[i-2*self->EvenFilter]*l_factor,synthesis_shift);
        else
          (self->HighS_I[k])[-i-V_min] = 0;
      }
    }
  
  for (k=0; k < 2; k++)
    for( i=0; i < self->h; i++)  
      {
        (self->LowS_I[k])[i+self->h] =
          (self->LowS_I[k])[i];
        (self->HighS_I[k])[i+self->h] =
          (self->HighS_I[k])[i];
        (self->LowA_I[k])[i+self->h] =
          (self->LowA_I[k])[i];
        (self->HighA_I[k])[i+self->h] =
          (self->HighA_I[k])[i];
     }
    /*********************************************************************/
    /*********************************************************************/
   if(bufferstogo)    
    self->RawData_I=(short int *)
      local_malloc(self->w*self->h*sizeof( short int ));
   else
    self->RawData_I=(short int *)
      local_malloc(self->w*self->h*sizeof( float ));

    
    self->_data_I = (short int **)
      local_malloc( self->h *  sizeof( short int * ) ) ; 
    for (i=0;i<self->h;i++)
      {
        self->_data_I[i]=self->RawData_I+i*self->w;
        for( j = 0; j < self->w ; j++)
          self->_data_I[i][j]=0;
      }
    
     self->RawData_I = self->_data_I[self->Middle];
    
    if(bufferstogo>1)
      {
        self->next = (transform_ref)
          local_malloc(sizeof(transform_obj));
        memset(self->next,0,sizeof(transform_obj));
        self->next->UsedAsAnalysis = self->UsedAsAnalysis;
        internal_initialize_fixed(self->next,component_idx,
                                  (rows+1)>>1,(cols+1)>>1,
                                  lev+1,bufferstogo-1,info,quant,precision);
      }
    else
      assert(self->next == NULL);
    if(self->UsedAsAnalysis)
      {
        if (bufferstogo)
          {
            self->frd=create_decimator();
            self->frd->coeff_precision=self->coeff_precision;
            self->frd->fixed=self->fixed;
            self->frd->initialize_fixed(self->frd,cols,info,
                                        0xF0+bufferstogo-1,
                                        self->component_idx);
          }
        self->shiftFactor = analysis_shift;
        self->lone_factors[0] =
          roundshift(band_factors[LL_BAND],analysis_shift);
        self->lone_factors[1] =
          roundshift(band_factors[HL_BAND],analysis_shift);
      }
    else
      {
        if (bufferstogo)
          {
            self->inv=create_interpolator();
            self->inv->coeff_precision=self->coeff_precision;
            self->inv->fixed=self->fixed;
            self->inv->initialize_fixed(self->inv,cols,info,
                                        0xF0+bufferstogo-1,
                                        self->component_idx);
          }
        self->shiftFactor = synthesis_shift;
        self->lone_factors[0] =
          roundshift(1.0F/band_factors[LL_BAND],synthesis_shift);
        self->lone_factors[1] =
          roundshift(1.0F/band_factors[HL_BAND],synthesis_shift);
      }
    return(1);
}
#endif /* IMPLEMENTATION_PRECISION */

/* ========================================================================= */
/* -------------------------- Internal Termination ------------------------- */
/* ========================================================================= */

/*****************************************************************************/
/* STATIC                    internal_terminate_fixed                        */
/*****************************************************************************/
#if (IMPLEMENTATION_PRECISION == 16)
static void
  internal_terminate_fixed(transform_ref self)
{
  int m, k;

  if(self->ZLevel)/* if we did have a transform*/
  {
  if(!self->CmpLevel) {
   if(self->UsedAsAnalysis)  {
    self->term=1;
    for (m=0;m<self->Middle*((1<<self->ZLevel)-1)+(self->ImageRows&1); m++)
        push_line_fixed(self,NULL); } }

⌨️ 快捷键说明

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