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

📄 transform.c

📁 h261协议的h261编码码,lib_261.h里面提供了详细的接口和说明.
💻 C
📖 第 1 页 / 共 2 页
字号:
//  for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
//    {
//      *mptr = *mptr / acqfact;
//    }
//#else
  if (acqfact&1) /* Odd */
    {
      acqfact<<=1;
      for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
	*mptr = *mptr / acqfact;
    }
  else
    {
      acqfact<<=1;
      for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
	{
	  if (*mptr>0)
	    *mptr = (*mptr+1) / acqfact;
	  else
	    *mptr = (*mptr-1) / acqfact;
	}
    }
//#endif
}

/*BFUNC

ICCITTFlatQuantize_en() does an inverse flat quantize on the dc element
and an inverse thresholded quantize on the ac elements of the input
matrix.

EFUNC*/

//void ICCITTFlatQuantize_en(matrix,dcqfact,acqfact)
//     int *matrix;
//     int dcqfact;
//     int acqfact;
void ICCITTFlatQuantize_en(int *matrix,int dcqfact,int acqfact)
{
	BEGIN("ICCITTFlatQuantize_en");
	int *mptr;
    
	*matrix = *matrix*dcqfact;

//#ifdef VERSION_1_0  
//	acqfact++;
//	for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
//	{
//		if (*mptr>0) 
//		{
//			*mptr = ((*mptr<<1) + 1)*acqfact;
//		}
//		else if (*mptr<0) 
//		{
//			*mptr = ((*mptr<<1) - 1)*acqfact;
//		}
//	}
//#else
	if (acqfact&1) /* Odd */
	{
		for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
		{
			if (*mptr>0) 
			{
				*mptr = ((*mptr<<1) + 1)*acqfact;
			}
			else if (*mptr<0) 
			{
				*mptr = ((*mptr<<1) - 1)*acqfact;
			}
		}
	}
	else
	{
		for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
		{
			if (*mptr>0) 
			{
				*mptr = (((*mptr<<1) + 1)*acqfact)-1;
			}
			else if (*mptr<0)
			{
				*mptr = (((*mptr<<1) - 1)*acqfact)+1;
			}
		}
	}
//#endif
}

/*BFUNC

ICCITTQuantize_en() does an inverse quantize on the dc element and the ac
element with their selective q values, respectively.

EFUNC*/

//void ICCITTQuantize_en(matrix,dcqfact,acqfact)
//     int *matrix;
//     int dcqfact;
//     int acqfact;
void ICCITTQuantize_en(int *matrix,int dcqfact,int acqfact)
{
  BEGIN("ICCITTQuantize_en");
  int *mptr;

//#ifdef VERSION_1_0
//  dcqfact++;
//  acqfact++;
//  if (*matrix>0) {*matrix = (2* *matrix + 1)*dcqfact;}
//  else if (*matrix<0) {*matrix = (2* *matrix - 1)*dcqfact;}
//  for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
//    {
//      if (*mptr>0) {*mptr = (2* *mptr + 1)*acqfact;}
//      else if (*mptr<0) {*mptr = (2* *mptr - 1)*acqfact;}
//    }
//#else
  if (dcqfact&1)
    {
      if (*matrix>0) {*matrix = ((*matrix<<1) + 1)*dcqfact;}
	  else if (*matrix<0) {*matrix = ((*matrix<<1) - 1)*dcqfact;}
    }
  else
    {
      if (*matrix>0) {*matrix = (((*matrix<<1) + 1)*dcqfact)-1;}
      else if (*matrix<0) {*matrix = (((*matrix<<1) - 1)*dcqfact)+1;}
    }
  if (acqfact&1) /* Odd */
    {
      for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
	{
	  if (*mptr>0) {*mptr = ((*mptr<<1) + 1)*acqfact;}
	  else if (*mptr<0) {*mptr = ((*mptr<<1) - 1)*acqfact;}
	}
    }
  else
    {
      for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
	{
	  if (*mptr>0) {*mptr = (((*mptr<<1) + 1)*acqfact)-1;}
	  else if (*mptr<0) {*mptr = (((*mptr<<1) - 1)*acqfact)+1;}
	}
    }
//#endif
}


/*BFUNC

BoundDctMatrix_en() clips the Dct matrix such that it is no larger than
a 10 bit word.

EFUNC*/

//void BoundDctMatrix_en(matrix)
//     int *matrix;
void BoundDctMatrix_en(int *matrix)
{
	BEGIN("BoundDctMatrix_en");
	int *mptr;
    
	if (*matrix > 2047)
	{
		*matrix = 2047;
	}
	for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
	{
		if (*mptr < -1023) 
		{
			*mptr = -1023;
		}
		else if (*mptr > 1023) 
		{
			*mptr = 1023;
		}
	}
}


/*BFUNC

BoundIDctMatrix_en bounds the inverse dct matrix so that no pixel has a
value greater than 255 or less than 0.

EFUNC*/

//void BoundIDctMatrix_en(matrix)
//     int *matrix;
void BoundIDctMatrix_en(int *matrix)
{
  BEGIN("BoundIDctMatrix_en");
  int *mptr;

  for(mptr=matrix;mptr<matrix+BLOCKSIZE;mptr++)
    {
      if (*mptr < 0) {*mptr = 0;}
      else if (*mptr > 255) {*mptr = 255;}
    }
}

/*BFUNC

FlatBoundQuantizeMatrix_en() bounds a quantized matrix generated by
CCITTFlatQuantize_en().

EFUNC*/

//void FlatBoundQuantizeMatrix_en(matrix)
//     int *matrix;
void FlatBoundQuantizeMatrix_en(int *matrix)
{
  BEGIN("FlatBoundQuantizeMatrix_en");
  int *mptr;

  if (*matrix > 254) {*matrix = 254;}
  else if (*matrix < 1) {*matrix = 1;}
  for(mptr=matrix+1;mptr<matrix+BLOCKSIZE;mptr++)
    {
      if (*mptr < -127) {*mptr = -127;}  /* Should this be a -127? */
      else if (*mptr > 127) {*mptr = 127;}
    }
}

/*BFUNC

BoundQuantizeMatrix_en() bounds a quantized matrix generated by
CCITTQuantize_en().

EFUNC*/
//
//void BoundQuantizeMatrix_en(matrix)
//     int *matrix;
void BoundQuantizeMatrix_en(int *matrix)
{
	BEGIN("BoundQuantizeMatrix_en");
	int *mptr;
	
	for(mptr=matrix;mptr<matrix+BLOCKSIZE;mptr++)
	{
		if (*mptr < -127)	
		{
			*mptr = -127;
		}  /* Should this be a -127? */
		else if (*mptr > 127) 
		{
			*mptr = 127;
		}
	}
}


/*BFUNC

IZigzagMatrix_en() performs an inverse zig-zag translation on the
input imatrix and places the output in omatrix.

EFUNC*/

//void IZigzagMatrix_en(imatrix,omatrix)
//     int *imatrix;
//     int *omatrix;
void IZigzagMatrix_en(int *imatrix,int *omatrix)
{
	BEGIN("IZigzagMatrix_en");
	int *tptr;
    
	for(tptr=zigzag_index;tptr<zigzag_index+BLOCKSIZE;tptr++)
	{
		*(omatrix) = imatrix[*tptr];
		//fprintf(fp,"*(omatrix) = %d\timatrix[%d]=%d\n",*(omatrix),*tptr,imatrix[*tptr]);
		omatrix++;
	}
}

/*BFUNC

ZigzagMatrix_en() performs a zig-zag translation on the input imatrix
and puts the output in omatrix.

EFUNC*/

//void ZigzagMatrix_en(imatrix,omatrix)
//     int *imatrix;
//     int *omatrix;
void ZigzagMatrix_en(int *imatrix,int *omatrix)
{
  BEGIN("ZigzagMatrix_en");
  int *tptr;

  for(tptr=zigzag_index;tptr<zigzag_index+BLOCKSIZE;tptr++)
    {
      omatrix[*tptr] = *(imatrix++);
    }
}

/*BFUNC

PrintMatrix() prints an 8x8 matrix in row/column form. 

EFUNC*/

//void PrintMatrix(matrix)
//     int *matrix;
//void PrintMatrix(int *matrix)
//{
//  BEGIN("PrintMatrix");
//  int i,j;
//
//  if (matrix)
//    {
//      for(i=0;i<BLOCKHEIGHT;i++)
//	{
//	  for(j=0;j<BLOCKWIDTH;j++) {printf("%6d ",*(matrix++));}
//	  printf("\n");
//	}
//    }
//  else {printf("Null\n");}
//}
//

/*BFUNC

ClearMatrix() sets all the elements of a matrix to be zero.

EFUNC*/

//void ClearMatrix(matrix)
//     int *matrix;
//void ClearMatrix(int *matrix)
//{
//  BEGIN("ClearMatrix");
//  int *mptr;
//
//  for(mptr=matrix;mptr<matrix+BLOCKSIZE;mptr++) {*mptr = 0;}
//}

/*END*/

⌨️ 快捷键说明

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