+ p_in = p_pic->p->p_pixels + i_y_offset;
+ p_in_end = p_in + p_pic->p->i_visible_lines * p_pic->p->i_pitch - 8 * 4;
+
+ p_out = p_outpic->p->p_pixels + i_y_offset;
+
+ for( ; p_in < p_in_end ; )
+ {
+ p_line_end = p_in + i_visible_pitch - 8 * 4;
+
+ for( ; p_in < p_line_end ; )
+ {
+ /* Do 8 pixels at a time */
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ }
+
+ p_line_end += 8 * 4;
+
+ for( ; p_in < p_line_end ; )
+ {
+ *p_out = pi_luma[ *p_in ]; p_in += 2; p_out += 2;
+ }
+
+ p_in += i_pitch - p_pic->p->i_visible_pitch;
+ p_out += i_pitch - p_outpic->p->i_visible_pitch;
+ }
+
+ /*
+ * Do the U and V planes
+ */
+
+ p_in = p_pic->p->p_pixels + i_u_offset;
+ p_in_v = p_pic->p->p_pixels + i_v_offset;
+ p_in_end = p_in + i_visible_lines * i_pitch - 8 * 4;
+
+ p_out = p_outpic->p->p_pixels + i_u_offset;
+ p_out_v = p_outpic->p->p_pixels + i_v_offset;
+
+ i_sin = sin(f_hue) * 256;
+ i_cos = cos(f_hue) * 256;
+
+ i_x = ( cos(f_hue) + sin(f_hue) ) * 32768;
+ i_y = ( cos(f_hue) - sin(f_hue) ) * 32768;
+
+ if ( i_sat > 256 )
+ {
+#define WRITE_UV_CLIP() \
+ i_u = *p_in; p_in += 4; i_v = *p_in_v; p_in_v += 4; \
+ *p_out = clip_uint8_vlc( (( ((i_u * i_cos + i_v * i_sin - i_x) >> 8) \
+ * i_sat) >> 8) + 128); \
+ p_out += 4; \
+ *p_out_v = clip_uint8_vlc( (( ((i_v * i_cos - i_u * i_sin - i_y) >> 8) \
+ * i_sat) >> 8) + 128); \
+ p_out_v += 4
+
+ uint8_t i_u, i_v;
+
+ for( ; p_in < p_in_end ; )
+ {
+ p_line_end = p_in + i_visible_pitch - 8 * 4;
+
+ for( ; p_in < p_line_end ; )
+ {
+ /* Do 8 pixels at a time */
+ WRITE_UV_CLIP(); WRITE_UV_CLIP();
+ WRITE_UV_CLIP(); WRITE_UV_CLIP();
+ WRITE_UV_CLIP(); WRITE_UV_CLIP();
+ WRITE_UV_CLIP(); WRITE_UV_CLIP();
+ }
+
+ p_line_end += 8 * 4;
+
+ for( ; p_in < p_line_end ; )
+ {
+ WRITE_UV_CLIP();
+ }
+
+ p_in += i_pitch - i_visible_pitch;
+ p_in_v += i_pitch - i_visible_pitch;
+ p_out += i_pitch - i_visible_pitch;
+ p_out_v += i_pitch - i_visible_pitch;
+ }
+#undef WRITE_UV_CLIP
+ }
+ else
+ {
+#define WRITE_UV() \
+ i_u = *p_in; p_in += 4; i_v = *p_in_v; p_in_v += 4; \
+ *p_out = (( ((i_u * i_cos + i_v * i_sin - i_x) >> 8) \
+ * i_sat) >> 8) + 128; \
+ p_out += 4; \
+ *p_out_v = (( ((i_v * i_cos - i_u * i_sin - i_y) >> 8) \
+ * i_sat) >> 8) + 128; \
+ p_out_v += 4
+
+ uint8_t i_u, i_v;
+
+ for( ; p_in < p_in_end ; )
+ {
+ p_line_end = p_in + i_visible_pitch - 8 * 4;
+
+ for( ; p_in < p_line_end ; )
+ {
+ /* Do 8 pixels at a time */
+ WRITE_UV(); WRITE_UV(); WRITE_UV(); WRITE_UV();
+ WRITE_UV(); WRITE_UV(); WRITE_UV(); WRITE_UV();
+ }
+
+ p_line_end += 8 * 4;
+
+ for( ; p_in < p_line_end ; )
+ {
+ WRITE_UV();
+ }
+
+ p_in += i_pitch - i_visible_pitch;
+ p_in_v += i_pitch - i_visible_pitch;
+ p_out += i_pitch - i_visible_pitch;
+ p_out_v += i_pitch - i_visible_pitch;
+ }
+#undef WRITE_UV
+ }
+
+ return CopyInfoAndRelease( p_outpic, p_pic );
+}
+
+static int AdjustCallback( 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(oldval);
+ filter_sys_t *p_sys = (filter_sys_t *)p_data;
+
+ if( !strcmp( psz_var, "contrast" ) )
+ p_sys->f_contrast = newval.f_float;
+ else if( !strcmp( psz_var, "brightness" ) )
+ p_sys->f_brightness = newval.f_float;
+ else if( !strcmp( psz_var, "hue" ) )
+ p_sys->i_hue = newval.i_int;
+ else if( !strcmp( psz_var, "saturation" ) )
+ p_sys->f_saturation = newval.f_float;
+ else if( !strcmp( psz_var, "gamma" ) )
+ p_sys->f_gamma = newval.f_float;
+ else if( !strcmp( psz_var, "brightness-threshold" ) )
+ p_sys->b_brightness_threshold = newval.b_bool;
+ else
+ return VLC_EGENERIC;
+ return VLC_SUCCESS;