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

📄 tps_bfshape.cpp

📁 jpeg and mpeg 编解码技术源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      }
      ppxlcV += FwidthUV;
    }
/*
  printf("======== width = %d, height = %d\n", width, height);
  FILE *fp;
  fp = fopen("bbb", "w");
  fwrite(destY, sizeof (PixelC), width*height, fp);
  fwrite(destU, sizeof (PixelC), width*height/4, fp);
  fwrite(destV, sizeof (PixelC), width*height/4, fp);
  fclose(fp);
  exit(1);
*/
}

Void convertYuv(const CVOPU8YUVBA* pvopcSrc, PixelC* destY, PixelC* destU, PixelC* destV, Int width, Int height)
{
    CoordI x, y;
    Int Fwidth   = pvopcSrc->whereY ().width;
    Int FwidthUV = pvopcSrc->whereUV ().width;

    Int nSkipYPixel = Fwidth  * EXPANDY_REF_FRAME  + EXPANDY_REF_FRAME;
    Int nSkipUVPixel = FwidthUV * EXPANDUV_REF_FRAME + EXPANDUV_REF_FRAME;
    PixelC* ppxlcY = (PixelC*)( (Int)(pvopcSrc->pixelsY ()) + nSkipYPixel );
    PixelC* ppxlcU = (PixelC*)( (Int)(pvopcSrc->pixelsU ()) + nSkipUVPixel );
    PixelC* ppxlcV = (PixelC*)( (Int)(pvopcSrc->pixelsV ()) + nSkipUVPixel );
    PixelC* pdY = destY;    PixelC* pdU = destU;    PixelC* pdV = destV;
    PixelC* psY;    PixelC* psU;    PixelC* psV;
	
  // convert
    for (y = 0; y < height; y++) {
      psY = ppxlcY;
      for (x = 0; x < width; x++) {
	*pdY = *psY;
	pdY++;
	psY++;
      }
      ppxlcY += Fwidth;
    }
    for (y = 0; y < height/2; y++) {
      psU = ppxlcU;
      for (x = 0; x < width/2; x++) {
	*pdU = *psU;
	pdU++;
	psU++;
      }
      ppxlcU += FwidthUV;
    }
    for (y = 0; y < height/2; y++) {
      psV = ppxlcV;
      for (x = 0; x < width/2; x++) {
	*pdV = *psV;
	pdV++;
	psV++;
      }
      ppxlcV += FwidthUV;
    }
}

Void convertSeg(const CVOPU8YUVBA* pvopcSrc, PixelC* destBY, PixelC* destBUV, Int width, Int height,
		Int left, Int right, Int top, Int bottom)
{
    CoordI x, y;
    Int Fwidth  = pvopcSrc->whereY ().width;
    Int sum, color = 0;

    Int nSkipYPixel  = Fwidth  * EXPANDY_REF_FRAME  + EXPANDY_REF_FRAME;
    PixelC* ppxlcBY  = (PixelC*)( (Int)(pvopcSrc->pixelsBY ()) + nSkipYPixel );
    PixelC* pdBY = destBY;    PixelC* pdBUV = destBUV;
    PixelC* psBY;

  // convert
    for (y = 0; y < height; y++) {
      psBY = ppxlcBY;
      for (x = 0; x < width; x++) {
	if(left <= x && x < right && top <= y && y < bottom)
	  *pdBY = *psBY;
	else{
	  *pdBY = *psBY = 0; // set zero for out side of VOP rectangle
	}
	if(*pdBY>0) color = *pdBY;
	pdBY++;
	psBY++;
      }
      ppxlcBY += Fwidth;
    }
//    if(color == 0){
//      printf("!!! No object !!!\n");
//      exit(1);
//    }
    for (y = 0; y < height/2; y++) {
      for (x = 0; x < width/2; x++) {
	sum = *(destBY + 2*y*width + 2*x) + *(destBY + (2*y+1)*width + 2*x) +
	      *(destBY + 2*y*width + 2*x+1) + *(destBY + (2*y+1)*width + 2*x+1);
	if(sum>0)
	  *pdBUV = color;
	else
	  *pdBUV = 0;
	pdBUV++;
      }
    }
}

// modified Oct. 1 '97 (by Watanabe and Katata)
/* NBIT: change unsigned char to PixelC
Void pre_pad(unsigned char *mask, unsigned char *curr, int width, int height)
*/
Void pre_pad(PixelC *mask, PixelC *curr, int width, int height)
{
  int		i, j;
  int		flag_cnt = 0;
  int *flag_blk, *mask_blk;
  double *curr_blk;
  double	pad_val = 0.0;
  int		ic, jc;

  double *hori_blk, *vert_blk;
	int *hori_flag_blk, *vert_flag_blk;
  
  flag_blk = (int *)malloc(sizeof(int)*width*height);
  mask_blk = (int *)malloc(sizeof(int)*width*height);
  curr_blk = (double *)malloc(sizeof(double)*width*height);

 // Oct. 1 '97
  hori_blk = (double *)malloc(sizeof(double)*width*height);
  vert_blk = (double *)malloc(sizeof(double)*width*height);
  hori_flag_blk = (int *)malloc(sizeof(int)*width*height);
  vert_flag_blk = (int *)malloc(sizeof(int)*width*height);
  
  
  for(j = 0; j < height; j++)
		for(i = 0; i < width; i++) {
		  mask_blk[j * width + i] = (mask[j * width + i] != 0);
		  if(mask_blk[j * width + i])
				hori_blk[j * width + i] = vert_blk[j * width + i] = curr_blk[j * width + i] = (double) curr[j * width + i];
			else
				hori_blk[j * width + i] = vert_blk[j * width + i] = curr_blk[j * width + i] = 0;
	}
  
  for(j = 0; j < height; j++)
	for(i = 0; i < width; i++)
	  flag_cnt+= (flag_blk[j * width + i] = mask_blk[j * width + i]);
  
  if(flag_cnt == 0)  return;

  
	while(flag_cnt != 0) {

	for(j = 0; j < height; j++)
		for(i = 0; i < width; i++)
			hori_flag_blk[j * width + i] = vert_flag_blk[j * width + i] = flag_blk[j * width + i];

	for(j = 0; j < height; j++)
		for(i = 0; i < width; i++){
		  mask_blk[j * width + i] = flag_blk[j * width + i];
			hori_blk[j * width + i] = vert_blk[j * width + i] = curr_blk[j * width + i];
	}

	for(j = 0; j < height; j++) {/* horizontal scan */
		for(ic = 1; ic < width; ic++)
			if(mask_blk[j * width + ic-1] - mask_blk[j * width + ic] == 1)  break;
		for(i = ic; i < width; i++) {
			if(mask_blk[j * width + i-1] - mask_blk[j * width + i] == 1)
				pad_val = hori_blk[j * width + i-1];
			if(!mask_blk[j * width + i]) {
				hori_blk[j * width + i]+= pad_val;
				hori_flag_blk[j * width + i]++;
			}
	  }
	  for(ic = width-2; ic >= 0; ic--)
			if(mask_blk[j * width + ic+1] - mask_blk[j * width + ic] == 1)  break;
	  for(i = ic; i >= 0; i--) {
			if(mask_blk[j * width + i+1] - mask_blk[j * width + i] == 1)
				pad_val = hori_blk[j * width + i+1];
			if(!mask_blk[j * width + i]) {
				hori_blk[j * width + i]+= pad_val;
				hori_flag_blk[j * width + i]++;
			}
	  }
	}/* end of horizontal scan */

	for(j = 0; j < height; j++)
	  for(i = 0; i < width; i++)
			if(hori_flag_blk[j * width + i] != 0) {
			  hori_blk[j * width + i] = (int)(hori_blk[j * width + i]/(double) hori_flag_blk[j * width + i]); // Oct.1 '97
			  hori_flag_blk[j * width + i]/= hori_flag_blk[j * width + i];
			}

	for(i = 0; i < width; i++) {/* vertical scan */
	  for(jc = 1; jc < height; jc++)
			if(mask_blk[(jc-1) * width + i] - mask_blk[jc * width + i] == 1)  break;
	  for(j = jc; j < height; j++) {
			if(mask_blk[(j-1) * width + i] - mask_blk[j * width + i] == 1)
			  pad_val = vert_blk[(j-1) * width + i];
			if(!mask_blk[j * width + i]) {
				vert_blk[j * width + i]+= pad_val;
				vert_flag_blk[j * width + i]++;
			}
	  }
	  for(jc = height-2; jc >= 0; jc--)
			if(mask_blk[(jc+1) * width + i] - mask_blk[jc * width + i] == 1)  break;
	  for(j = jc; j >= 0; j--) {
			if(mask_blk[(j+1) * width + i] - mask_blk[j * width + i] == 1)
			  pad_val = vert_blk[(j+1) * width + i];
			if(!mask_blk[j * width + i]) {
				vert_blk[j * width + i]+= pad_val;
				vert_flag_blk[j * width + i]++;
			}
	  }
	}/* end of vertical scan */
	
	for(j = 0; j < height; j++)
	  for(i = 0; i < width; i++)
		if(vert_flag_blk[j * width + i] != 0) {
		  vert_blk[j * width + i] = (int)(vert_blk[j * width + i]/(double) vert_flag_blk[j * width + i]); // Oct.1 '97
		  vert_flag_blk[j * width + i]/= vert_flag_blk[j * width + i];
		}

	for(j = 0; j < height; j++)
	  for(i = 0; i < width; i++)
			if(hori_flag_blk[j * width + i] == 1 && vert_flag_blk[j * width + i] == 1)
				curr_blk[j * width + i] = (int)((hori_blk[j * width + i] + vert_blk[j * width + i])/2.0);
			else if (hori_flag_blk[j * width + i] == 1)
				curr_blk[j * width + i] = hori_blk[j * width + i];
			else if (vert_flag_blk[j * width + i] == 1)
				curr_blk[j * width + i] = vert_blk[j * width + i];


	flag_cnt = width * height;
	for(j = 0; j < height; j++)
	  for(i = 0; i < width; i++)
			if(hori_flag_blk[j * width + i] == 1 || vert_flag_blk[j * width + i] == 1){
				flag_blk[j * width + i] = 1;
			  flag_cnt--;
			}

  }/* end of while() */
  
  for(j = 0; j < height; j++)
	for(i = 0; i < width; i++)
	  curr[j * width + i] = (unsigned char) curr_blk[j * width + i];

  free(flag_blk);
  free(mask_blk);
  free(curr_blk);
  free(hori_blk);
  free(vert_blk);
  free(hori_flag_blk);
  free(vert_flag_blk);
}

⌨️ 快捷键说明

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