+ vlc_spin_lock( &p_sys->lock );
+ const int i_sin = p_sys->i_sin;
+ const int i_cos = p_sys->i_cos;
+ vlc_spin_unlock( &p_sys->lock );
+
+ 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_out_pitch+2*i_col] = p_in[i_line_orig*i_in_pitch+2*i_col_orig];
+ i_col_orig /= 2;
+ p_out_u[i_line*i_out_pitch+2*i_col] = p_in_u[i_line_orig*i_in_pitch+4*i_col_orig];
+ p_out_v[i_line*i_out_pitch+2*i_col] = p_in_v[i_line_orig*i_in_pitch+4*i_col_orig];
+ }
+ else
+ {
+ p_out[i_line*i_out_pitch+2*i_col] = 0x00;
+ p_out_u[i_line*i_out_pitch+2*i_col] = 0x80;
+ p_out_v[i_line*i_out_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_out_pitch+2*i_col] = p_in[i_line_orig*i_in_pitch+2*i_col_orig];
+ }
+ else
+ {
+ p_out[i_line*i_out_pitch+2*i_col] = 0x00;
+ }
+ }
+ }
+
+ return CopyInfoAndRelease( p_outpic, p_pic );