- /* Create grayscale version of input */
- vlc_memcpy( p_out_y, p_in_y, p_pic->p[Y_PLANE].i_visible_lines
- * p_pic->p[Y_PLANE].i_pitch - 8 );
- vlc_memset( p_out_u, 0x80, p_pic->p[U_PLANE].i_visible_lines
- * p_pic->p[U_PLANE].i_pitch - 8 );
- vlc_memset( p_out_v, 0x80, p_pic->p[U_PLANE].i_visible_lines
- * p_pic->p[U_PLANE].i_pitch - 8 );
+ for( int y = 0; y < p_pic->p[U_PLANE].i_visible_lines; y++ )
+ {
+ uint8_t *p_src_u = &p_pic->p[U_PLANE].p_pixels[y * p_pic->p[U_PLANE].i_pitch];
+ uint8_t *p_src_v = &p_pic->p[V_PLANE].p_pixels[y * p_pic->p[V_PLANE].i_pitch];
+ uint8_t *p_dst_u = &p_outpic->p[U_PLANE].p_pixels[y * p_outpic->p[U_PLANE].i_pitch];
+ uint8_t *p_dst_v = &p_outpic->p[V_PLANE].p_pixels[y * p_outpic->p[V_PLANE].i_pitch];
+
+ for( int x = 0; x < p_pic->p[U_PLANE].i_visible_pitch; x++ )
+ {
+ if( IsSimilar( *p_src_u - 0x80, *p_src_v - 0x80,
+ refu, refv, reflength,
+ i_satthres, i_simthres ) )
+
+ {
+ *p_dst_u++ = *p_src_u;
+ *p_dst_v++ = *p_src_v;
+ }
+ else
+ {
+ *p_dst_u++ = 0x80;
+ *p_dst_v++ = 0x80;
+ }
+ p_src_u++;
+ p_src_v++;
+ }
+ }
+
+ 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;
+ int i_simthres = atomic_load( &p_sys->i_simthres );
+ int i_satthres = atomic_load( &p_sys->i_satthres );
+ int i_color = atomic_load( &p_sys->i_color );
+
+ if( !p_pic ) return NULL;
+
+ p_outpic = filter_NewPicture( p_filter );
+ if( !p_outpic )
+ {
+ picture_Release( p_pic );
+ return NULL;
+ }
+
+ int i_y_offset, i_u_offset, i_v_offset;
+ int i_ret = GetPackedYuvOffsets( p_filter->fmt_in.video.i_chroma,
+ &i_y_offset, &i_u_offset, &i_v_offset );
+ if( i_ret == VLC_EGENERIC )
+ {
+ picture_Release( p_pic );
+ return NULL;
+ }