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

📄 yuvscaler_bicubic.c

📁 Motion JPEG编解码器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
			  pmaddwd_r2r(mm3,mm6);     movq_r2m(mm6,*(mmx_t *)mmx_res);			  value1+=mmx_res[0]+mmx_res[1];			  break;			default:			  mjpeg_error_exit1("width neighbors = %d, is not supported inside cubic-scale function",width_neighbors);			  break;		       }		     cspline_wp+=width_neighbors;		     if (value1 < 0) *(output_p++) = 0;		     else {			value = (value1 + FLOAT2INTOFFSET) >> FLOAT2INTEGERPOWER;			if (value > 255) *(output_p++) = 255;			else *(output_p++) = (uint8_t) value;		     }		  }		// a line on output is now finished. We jump to the beginning of the next line		output_p+=output_offset;		line_0+=local_padded_width;	     }	}      else#endif	 */	{	   // We only scale on width, not height	   width_neighbors-=zero_width_neighbors;	   height_neighbors-=zero_height_neighbors;	   line_0=padded_input;	   for (out_line = 0; out_line < local_output_active_height; out_line++)	     {		cspline_wp=cspline_w;		in_col_p=in_col;		for (out_col = 0; out_col < local_output_active_width; out_col++)		  {		     line = line_0 + *(in_col_p++);		     value1=*(line++)*(*(cspline_wp++));		     for (w=1;w<width_neighbors-1;w++) 		       value1+=*(line++)*(*(cspline_wp++));		     value1+=*(line)*(*(cspline_wp++));		     if (zero_width_neighbors)		       cspline_wp++;		     		     if (value1 < 0) *(output_p++) = 0;		     else {			value = (value1 + FLOAT2INTOFFSET) >> FLOAT2INTEGERPOWER;			if (value > 255) *(output_p++) = 255;			else *(output_p++) = (uint8_t) value;		     }		  }		// a line on output is now finished. We jump to the beginning of the next line		output_p+=output_offset;		line_0+=local_padded_width;	     }	}      break;        case 5:      // We only scale on height, not width	{	   width_neighbors-=zero_width_neighbors;	   height_neighbors-=zero_height_neighbors;	   cspline_hp0=cspline_h;	   in_line_p=in_line;	   for (out_line = 0; out_line < local_output_active_height; out_line++)	     {		line_begin=padded_input + *(in_line_p++) * local_padded_width;		for (out_col = 0; out_col < local_output_active_width-1; out_col++)		  {		     cspline_hp=cspline_hp0;		     value1 = *(line_begin)*(*(cspline_hp++));		     for (h=1;h<height_neighbors-1;h++)		       value1 += (*(line_begin+h*local_padded_width))*(*(cspline_hp++));		     value1 += (*((line_begin++)+h*local_padded_width))*(*(cspline_hp));		     if (value1 < 0) *(output_p++) = 0;		     else {			value = (value1 + FLOAT2INTOFFSET) >> FLOAT2INTEGERPOWER;			if (value > 255) *(output_p++) = 255;			else *(output_p++) = (uint8_t) value;		     }		  }		// last out_col to be treated => cspline_hp0 incremented => we use the C "++" facility		value1 = *(line_begin)*(*(cspline_hp0++));		for (h=1;h<height_neighbors;h++)		  value1 += (*(line_begin+h*local_padded_width))*(*(cspline_hp0++));		if (zero_height_neighbors)		  cspline_hp0++;				if (value1 < 0) *(output_p++) = 0;		else {		   value = (value1 + FLOAT2INTOFFSET) >> FLOAT2INTEGERPOWER;		   if (value > 255) *(output_p++) = 255;		   else *(output_p++) = (uint8_t) value;		}		// a line on output is now finished. We jump to the beginning of the next line		output_p+=output_offset;	     }	}      break;   }   /* *INDENT-ON* */   //   mjpeg_debug ("End of cubic_scale");   return (0);}// *************************************************************************************// *************************************************************************************intcubic_scale_interlaced (uint8_t * padded_top, uint8_t * padded_bottom, uint8_t * output, 			unsigned int *in_col, unsigned int *in_line,			int16_t * cspline_w, uint16_t  width_neighbors, uint8_t zero_width_neighbors,			int16_t * cspline_h, uint16_t height_neighbors, uint8_t zero_height_neighbors,			unsigned int half){  // Warning: because cubic-spline values may be <0 or >1.0, a range test on value is mandatory  unsigned int local_output_active_width = output_active_width >> half;  unsigned int local_output_active_height = output_active_height >> half;  unsigned int local_output_width = output_width >> half;  unsigned int local_input_useful_height = input_useful_height >> half;  unsigned int local_input_useful_width = input_useful_width >> half;  unsigned int local_padded_height = local_input_useful_height + height_neighbors -1;  unsigned int local_padded_width = local_input_useful_width + width_neighbors -1;  unsigned int out_line, out_col,w,h;  unsigned int *in_line_p,*in_col_p;  int16_t output_offset;  uint8_t *output_p,*line,*line_begin,*line_top,*line_bot;  int16_t *cspline_wp,*cspline_hp,*cspline_hp0;  int32_t value=0,value1=0,*inter_begin,*intermediate_p,*intermediate_top_p,*intermediate_bot_p;;//   mjpeg_debug ("Start of cubic_scale ");   output_p = output;   output_offset = local_output_width-local_output_active_width;   width_neighbors-=zero_width_neighbors;   height_neighbors-=zero_height_neighbors;      /* *INDENT-OFF* */      switch(specific) {    case 0: 	{	   // First scale along the Width, not the height	   // TOP, then BOTTOM	   intermediate_p=intermediate;	   line_top = padded_top;	   for (out_line = 0; out_line < (local_padded_height>>1); out_line++)	     {		cspline_wp=cspline_w;		in_col_p=in_col;		for (out_col = 0; out_col < local_output_active_width; out_col++)		  {		     line = line_top + *(in_col_p++);		     value1=*(line++)*(*(cspline_wp++));		     for (w=1;w<width_neighbors-1;w++) 		       value1+=*(line++)*(*(cspline_wp++));		     value1+=*(line)*(*(cspline_wp++));		     if (zero_width_neighbors)		       cspline_wp++;		     *(intermediate_p++)=value1;		  }		// a line of intermediate in now finished. Make line_0 points on the next line of padded_input		line_top+=local_padded_width;	     }	   line_bot = padded_bottom;	   for (out_line = 0; out_line < (local_padded_height>>1); out_line++)	     {		cspline_wp=cspline_w;		in_col_p=in_col;		for (out_col = 0; out_col < local_output_active_width; out_col++)		  {		     line = line_bot + *(in_col_p++);		     value1=*(line++)*(*(cspline_wp++));		     for (w=1;w<width_neighbors-1;w++) 		       value1+=*(line++)*(*(cspline_wp++));		     value1+=*(line)*(*(cspline_wp++));		     if (zero_width_neighbors)		       cspline_wp++;		     *(intermediate_p++)=value1;		  }		// a line of intermediate in now finished. Make line_0 points on the next line of padded_input		line_bot+=local_padded_width;	     }	   	   // Intermediate now contains an width-scaled frame. top frame on top and bottom frame on bottom	   // we now scale it along the height, not the width	   	   intermediate_top_p=intermediate;	   intermediate_bot_p=intermediate+(local_output_active_height>>1)*local_output_active_width;	   cspline_hp0=cspline_h;	   in_line_p=in_line;	   for (out_line = 0; out_line < (local_output_active_height>>1); out_line++)	     {		// TOP line		inter_begin=intermediate_top_p + *(in_line_p) * local_output_active_width;		for (out_col = 0; out_col < local_output_active_width; out_col++)		  {		     cspline_hp=cspline_hp0;		     value1 = *(inter_begin)*(*(cspline_hp++));		     for (h=1;h<height_neighbors-1;h++)		       value1 += (*(inter_begin+h*local_output_active_width))*(*(cspline_hp++));		     value1 += (*((inter_begin++)+h*local_output_active_width))*(*(cspline_hp));		     		     if (value1 < 0) *(output_p++) = 0;		     else {			value =(value1 + DBLEFLOAT2INTOFFSET) >> DBLEFLOAT2INT;			if (value > 255) *(output_p++) = 255;			else *(output_p++) = (uint8_t) value;		     }		  }		// a top line on output is now finished. We jump to the beginning of the next bottom line		output_p+=output_offset;				// BOTTOM line		inter_begin=intermediate_bot_p + *(in_line_p++) * local_output_active_width;		for (out_col = 0; out_col < local_output_active_width-1; out_col++)		  {		     cspline_hp=cspline_hp0;		     value1 = *(inter_begin)*(*(cspline_hp++));		     for (h=1;h<height_neighbors-1;h++)		       value1 += (*(inter_begin+h*local_output_active_width))*(*(cspline_hp++));		     value1 += (*((inter_begin++)+h*local_output_active_width))*(*(cspline_hp));		     		     if (value1 < 0) *(output_p++) = 0;		     else {			value =(value1 + DBLEFLOAT2INTOFFSET) >> DBLEFLOAT2INT;			if (value > 255) *(output_p++) = 255;			else *(output_p++) = (uint8_t) value;		     }		  }		// last out_col to be treated => cspline_hp0 incremented => we use the C "++" facility		value1 = *(inter_begin)*(*(cspline_hp0++));		for (h=1;h<height_neighbors;h++)		  value1 += (*(inter_begin+h*local_output_active_width))*(*(cspline_hp0++));		if (zero_height_neighbors)		  cspline_hp0++;				if (value1 < 0) *(output_p++) = 0;		else {		   value =(value1 + DBLEFLOAT2INTOFFSET) >> DBLEFLOAT2INT;		   if (value > 255) *(output_p++) = 255;		   else *(output_p++) = (uint8_t) value;		}		// a bottom line on output is now finished. We jump to the beginning of the next top line		output_p+=output_offset;	     }	}    break;        case 1:      // We only scale on width, not height	{	   line_top=padded_top;	   line_bot=padded_bottom;	   for (out_line = 0; out_line < (local_output_active_height>>1); out_line++)	     {		// TOP LINE		cspline_wp=cspline_w;		in_col_p=in_col;		for (out_col = 0; out_col < local_output_active_width; out_col++)		  {		     line = line_top + *(in_col_p++);		     value1=*(line++)*(*(cspline_wp++));		     for (w=1;w<width_neighbors-1;w++) 		       value1+=*(line++)*(*(cspline_wp++));		     value1+=*(line)*(*(cspline_wp++));		     if (zero_width_neighbors)		       cspline_wp++;		     		     if (value1 < 0) *(output_p++) = 0;		     else {			value = (value1 + FLOAT2INTOFFSET) >> FLOAT2INTEGERPOWER;			if (value > 255) *(output_p++) = 255;			else *(output_p++) = (uint8_t) value;		     }		  }		// a top line on output is now finished. We jump to the beginning of the next bottom line

⌨️ 快捷键说明

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