hplx_hor.c

来自「JPEG2000 EBCOT算法源码」· C语言 代码 · 共 1,352 行 · 第 1/3 页

C
1,352
字号
	  i>>=1;
	  while(i--){
		  ftmp=*(downH++);
          tmpf=SindxH++;
	      tmpf1=Sindex1--;
	      tmp_ptr=self->BufFast;
	      k=j;
		  if(evenF) { /*Even Length Filter*/
	        if(flag) while(k--) *(tmp_ptr++) = 
				   ftmp* (*(tmpf +=2 )-*(tmpf1 +=2)) ;
	        else   while(k--) *(tmp_ptr++) += 
				ftmp* ((int)*(tmpf +=2 )-(int)*(tmpf1 +=2)); }
		  else  {  /*Odd length Filter*/
	        if(flag) while(k--)  *(tmp_ptr++) = 
				ftmp* ((int)*(tmpf +=2 )+(int)*(tmpf1 +=2)) ;
	        else  while(k--) *(tmp_ptr++) += 
				ftmp* ((int)*(tmpf +=2 )+(int)*(tmpf1 +=2)); }
		  flag=0;
         }

       if(!evenF)  {/*Odd Length filter*/
            ftmp=*(downH++);
            tmpf=SindxH++;
            tmp_ptr=self->BufFast;
            k=j;
	        if(flag) while(k--)*(tmp_ptr++) = 
				         ftmp* *(tmpf += 2 );
	        else  while(k--)    *(tmp_ptr++) += 
				         ftmp* *(tmpf += 2 );}
      tmp_ptr=self->BufFast;
	  k=j;
	  /* Write data to Output Buffer*/
      while(k--)  *(V++) = (*(tmp_ptr++) +l1)>>l;
}

/************************************************************************/
decimator_ref
  create_decimator(void)
{
  decimator_ref result;
  
  result = (decimator_ref)
    local_malloc(sizeof(decimator));
  memset(result,0,sizeof(decimator));
  result->initialize_fixed = decimator__initialize_fixed;
  result->initialize       = decimator__initialize;
  result->decimate        =  decimator__decimate;
  result->decimate_fixed  =  decimator__decimate_fixed;
  result->set_size   =  decimator__set_size;
  result->terminate  =  decimator__terminate;
  return((decimator_ref) result);
}

/************************************************************************/
static int
  interpolator__terminate(interpolator_ref self)
{
  if(!self->fixed)
  {
    local_free(self->buffer-=self->V_max);
    if (self->_data != NULL)
      local_free(self->_data);
    local_free(self->VL_Low+=self->V_min-self->VL_min);
    local_free(self->VH_Low+=self->V_min-self->VH_min);
  }
  else
  {
    local_free(self->buffer_I-=self->V_max);
    if (self->_data_I != NULL)
      local_free(self->_data_I);
    local_free(self->VL_Low_I+=self->V_min-self->VL_min);
    local_free(self->VH_Low_I+=self->V_min-self->VH_min);
    local_free(self->BufFast);
  }
  local_free(self);
  return(0);
}

/************************************************************************/
/*
*  initialization routine for class interpolator
*
*/
/************************************************************************/

static void
  interpolator__initialize_fixed(interpolator_ref self, 
                                 int  X,filter_info_ref info,int c_levs,
                                 int component_idx)
{
  int i,PLUSMINUS1;
  int  *Lfilt,*Hfilt;
  float *l_taps, *h_taps;
  int h_neg, h_pos, l_neg, l_pos, Lmin, Lbeyond, Hmin, Hbeyond;
  char *built_in_id;

  
  self->DefaultFB = 0;
  self->component_idx = component_idx;
  
  l_taps = info->get_taps(info,FILTER__SYNTH,component_idx,0x0F & c_levs,
                          &l_neg,&l_pos,NULL);
  h_taps = info->get_taps(info,FILTER__HIGH | FILTER__SYNTH,component_idx,
                          0x0F & c_levs,&h_neg,&h_pos,&built_in_id);
  self->shiftFactor = compute_shift_factor(l_taps,l_neg+l_pos+1,
    h_taps,h_neg+h_pos+1,
    self->coeff_precision,1.0F);
  
  if (strcmp(built_in_id,"0") == 0)
    self->DefaultFB = 1;
  
  self->EvenFilter = (l_neg+l_pos) & 1;
  Lmin = -l_neg; Lbeyond = l_pos+1;
  Hmin = -h_neg; Hbeyond = h_pos+1;
  if (self->EvenFilter)
  { Lmin--; Lbeyond--; }
  
  self->VH_min = Hmin;
  self->VH_max = Hbeyond;
  self->VL_min = Lmin;
  self->VL_max = Lbeyond;
  self->V_min = min( self->VL_min, self->VH_min );
  self->V_max = max( self->VL_max, self->VH_max );
  
  self->_data_I = (short int *)
    local_malloc(sizeof(short int )*X);
  
  self->xdim = self->Length = X;
  PLUSMINUS1 = self->EvenFilter?(-1):1; 
  
  i= max(max(self->VL_max,abs(self->VL_min)),
    max(self->VH_max,abs(self->VH_min)));
  
 
  self->buffer_I =
    ((short int *)
    local_malloc((self->Length-self->V_min + self->V_max)*sizeof(short int )))
    + self->V_max;

  Lfilt =
    ((int *)
    local_malloc((self->V_max-self->V_min+1)*sizeof( int )))
    - self->V_min;
  Hfilt =
    ((int *)
    local_malloc((self->V_max-self->V_min+1)*sizeof( int )))
    - self->V_min;
  
  for(i = self->V_min; i <self->V_max ; i++)
    Lfilt[i]=Hfilt[i]=0;
  
  l_taps -= Lmin;
  h_taps -= Hmin; /* Get centres. */
  
  for(i=0;i<self->V_max;i+=2)
  {
    if(i-self->EvenFilter<self->VH_max)
      Hfilt[-i]=roundshift(h_taps[i-self->EvenFilter],self->shiftFactor);
    else
      Hfilt[-i]=(short int )(0.0);
    
    if(i<self->VL_max)
      Lfilt[-i-self->EvenFilter]=roundshift(l_taps[i],self->shiftFactor);
    else
      Lfilt[-i-self->EvenFilter]=(short int )(0.0);
  }
  
  for(i=-2;i>=self->V_min;i-=2)
  {
    if(i>=self->VL_min)
      Lfilt[-i-self->EvenFilter]=roundshift(l_taps[i],self->shiftFactor);
    else
      Lfilt[-i-self->EvenFilter]=(short int )(0.0);
    if(i-self->EvenFilter>=self->VH_min)
      Hfilt[-i]=roundshift(h_taps[i-self->EvenFilter],self->shiftFactor);
    else
      Hfilt[-i]=(short int )(0.0);
  }       
  
  for(i=1;i<self->V_max;i+=2)
  {
    if(i+self->EvenFilter<self->VH_max)
      Lfilt[-i-self->EvenFilter]=roundshift(h_taps[i+self->EvenFilter],self->shiftFactor);
    else
      Lfilt[-i-self->EvenFilter]=(short int )(0.0);
  }
  
  for(i=1;i<=-self->V_min;i+=2)
  {                       
    if(i-2*self->EvenFilter<self->VL_max)
      Hfilt[-i]=roundshift(l_taps[i-2*self->EvenFilter],self->shiftFactor);
    else
      Hfilt[-i]=(short int )(0.0);
  }
  
  for(i=-1;i>=self->V_min;i-=2)
  {
    if(i+self->EvenFilter>=self->VH_min)
      Lfilt[-i-self->EvenFilter]=roundshift(h_taps[i+self->EvenFilter],self->shiftFactor);
    else
      Lfilt[-i-self->EvenFilter]=(short int )(0.0);
    
    if(i-2*self->EvenFilter>=self->VL_min)
      Hfilt[-i]=roundshift(l_taps[i-2*self->EvenFilter],self->shiftFactor);
    else
      Hfilt[-i]=(short int )(0.0);    
    
    /*** Problem detected here.  Accesses one beyond nominal array bounds. */
    
  }
  
  self->VL_min = self->V_min;
  self->VL_max = self->V_max;
  self->VH_min = self->V_min;
  self->VH_max = self->V_max;
  
  if(self->EvenFilter)
  {
    self->VL_Low_I  = self->VL_High_I = Hfilt;
    self->VH_Low_I  = self->VH_High_I = Lfilt;
  }
  else
  {
    self->VL_Low_I  = self->VL_High_I = Lfilt;
    self->VH_Low_I  = self->VH_High_I = Hfilt;
  }
  
  self->VL_Low_I  += self->VL_min; 
  self->VL_High_I += self->VL_max;
  self->VH_Low_I  += self->VH_min; 
  self->VH_High_I += self->VH_max;

  self->BufFast =
    (( int *)
    local_malloc((self->Length)*sizeof(int ))); 


}

/************************************************************************/
/*
*    c_levs -> number of levels in the inverse WT
*
*/
/************************************************************************/
static void
  interpolator__interpolate_fixed(interpolator_ref self,short int  *Output)
{
  int i,j, g2H,g2L,z,l,l1,lengthH,lengthL,g;    
  short int  *SindxLI,*tmp;
  int shift_factorL, shift_factorH,NotBothOdd,_Strange;
  int OddSignal;
  int *downL=self->VL_Low_I;  
  int *downH=self->VH_Low_I;
  int PLUSMINUS1=self->EvenFilter?(-1):1;
  int evenF=self->EvenFilter;
 
  l=self->shiftFactor;
  l1= 1<<(l-1);
  
  z=self->Length;
  OddSignal = z & 1;
  _Strange = OddSignal && evenF;
  lengthL = ((z+1) >> 1)  - _Strange;
  lengthH = z>>1;
  NotBothOdd =  (!OddSignal) || evenF ;
  shift_factorL =
	  - 2 * ( evenF ||OddSignal)
	  + 2 * (int)(!NotBothOdd) ;
  shift_factorH = - 1;
  g2L = 2 * (lengthL - !NotBothOdd );
  g2H = 2 * ( lengthH + !NotBothOdd -  !evenF ) + 1 ;

      
      /************************************************/
        
        SindxLI = self->_data_I +  lengthL + _Strange;     
      
        /***********************************************
        ** This is the main part of the signal high pass
      ***********************************************/
      
      for ( j = 0, tmp = self->buffer_I - 1 ;
            j < (int)(lengthH); j++ )
        *(tmp+=2)=*(SindxLI++);
      
      /************************************************/
      
          SindxLI = self->_data_I;
       
      
      /***********************************************
      ** This is the main part of the signal low pass
      ***********************************************/
      
      for ( j = 0, tmp = self->buffer_I - 2;
            j < (int)(lengthL); j++ ) 
        *(tmp+=2)=*(SindxLI++);
      
      if (_Strange)    
        *( Output  + z - 1) = *( SindxLI  ) ;
      
      
        /***********************************************
        ** Extension to the left of the signal low pass
      ***********************************************/
      
      for ( j = -2 , i = shift_factorL ;
            j > - self->VL_max - 1; j-=2)
        self->buffer_I[j] =  self->buffer_I[i+=2];
      
        /***********************************************
        ** Extension to the right of the signal low pass
      ***********************************************/
      
      for ( j = (int)(z)-(int)(_Strange)+!NotBothOdd,
            i = g2L;
            j < (int)(z) - (int)(_Strange) - self->VL_min ;
            j+=2 ) 
        self->buffer_I[j] =  self->buffer_I[i-=2];
      
        /***********************************************
        ** Extension to the left of the signal high pass
      ***********************************************/
      
      for( j = -1 , i = shift_factorH;
           j > -self->VH_max; j-=2 )
        self->buffer_I[j]= PLUSMINUS1 * self->buffer_I[i+=2];
      
        /***********************************************
        ** Extension to the right of the signal high pass
      ***********************************************/
      
      for( j = (int)(z) + NotBothOdd - (int)(_Strange),
           i = g2H; j < (int)(z) -  self->VH_min ; j+=2 ) 
        self->buffer_I[j]= PLUSMINUS1 * self->buffer_I[i-=2];
      
      SindxLI = self->buffer_I   - self->V_max   + 1 ;                       
      
      /******************************************
      *      filtering done here
      ******************************************/

	 
     j=((int)(z) - (int)(_Strange))>>1;
     g=self->VL_max-self->VL_min;

if(!evenF)
{
  int flag;
  short int *Sindex1,*SindxL,*tmpf,*tmpf1,*SindxH;
  register int ftmp,*tmp_ptr;
  register int k;	 

  if(OddSignal)j++;
  flag=1;
  SindxL= SindxLI-2;
  Sindex1=SindxL+g-1;
  i=g>>1;
  while(i--){
	  ftmp=*(downL++);
	  tmpf=SindxL++;
	  tmpf1=Sindex1--;
	  tmp_ptr=self->BufFast-2;
	  k=j;
	  if(flag) while(k--) *(tmp_ptr+=2) = 
		  ftmp* ((int)*(tmpf +=2 )+(int)*(tmpf1 +=2)) ;
	  else     while(k--) *(tmp_ptr+=2) += 
		  ftmp* ((int)*(tmpf +=2 )+(int)*(tmpf1 +=2));
	  flag=0; }
  
  if(!evenF) {  /*Oddlength Filter */
	  ftmp=*(downL++);
	  tmpf=SindxL++;
	  tmp_ptr=self->BufFast-2;
	  k=j;
	  if(flag)   while(k--)*(tmp_ptr+=2) = 
		  ftmp* *((tmpf +=2) );
	  else    while(k--) *(tmp_ptr+=2) += 
		  ftmp* *(tmpf +=2);}
  
     
      /*  High Pass */  

	  j=((int)(z) - (int)(_Strange))>>1;
	  flag=1;
	  SindxH= SindxLI-1;
	  Sindex1=SindxH+g-1;
	  i=g>>1;
	  while(i--){
		  ftmp=*(downH++);
          tmpf=SindxH++;
		  tmpf1=Sindex1--;
		  tmp_ptr=self->BufFast-1;
		  k=j;
		  if(evenF) { /*Even Length Filter*/
			  if(flag) while(k--) *(tmp_ptr+=2) = 
				  ftmp* ((int)*(tmpf +=2 )-(int)*(tmpf1 +=2)) ;
			  else   while(k--) *(tmp_ptr+=2) += 
				  ftmp* ((int)*(tmpf +=2 )-(int)*(tmpf1 +=2)); }
		  else  {  /*Odd length Filter*/
			  if(flag) while(k--)  *(tmp_ptr+=2) = 
				  ftmp* ((int)*(tmpf +=2 )+(int)*(tmpf1 +=2)) ;
			  else  while(k--) *(tmp_ptr+=2) += 
				  ftmp* ((int)*(tmpf +=2 )+(int)*(tmpf1 +=2)); }
		  flag=0;
	  }
	  
	  if(!evenF)  {/*Odd Length filter*/
            ftmp=*(downH++);
            tmpf=SindxH++;
            tmp_ptr=self->BufFast-1;
            k=j;
	        if(flag) while(k--)*(tmp_ptr+=2) = 
				         ftmp* *(tmpf += 2 );
	        else  while(k--)    *(tmp_ptr+=2) += 
				         ftmp* *(tmpf += 2 );}

	   tmp_ptr=self->BufFast;
	   while(z--)
		   *(Output++)=(*(tmp_ptr++)+l1)>>l;
}
else
{  
  while(j--)
      { *(Output++) = (inner_prod_fixed(downL,g,SindxLI++,0)+l1)>>l;
        *(Output++) = (inner_prod_fixed(downH,g,SindxLI++-evenF,0)+l1)>>l;}
      if( ((int)(z) - (int)(_Strange)) &1)
        *(Output++) = (inner_prod_fixed(downL, g, SindxLI++,0)+l1)>>l;
}
}

/************************************************************************/
interpolator_ref
  create_interpolator(void)
{
  interpolator_ref result;
  
  result = (interpolator_ref)
    local_malloc(sizeof(interpolator));
  memset(result,0,sizeof(interpolator));
  result->initialize_fixed   = interpolator__initialize_fixed;
  result->initialize         = interpolator__initialize;
  result->interpolate_fixed  =  interpolator__interpolate_fixed;
  result->interpolate        =  interpolator__interpolate;
  result->set_size     =  interpolator__set_size;
  result->terminate    =  interpolator__terminate;
  return((interpolator_ref) result);
}

⌨️ 快捷键说明

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