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

📄 block.c

📁 avs源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
          
          if(icoef == 0) break;
          
          if(symbol2D>=CODE2D_ESCAPE_SYMBOL)   
          {
			  // changed by dj
			  currSE->type = SE_LUM_AC_INTER;
			  currSE->golomb_grad = 1;  
			  currSE->golomb_maxlevels = 11; 
			  escape_level_diff = abs(level)-((run>MaxRun[0][tablenum])?1:RefAbsLevel[tablenum][run]);
			  currSE->value1 = escape_level_diff;
			  
			  writeSyntaxElement_GOLOMB(currSE,currBitStream);
			  bitCount[BITS_COEFF_Y_MB]+=currSE->len;
			  no_bits+=currSE->len;
			  currSE++;// proceed to next SE
			  currMB->currSEnr++;
			  // end 
          }

          if(abs(level) > incVlc_intra[tablenum])   //qwang 11.29
          {
              if(abs(level) <= 2)
                tablenum = abs(level);
              else if(abs(level) <= 4)
                tablenum = 3;
              else if(abs(level) <= 7) 
                tablenum = 4;
              else if(abs(level) <= 10)
                tablenum = 5;
              else
                tablenum = 6;
          }
        }
      }
	  else //!intra
    {
      tablenum = 0;
      for(icoef; icoef>=0; icoef--)
      {
        if(icoef == 0)   //EOB
        {
          level = 0;
          run   = 0;
        }
        else
        {
          level = ACLevel[icoef-1];
          run   = ACRun[icoef-1];
        }
        
        symbol2D=CODE2D_ESCAPE_SYMBOL;        //symbol for out-of-table
        if(level>-27 && level<27 && run<26)
        {
          if(tablenum == 0)
            //symbol2D = AVS_2DVLC_INTER[tablenum][run][abs(level)-1];
            symbol2D = AVS_2DVLC_table_inter[tablenum][run][abs(level)-1];     //qwang 11.29
          else
            //symbol2D = AVS_2DVLC_INTER[tablenum][run][abs(level)];
            symbol2D = AVS_2DVLC_table_inter[tablenum][run][abs(level)];       //qwang 11.29
          if(symbol2D >= 0 && level < 0)
            symbol2D++;
          if(symbol2D < 0)
//	      symbol2D = (CODE2D_ESCAPE_SYMBOL + (run<<1) + ((level>0)?0:1)); // added by dj
              symbol2D = (CODE2D_ESCAPE_SYMBOL + (run<<1) + ((level>0)?1:0)); //jlzheng 7.20
		}
		// added by dj
		else
		{
//			symbol2D = (CODE2D_ESCAPE_SYMBOL + (run<<1) + ((level>0)?0:1));
			symbol2D = (CODE2D_ESCAPE_SYMBOL + (run<<1) + ((level>0)?1:0)); //jlzheng 7.20
		}
		//end
        
        currSE->type = SE_LUM_AC_INTER;
        currSE->value1=symbol2D;
        currSE->value2=0;

        currSE->golomb_grad = VLC_Golomb_Order[1][tablenum][0];         //qwang 11.29
        currSE->golomb_maxlevels = VLC_Golomb_Order[1][tablenum][1];    //qwang 11.29

        writeSyntaxElement_GOLOMB(currSE,currBitStream);
        bitCount[BITS_COEFF_Y_MB]+=currSE->len;
        no_bits+=currSE->len;
        currSE++;// proceed to next SE
        currMB->currSEnr++;
        
        if(icoef == 0) break;
        
        if(symbol2D>=CODE2D_ESCAPE_SYMBOL)   
        {
			// changed by dj
            currSE->type = SE_LUM_AC_INTER;
            currSE->golomb_grad = 0;  
            currSE->golomb_maxlevels = 11; 
            escape_level_diff = abs(level)-((run>MaxRun[1][tablenum])?1:RefAbsLevel[tablenum+7][run]);
            currSE->value1 = escape_level_diff;
            
            writeSyntaxElement_GOLOMB(currSE,currBitStream);
            bitCount[BITS_COEFF_Y_MB]+=currSE->len;
            no_bits+=currSE->len;
            currSE++;// proceed to next SE
            currMB->currSEnr++;
			// end 
        }

        if(abs(level) > incVlc_inter[tablenum])   //qwang 11.29
        {
            if(abs(level) <= 3)
              tablenum = abs(level);
            else if(abs(level) <= 6)
              tablenum = 4;
            else if(abs(level) <= 9) 
              tablenum = 5;
            else
              tablenum = 6;
        }
      }
      
    }// inter

    }//loop for iblk
  }//if ( cbp & (1<<b8) )
	
  return no_bits;
}

/*
*************************************************************************
* Function:Write chroma coefficients of one 8x8 block
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/


int writeChromaCoeffAVS_B8(int b8,int intra)
{
  int no_bits        = 0;
  int mb_nr          = img->current_mb_nr;
  Macroblock *currMB = &img->mb_data[mb_nr];
  const int cbp      = currMB->cbp;
  int *bitCount      = currMB->bitcounter;
  SyntaxElement *currSE = &img->MB_SyntaxElements[currMB->currSEnr];
  const char (*AVS_2DVLC_table_chroma)[26][27];   //qwang 11.29

  int inumblk;                    /* number of blocks per CBP*/
  int inumcoeff;                  /* number of coeffs per block */
  int iblk;                       /* current block */
  int icoef;                      /* current coefficient */
  int ipos;                       /* current position in cof_AVS */
  int run, level;
  int i,j;
  
  int b4;
  int* ACLevel;
  int* ACRun;

  int tablenum;   //add by qwang
  //int incVlc_chroma[] = {0,1,2,4,3000};   //add by qwang
  static const int incVlc_chroma[5] = { 0,1,2,4,3000};   //qwang 11.29

  int symbol2D;
  int escape_level_diff; // added by dj
	
  static const int blk_table[4] = {0,-1,-1,-1};
  static const int blkmode2ctx [4] = {LUMA_8x8, LUMA_8x4, LUMA_4x8, LUMA_4x4};
	
  inumblk   = 1;
  inumcoeff = 65; // all positions + EOB

  AVS_2DVLC_table_chroma = AVS_2DVLC_CHROMA;


  if ( cbp & (1<<b8) )
  {
    //code all symbols
    for (iblk=0; iblk<1; iblk++)
    {
      i=0;        // =b4
      j=(i&~1)<<1; //off_x
      i=(i&1)<<2;  //off_y
      if( (i<0) || (i>=8) || (j<0) || (j>=8) )
        continue;        //used in AVS Intra RDopt. code one one subblock.
			
      b4 = blk_table[iblk];
      level = 1; // get inside loop
      ipos  = 0;
      ACLevel = img->cofAC[b8][b4][0];
      ACRun   = img->cofAC[b8][b4][1];
		
      for(icoef=0;icoef<inumcoeff;icoef++) //count coeffs
      {
        if(!ACLevel[icoef])
          break;
      }
	
      tablenum = 0;
      for(icoef; icoef>=0; icoef--)
      {
        if(icoef == 0)   //EOB
        {
          level = 0;
          run   = 0;
        }
        else
        {
          level = ACLevel[icoef-1];
          run   = ACRun[icoef-1];
        }
        
        symbol2D=CODE2D_ESCAPE_SYMBOL;        //symbol for out-of-table
        if(level>-27 && level<27 && run<26)
        {
          if(tablenum == 0)
            //symbol2D = AVS_2DVLC_CHROMA[tablenum][run][abs(level)-1];
            symbol2D = AVS_2DVLC_table_chroma[tablenum][run][abs(level)-1];    //qwang 11.29
          else
            //symbol2D = AVS_2DVLC_CHROMA[tablenum][run][abs(level)];
            symbol2D = AVS_2DVLC_table_chroma[tablenum][run][abs(level)];      //qwang 11.29
          if(symbol2D >= 0 && level < 0)
            symbol2D++;
          if(symbol2D < 0)
              symbol2D = (CODE2D_ESCAPE_SYMBOL + (run<<1) + ((level>0)?1:0)); //jlzheng 7.20
		}
		// added by dj
		else
		{
			symbol2D = (CODE2D_ESCAPE_SYMBOL + (run<<1) + ((level>0)?1:0)); //jlzheng 7.20
		}
		//end
        
        currSE->type = SE_LUM_AC_INTER;
        currSE->value1=symbol2D;
        currSE->value2=0;
        currSE->golomb_grad = VLC_Golomb_Order[2][tablenum][0];         //qwang 11.29
        currSE->golomb_maxlevels = VLC_Golomb_Order[2][tablenum][1];    //qwang 11.29
        
        writeSyntaxElement_GOLOMB(currSE,currBitStream);
        bitCount[BITS_COEFF_UV_MB]+=currSE->len;
        no_bits+=currSE->len;
        currSE++;// proceed to next SE
        currMB->currSEnr++;
        
        if(icoef == 0) break;
        
        if(symbol2D>=CODE2D_ESCAPE_SYMBOL)   //???? select the optimal kth_Golomb code
        {
			// changed by dj
            currSE->type = SE_LUM_AC_INTER;
            currSE->golomb_grad = 0;  
            currSE->golomb_maxlevels = 11; 
            escape_level_diff = abs(level)-((run>MaxRun[2][tablenum])?1:RefAbsLevel[tablenum+14][run]);
            currSE->value1 = escape_level_diff;
            
            writeSyntaxElement_GOLOMB(currSE,currBitStream);
            bitCount[BITS_COEFF_Y_MB]+=currSE->len;
            no_bits+=currSE->len;
            currSE++;// proceed to next SE
            currMB->currSEnr++;
			// end 
        }
				
        if(abs(level) > incVlc_chroma[tablenum])   //qwang 11.29
        {
            if(abs(level) <= 2)
              tablenum = abs(level);
            else if(abs(level) <= 4)
              tablenum = 3;
            else
              tablenum = 4;
        }
		}
			
	 }  //loop for iblk
  }//if ( cbp & (1<<b8) )
	
  return no_bits;
}

/*
*************************************************************************
* Function:
		Make Intra prediction for all 9 modes for 8*8,
        img_x and img_y are pixels offsets in the picture.
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/


void intrapred_luma_AVS(int img_x,int img_y)
{
  unsigned char edgepixels[40];
  int x,y,last_pix,new_pix;
  int b8_x,b8_y;
  int i;
  int block_available_up,block_available_up_right;
  int block_available_left,block_available_left_down;
  int bs_x=8;
  int bs_y=8;
  int MBRowSize = img->width / MB_BLOCK_SIZE;/*lgp*/
  int off_up=1,incr_y=1,off_y=0;/*lgp*/
  const int mb_nr    = img->current_mb_nr;    /*oliver*/
  Macroblock *currMB = &img->mb_data[mb_nr];  /*oliver*/
  int mb_left_available = (img_x >= MB_BLOCK_SIZE)?currMB->slice_nr == img->mb_data[mb_nr-1].slice_nr:0;  /*oliver*/
  int mb_up_available = (img_y >= MB_BLOCK_SIZE)?currMB->slice_nr == img->mb_data[mb_nr-MBRowSize].slice_nr:0;  /*oliver*/
  int mb_up_right_available; 
  int mb_left_down_available;
  
  
  if((img->mb_y==0)||(img->mb_x==img->width/MB_BLOCK_SIZE-1))
  mb_up_right_available =1;
  else if((img_y-img->pix_y)>0)
  mb_up_right_available =(img_x-img->pix_x)>0? (currMB->slice_nr == img->mb_data[mb_nr+1].slice_nr):1;  /*oliver*/
   else
  mb_up_right_available =((img_x-img->pix_x)>0? (currMB->slice_nr == img->mb_data[mb_nr-MBRowSize+1].slice_nr):(currMB->slice_nr== img->mb_data[mb_nr-MBRowSize].slice_nr));  /*oliver*/

  
  if((img->mb_x==0)||(img->mb_y==img->height/MB_BLOCK_SIZE-1))
  mb_left_down_available = 1;
  else if(img_x-img->pix_x>0)
  mb_left_down_available =(img_y-img->pix_y)>0? (currMB->slice_nr == img->mb_data[mb_nr+MBRowSize].slice_nr):1;  /*oliver*/
  else
  mb_left_down_available =((img_y-img->pix_y)>0? (currMB->slice_nr == img->mb_data[mb_nr+MBRowSize-1].slice_nr):(currMB->slice_nr == img->mb_data[mb_nr-1].slice_nr));  /*oliver*/
 
  
  
  b8_x=img_x>>3;
  b8_y=img_y>>3;
  
  //check block up
  
  block_available_up=( b8_y-1>=0 && (mb_up_available||(img_y/8)%2));
  
  //check block up right
  block_available_up_right=( b8_x+1<(img->width>>3) && b8_y-1>=0 && mb_up_right_available);
  
  //check block left
  block_available_left=( b8_x - 1 >=0 && (mb_left_available || (img_x/8)%2));
  
  //check block left down
  block_available_left_down=( b8_x - 1>=0 && b8_y + 1 < (img->height>>3) && mb_left_down_available);
	if( ((img_x/8)%2)  && ((img_y/8)%2))
		block_available_up_right=0;
		
	if( ((img_x/8)%2)  || ((img_y/8)%2))
		block_available_left_down=0;

  //get prediciton pixels
  if(block_available_up)
  {
    for(x=0;x<bs_x;x++)
      EP[x+1]=imgY[img_y-/*1*/off_up/*lgp*/][img_x+x];
    
    if(block_available_up_right)
    {
      for(x=0;x<bs_x;x++)
        EP[1+x+bs_x]=imgY[img_y-/*1*/off_up/*lgp*/][img_x+bs_x+x];
      for(;x<bs_y;x++)
        EP[1+x+bs_x]=imgY[img_y-/*1*/off_up/*lgp*/][img_x+bs_x+bs_x-1];
    }
    else
    {
      for(x=0;x<bs_y;x++)
        EP[1+x+bs_x]=EP[bs_x];
    }

    for(;x<bs_y+2;x++)
      EP[1+x+bs_x]=EP[bs_x+x];
    
    EP[0]=imgY[img_y-/*1*/off_up/*lgp*/][img_x];
  }
  if(block_available_left)
  {
    for(y=0;y<bs_y;y++)
      EP[-1-y]=imgY[img_y+/*y*/incr_y*y-off_y][img_x-1];

    if(block_available_left_down)
    {
      for(y=0;y<bs_y;y++)
        EP[-1-y-bs_y]=imgY[img_y+bs_y+y][img_x-1];
      for(;y<bs_x;y++)
        EP[-1-y-bs_y]=imgY[img_y+bs_y+bs_y-1][img_x-1];
    }
    else
    {
      for(y=0;y<bs_x;y++)
        EP[-1-y-bs_y]=EP[-bs_y];
    }

    for(;y<bs_x+2;y++)
      EP[-1-y-bs_y]=EP[-y-bs_y];

    EP[0]=imgY[img_y-off_y/*lgp*/][img_x-1];
  }
  if(block_available_up&&block_available_left)
    EP[0]=imgY[img_y-/*1*/off_y-off_up/*lgp*/][img_x-1];
  
  //lowpass (Those emlements that are not needed will not disturb)
  last_pix=EP[-(bs_x+bs_y)];
  for(i=-(bs_x+bs_y);i<=(bs_x+bs_y);i++)
  {
    new_pix=( last_pix + (EP[i]<<1) + EP[i+1] + 2 )>>2;
    last_pix=EP[i];
    EP[i]=(unsigned char)new_pix;
  }
  for(i=0;i<9;i++)
    img->mprr[i][0][0]=-1;
  // 0 DC
  if(!block_available_up && !block_available_left)
    for(y=0UL;y<bs_y;y++)
      for(x=0UL;x<bs_x;x++)
        img->mprr[DC_PRED][y][x]=128UL;

  if(block_available_up && !block_available_left)
    for(y=0UL;y<bs_y;y++)
      for(x=0UL;x<bs_x;x++)
        img->mprr[DC_PRED][y][x]=EP[1+x];

  if(!block_available_up && block_available_left)
    for(y=0UL;y<bs_y;y++)
      for(x=0UL;x<bs_x;x++)
        img->mprr[DC_PRED][y][x]=EP[-1-y];

  
  if(block_available_up && block_available_left)
    for(y=0UL;y<bs_y;y++)
      for(x=0UL;x<bs_x;x++)
        img->mprr[DC_PRED][y][x]=(EP[1+x]+EP[-1-y])>>1;
 
  // 1 vertical
  if(block_available_up)
    for(y=0UL;y<bs_y;y++)
      for(x=0UL;x<bs_x;x++)
        img->mprr[VERT_PRED][y][x]=imgY[img_y-1][img_x+x];
      
  // 2 horizontal
  if(block_available_left)
    for(y=0UL;y<bs_y;y++)
      for(x=0UL;x<bs_x;x++)
        img->mprr[HOR_PRED][y][x]=imgY[img_y+y][img_x-1];

  // 3 down-right
  if(block_available_left&&block_available_up)
    for(y=0UL;y<bs_y;y++)
      for(x=0UL;x<bs_x;x++)
        img->mprr[DOWN_RIGHT_PRED][y][x]=EP[x-y];

  // 4 up-right bidirectional
  if(block_available_left&&block_available_up)
    for(y=0UL;y<bs_y;y++)
      for(x=0UL;x<bs_x;x++)
        img->mprr[DOWN_LEFT_PRED][y][x]=(EP[2+x+y]+EP[-2-(x+y)])>>1;

}

⌨️ 快捷键说明

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