📄 rotate.c
字号:
- i_sin * i_col_center + (1<<11) ); int i_col_orig0 = i_sin * i_line_center / i_aspect - i_cos * i_col_center + (1<<11); for( ; p_outendline < p_outend; p_out += i_hidden_pitch, p_outendline += i_pitch, i_line_orig0 += i_line_next, i_col_orig0 += i_col_next ) { for( ; p_out < p_outendline; p_out++, i_line_orig0 += i_sin, i_col_orig0 += i_cos ) { const int i_line_orig = (i_line_orig0>>12)*i_aspect + i_line_center; const int i_col_orig = (i_col_orig0>>12) + i_col_center; const uint8_t* p_orig_offset = p_in + i_line_orig * i_pitch + i_col_orig; const uint8_t i_line_percent = (i_line_orig0>>4) & 255; const uint8_t i_col_percent = (i_col_orig0 >>4) & 255; if( -1 <= i_line_orig && i_line_orig < i_visible_lines && -1 <= i_col_orig && i_col_orig < i_visible_pitch ) { #define test 1 #undef test #ifdef test if( ( i_col_orig > i_visible_pitch/2 ) ) #endif { uint8_t i_curpix = black_pixel; uint8_t i_colpix = black_pixel; uint8_t i_linpix = black_pixel; uint8_t i_nexpix = black_pixel; if( ( 0 <= i_line_orig ) && ( 0 <= i_col_orig ) ) i_curpix = *p_orig_offset; p_orig_offset++; if( ( i_col_orig < i_visible_pitch - 1) && ( i_line_orig >= 0 ) ) i_colpix = *p_orig_offset; p_orig_offset+=i_pitch; if( ( i_line_orig < i_visible_lines - 1) && ( i_col_orig < i_visible_pitch - 1) ) i_nexpix = *p_orig_offset; p_orig_offset--; if( ( i_line_orig < i_visible_lines - 1) && ( i_col_orig >= 0 ) ) i_linpix = *p_orig_offset; unsigned int temp = 0; temp+= i_curpix * (256 - i_line_percent) * ( 256 - i_col_percent ); temp+= i_linpix * i_line_percent * (256 - i_col_percent ); temp+= i_nexpix * ( i_col_percent) * ( i_line_percent); temp+= i_colpix * i_col_percent * (256 - i_line_percent ); *p_out = temp >> 16; } #ifdef test else if (i_col_orig == i_visible_pitch/2 ) { *p_out = black_pixel; } else *p_out = *p_orig_offset; #endif #undef test } else { *p_out = black_pixel; } } } } return CopyInfoAndRelease( p_outpic, p_pic );}/***************************************************************************** * *****************************************************************************/static picture_t *FilterPacked( filter_t *p_filter, picture_t *p_pic ){ picture_t *p_outpic; filter_sys_t *p_sys = p_filter->p_sys; const int i_sin = p_sys->i_sin, i_cos = p_sys->i_cos; if( !p_pic ) return NULL; int i_u_offset, i_v_offset, i_y_offset; if( GetPackedYuvOffsets( p_pic->format.i_chroma, &i_y_offset, &i_u_offset, &i_v_offset ) != VLC_SUCCESS ) { msg_Warn( p_filter, "Unsupported input chroma (%4s)", (char*)&(p_pic->format.i_chroma) ); picture_Release( p_pic ); return NULL; } p_outpic = filter_NewPicture( p_filter ); if( !p_outpic ) { picture_Release( p_pic ); return NULL; } const uint8_t *p_in = p_pic->p->p_pixels+i_y_offset; const uint8_t *p_in_u = p_pic->p->p_pixels+i_u_offset; const uint8_t *p_in_v = p_pic->p->p_pixels+i_v_offset; const int i_pitch = p_pic->p->i_pitch; const int i_visible_pitch = p_pic->p->i_visible_pitch>>1; /* In fact it's i_visible_pixels */ const int i_visible_lines = p_pic->p->i_visible_lines; uint8_t *p_out = p_outpic->p->p_pixels+i_y_offset; uint8_t *p_out_u = p_outpic->p->p_pixels+i_u_offset; uint8_t *p_out_v = p_outpic->p->p_pixels+i_v_offset; const int i_line_center = i_visible_lines>>1; const int i_col_center = i_visible_pitch>>1; int i_col, i_line; for( i_line = 0; i_line < i_visible_lines; i_line++ ) { for( i_col = 0; i_col < i_visible_pitch; i_col++ ) { int i_line_orig; int i_col_orig; /* Handle "1st Y", U and V */ i_line_orig = i_line_center + ( ( i_sin * ( i_col - i_col_center ) + i_cos * ( i_line - i_line_center ) )>>12 ); i_col_orig = i_col_center + ( ( i_cos * ( i_col - i_col_center ) - i_sin * ( i_line - i_line_center ) )>>12 ); if( 0 <= i_col_orig && i_col_orig < i_visible_pitch && 0 <= i_line_orig && i_line_orig < i_visible_lines ) { p_out[i_line*i_pitch+2*i_col] = p_in[i_line_orig*i_pitch+2*i_col_orig]; i_col_orig /= 2; p_out_u[i_line*i_pitch+2*i_col] = p_in_u[i_line_orig*i_pitch+4*i_col_orig]; p_out_v[i_line*i_pitch+2*i_col] = p_in_v[i_line_orig*i_pitch+4*i_col_orig]; } else { p_out[i_line*i_pitch+2*i_col] = 0x00; p_out_u[i_line*i_pitch+2*i_col] = 0x80; p_out_v[i_line*i_pitch+2*i_col] = 0x80; } /* Handle "2nd Y" */ i_col++; if( i_col >= i_visible_pitch ) break; i_line_orig = i_line_center + ( ( i_sin * ( i_col - i_col_center ) + i_cos * ( i_line - i_line_center ) )>>12 ); i_col_orig = i_col_center + ( ( i_cos * ( i_col - i_col_center ) - i_sin * ( i_line - i_line_center ) )>>12 ); if( 0 <= i_col_orig && i_col_orig < i_visible_pitch && 0 <= i_line_orig && i_line_orig < i_visible_lines ) { p_out[i_line*i_pitch+2*i_col] = p_in[i_line_orig*i_pitch+2*i_col_orig]; } else { p_out[i_line*i_pitch+2*i_col] = 0x00; } } } return CopyInfoAndRelease( p_outpic, p_pic );}/***************************************************************************** * Angle modification callbacks. *****************************************************************************/static int RotateCallback( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ VLC_UNUSED(p_this); VLC_UNUSED(psz_var); VLC_UNUSED(oldval); filter_sys_t *p_sys = (filter_sys_t *)p_data; p_sys->i_angle = newval.i_int*10; cache_trigo( p_sys->i_angle, &p_sys->i_sin, &p_sys->i_cos ); return VLC_SUCCESS;}static int PreciseRotateCallback( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ VLC_UNUSED(p_this); VLC_UNUSED(psz_var); VLC_UNUSED(oldval); filter_sys_t *p_sys = (filter_sys_t *)p_data; p_sys->i_angle = newval.i_int; cache_trigo( p_sys->i_angle, &p_sys->i_sin, &p_sys->i_cos ); return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -