📄 yuvscaler_bicubic.c
字号:
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 + -