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

📄 yuvscaler_resample.c

📁 Motion JPEG编解码器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
      if (interlaced == Y4M_ILACE_NONE)	{	  mjpeg_debug ("Non-interlaced downscaling");	  for (out_line_slice = 0; out_line_slice < local_out_nb_line_slice;	       out_line_slice++)	    {	      input_line_p[0] =		input + (4 * out_line_slice + 0) * local_input_width;	      input_line_p[1] =		input + (4 * out_line_slice + 1) * local_input_width;	      input_line_p[2] =		input + (4 * out_line_slice + 2) * local_input_width;	      input_line_p[3] =		input + (4 * out_line_slice + 3) * local_input_width;	      output_line_p[0] =		output + 3 * out_line_slice * local_output_width;	      output_line_p[1] = output_line_p[0] + local_output_width;	      output_line_p[2] = output_line_p[1] + local_output_width;	      for (out_col = 0; out_col < local_output_active_width;		   out_col++)		{		  *(output_line_p[0]++) =		    divide[3 * (*input_line_p[0]++) + (*input_line_p[1])];		  *(output_line_p[1]++) =		    divide[2 * (*input_line_p[1]++) + 2 * (*input_line_p[2])];		  *(output_line_p[2]++) =		    divide[(*input_line_p[2]++) + 3 * (*input_line_p[3]++)];		}	    }	}      else	{	  mjpeg_debug ("Interlaced downscaling");	  for (out_line_slice = 0; out_line_slice < local_out_nb_line_slice;	       out_line_slice++)	    {	      u_c_p =		input +		((out_line_slice & ~(unsigned int) 1) * input_height_slice +		 (out_line_slice % 2)) * local_input_width;	      for (in_line = 0; in_line < input_height_slice; in_line++)		{		  input_line_p[in_line] = u_c_p;		  u_c_p += 2 * local_input_width;		}	      u_c_p =		output +		((out_line_slice & ~(unsigned int) 1) *		 output_height_slice +		 (out_line_slice % 2)) * local_output_width;	      for (out_line = 0; out_line < output_height_slice; out_line++)		{		  output_line_p[out_line] = u_c_p;		  u_c_p += 2 * local_output_width;		}	      for (out_col = 0; out_col < local_output_active_width;		   out_col++)		{		  *(output_line_p[0]++) =		    divide[3 * (*input_line_p[0]++) + (*input_line_p[1])];		  *(output_line_p[1]++) =		    divide[2 * (*input_line_p[1]++) + 2 * (*input_line_p[2])];		  *(output_line_p[2]++) =		    divide[(*input_line_p[2]++) + 3 * (*input_line_p[3]++)];		}	    }	}    }  if (specific == 8)    {      // Special FASTWIDE2VCD mode: 2 to 1 for width, and 8 to 3 for height      // *8 is replaced by <<3 and 2* by <<1      // Drawback: slight distortion on width      // Coefficient for horizontal downscaling : (3,3,2), (1,3,3,1), (2,3,3)      treatment = 8;      if (interlaced == Y4M_ILACE_NONE)	{	  mjpeg_debug ("Non-interlaced downscaling");	  for (out_line_slice = 0; out_line_slice < local_out_nb_line_slice;	       out_line_slice++)	    {	      input_line_p[0] =		input + (8 * out_line_slice + 0) * local_input_width;	      input_line_p[1] =		input + (8 * out_line_slice + 1) * local_input_width;	      input_line_p[2] =		input + (8 * out_line_slice + 2) * local_input_width;	      input_line_p[3] =		input + (8 * out_line_slice + 3) * local_input_width;	      input_line_p[4] =		input + (8 * out_line_slice + 4) * local_input_width;	      input_line_p[5] =		input + (8 * out_line_slice + 5) * local_input_width;	      input_line_p[6] =		input + (8 * out_line_slice + 6) * local_input_width;	      input_line_p[7] =		input + (8 * out_line_slice + 7) * local_input_width;	      output_line_p[0] =		output + out_line_slice * 3 * local_output_width;	      output_line_p[1] = output_line_p[0] + local_output_width;	      output_line_p[2] = output_line_p[1] + local_output_width;	      for (out_col = 0; out_col < local_output_active_width;		   out_col++)		{		  *(output_line_p[0]++) =		    divide[3 * (*input_line_p[0] + (*input_line_p[0] + 1)) +			   3 * (*input_line_p[1] + (*input_line_p[1] + 1)) +			   2 * (*input_line_p[2] + (*input_line_p[2] + 1))];		  input_line_p[0] += 2;		  input_line_p[1] += 2;		  *(output_line_p[1]++) = divide[(*input_line_p[2] +						  (*input_line_p[2] + 1)) +						 3 * (*input_line_p[3] +						      (*input_line_p[3] +						       1)) +						 3 * (*input_line_p[4] +						      (*input_line_p[4] +						       1)) +						 (*input_line_p[5] +						  (*input_line_p[5] + 1))];		  input_line_p[2] += 2;		  input_line_p[3] += 2;		  input_line_p[4] += 2;		  *(output_line_p[2]++) =		    divide[2 * (*input_line_p[5] + (*input_line_p[5] + 1)) +			   3 * (*input_line_p[6] + (*input_line_p[6] + 1)) +			   3 * (*input_line_p[7] + (*input_line_p[7] + 1))];		  input_line_p[5] += 2;		  input_line_p[6] += 2;		  input_line_p[7] += 2;		}	    }	}      else	{	  mjpeg_debug ("Interlaced downscaling");	  for (out_line_slice = 0; out_line_slice < local_out_nb_line_slice;	       out_line_slice++)	    {	      input_line_p[0] =		input + (((out_line_slice & ~(unsigned int) 1) << 3) +			 (out_line_slice % 2)) * local_input_width;	      input_line_p[1] = input_line_p[0] + (local_input_width << 1);	      input_line_p[2] = input_line_p[1] + (local_input_width << 1);	      input_line_p[3] = input_line_p[2] + (local_input_width << 1);	      input_line_p[4] = input_line_p[3] + (local_input_width << 1);	      input_line_p[5] = input_line_p[4] + (local_input_width << 1);	      input_line_p[6] = input_line_p[5] + (local_input_width << 1);	      input_line_p[7] = input_line_p[6] + (local_input_width << 1);	      output_line_p[0] =		output + ((out_line_slice & ~(unsigned int) 1) * 3 +			  (out_line_slice % 2)) * local_output_width;	      output_line_p[1] = output_line_p[0] + (local_output_width << 1);	      output_line_p[2] = output_line_p[1] + (local_output_width << 1);	      for (out_col = 0; out_col < local_output_active_width;		   out_col++)		{		  *(output_line_p[0]++) =		    divide[3 * (*input_line_p[0] + (*input_line_p[0] + 1)) +			   3 * (*input_line_p[1] + (*input_line_p[1] + 1)) +			   2 * (*input_line_p[2] + (*input_line_p[2] + 1))];		  input_line_p[0] += 2;		  input_line_p[1] += 2;		  *(output_line_p[1]++) = divide[(*input_line_p[2] +						  (*input_line_p[2] + 1)) +						 3 * (*input_line_p[3] +						      (*input_line_p[3] +						       1)) +						 3 * (*input_line_p[4] +						      (*input_line_p[4] +						       1)) +						 (*input_line_p[5] +						  (*input_line_p[5] + 1))];		  input_line_p[2] += 2;		  input_line_p[3] += 2;		  input_line_p[4] += 2;		  *(output_line_p[2]++) =		    divide[2 * (*input_line_p[5] + (*input_line_p[5] + 1)) +			   3 * (*input_line_p[6] + (*input_line_p[6] + 1)) +			   3 * (*input_line_p[7] + (*input_line_p[7] + 1))];		  input_line_p[5] += 2;		  input_line_p[6] += 2;		  input_line_p[7] += 2;		}	    }	}    }  if (specific == 9)    {      // Special WIDE2VCD, on height : 8->3      treatment = 9;      if (interlaced == Y4M_ILACE_NONE)	{	  mjpeg_debug ("Non-interlaced downscaling");	  // input frames are not interlaced, as are output frames.	  // So, we average input_height_slice following lines into output_height_slice lines	  for (out_line_slice = 0; out_line_slice < local_out_nb_line_slice;	       out_line_slice++)	    {	      for (in_line = 0; in_line < input_height_slice; in_line++)		{		  number = out_line_slice * input_height_slice + in_line;		  input_line_p[in_line] = input + number * local_input_width;		}	      u_c_p =		output +		out_line_slice * output_height_slice * local_output_width;	      for (out_line = 0; out_line < output_height_slice; out_line++)		{		  output_line_p[out_line] = u_c_p;		  u_c_p += local_output_width;		}	      for (out_col_slice = 0;		   out_col_slice < local_out_nb_col_slice; out_col_slice++)		{		  W = width_coeff;		  for (out_col = 0; out_col < output_width_slice; out_col++)		    {		      nb_W = *W;		      value1 = value2 = value3 = 0;		      W_var = W + 1;		      for (j = 0; j < nb_W - 1; j++)			{			  value1 +=			    (*W_var) * (3 * (*input_line_p[0]++) +					3 * (*input_line_p[1]++) +					2 * (*input_line_p[2]));			  value2 +=			    (*W_var) * ((*input_line_p[2]++) +					3 * (*input_line_p[3]++) +					3 * (*input_line_p[4]++) +					(*input_line_p[5]));			  value3 +=			    (*W_var++) * (2 * (*input_line_p[5]++) +					  3 * (*input_line_p[6]++) +					  3 * (*input_line_p[7]++));			}		      value1 +=			(*W_var) * (3 * (*input_line_p[0]) +				    3 * (*input_line_p[1]) +				    2 * (*input_line_p[2]));		      value2 +=			(*W_var) * ((*input_line_p[2]) +				    3 * (*input_line_p[3]) +				    3 * (*input_line_p[4]) +				    (*input_line_p[5]));		      value3 +=			(*W_var) * (2 * (*input_line_p[5]) +				    3 * (*input_line_p[6]) +				    3 * (*input_line_p[7]));		      *(output_line_p[0]++) = divide[value1];		      *(output_line_p[1]++) = divide[value2];		      *(output_line_p[2]++) = divide[value3];		      W += nb_W + 1;		    }		  input_line_p[0]++;		  input_line_p[1]++;		  input_line_p[2]++;		  input_line_p[3]++;		  input_line_p[4]++;		  input_line_p[5]++;		  input_line_p[6]++;		  input_line_p[7]++;		}	    }	}      else	{	  mjpeg_debug ("Interlaced downscaling");	  for (out_line_slice = 0; out_line_slice < local_out_nb_line_slice;	       out_line_slice++)	    {	      u_c_p =		input +		((out_line_slice & ~(unsigned int) 1) * input_height_slice +		 (out_line_slice % 2)) * local_input_width;	      for (in_line = 0; in_line < input_height_slice; in_line++)		{		  input_line_p[in_line] = u_c_p;		  u_c_p += 2 * local_input_width;		}	      u_c_p =		output +		((out_line_slice & ~(unsigned int) 1) *		 output_height_slice +		 (out_line_slice % 2)) * local_output_width;	      for (out_line = 0; out_line < output_height_slice; out_line++)		{		  output_line_p[out_line] = u_c_p;		  u_c_p += 2 * local_output_width;		}	      for (out_col_slice = 0;		   out_col_slice < local_out_nb_col_slice; out_col_slice++)		{		  H = height_coeff;		  first_line = 0;		  for (out_line = 0; out_line < output_height_slice;		       out_line++)		    {		      nb_H = *H;		      W = width_coeff;		      for (out_col = 0; out_col < output_width_slice;			   out_col++)			{			  H_var = H + 1;			  nb_W = *W;			  value = 0;			  last_line = first_line + nb_H;			  for (current_line = first_line;			       current_line < last_line; current_line++)			    {			      W_var = W + 1;			      // we average nb_W columns of input : we increment input_line_p[current_line] and W_var each time, except for the last value where 			      // input_line_p[current_line] and W_var do not need to be incremented, but H_var does			      for (j = 0; j < nb_W - 1; j++)				value +=				  (*H_var) * (*W_var++) *				  (*input_line_p[current_line]++);			      value +=				(*H_var++) * (*W_var) *				(*input_line_p[current_line]);			    }			  //                Straiforward implementation is 			  //                *(output_line_p[out_line]++)=value/diviseur;			  //                round_off_error=value%diviseur;			  //                Here, we speed up things but using the pretabulated integral parts			  *(output_line_p[out_line]++) = divide[value];			  W += nb_W + 1;			}		      H += nb_H + 1;		      first_line += nb_H - 1;		      input_line_p[first_line] -= input_width_slice - 1;		      // If last line of input is to be reused in next loop, 		      // make the pointer points at the correct place		    }		  input_line_p[first_line] += input_width_slice - 1;		  for (in_line = 0; in_line < input_height_slice; in_line++)		    input_line_p[in_line]++;		}	    }	}    }  if (treatment == 0)    mjpeg_error_exit1 ("Unknown specific downscaling treatment %u",		       specific);  mjpeg_debug ("End of average_specific");  return (0);}

⌨️ 快捷键说明

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