1 /*****************************************************************************
2 * extract.c : Extract RGB components
3 *****************************************************************************
4 * Copyright (C) 2000-2006 the VideoLAN team
7 * Authors: Antoine Cellerier <dionoea .t videolan d@t org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
32 #include <vlc_common.h>
33 #include <vlc_plugin.h>
36 #include "vlc_filter.h"
37 #include "filter_picture.h"
41 /*****************************************************************************
43 *****************************************************************************/
44 static int Create ( vlc_object_t
* );
45 static void Destroy ( vlc_object_t
* );
47 static picture_t
*Filter( filter_t
*, picture_t
* );
48 static int ExtractCallback( vlc_object_t
*, char const *,
49 vlc_value_t
, vlc_value_t
, void * );
51 static void get_red_from_yuv420( picture_t
*, picture_t
*, int, int, int );
52 static void get_green_from_yuv420( picture_t
*, picture_t
*, int, int, int );
53 static void get_blue_from_yuv420( picture_t
*, picture_t
*, int, int, int );
54 static void get_red_from_yuv422( picture_t
*, picture_t
*, int, int, int );
55 static void get_green_from_yuv422( picture_t
*, picture_t
*, int, int, int );
56 static void get_blue_from_yuv422( picture_t
*, picture_t
*, int, int, int );
57 static void make_projection_matrix( filter_t
*, int color
, int *matrix
);
58 static void get_custom_from_yuv420( picture_t
*, picture_t
*, int, int, int, int * );
59 static void get_custom_from_yuv422( picture_t
*, picture_t
*, int, int, int, int * );
60 static void get_custom_from_packedyuv422( picture_t
*, picture_t
*, int * );
63 #define COMPONENT_TEXT N_("RGB component to extract")
64 #define COMPONENT_LONGTEXT N_("RGB component to extract. 0 for Red, 1 for Green and 2 for Blue.")
65 #define FILTER_PREFIX "extract-"
67 static const int pi_component_values
[] = { 0xFF0000, 0x00FF00, 0x0000FF };
68 static const char *const ppsz_component_descriptions
[] = {
69 "Red", "Green", "Blue" };
71 /*****************************************************************************
73 *****************************************************************************/
75 set_description( N_("Extract RGB component video filter") )
76 set_shortname( N_("Extract" ))
77 set_category( CAT_VIDEO
)
78 set_subcategory( SUBCAT_VIDEO_VFILTER
)
79 set_capability( "video filter2", 0 )
80 add_shortcut( "extract" )
82 add_integer_with_range( FILTER_PREFIX
"component", 0xFF0000, 1, 0xFFFFFF,
83 NULL
, COMPONENT_TEXT
, COMPONENT_LONGTEXT
, false )
84 change_integer_list( pi_component_values
, ppsz_component_descriptions
, NULL
)
86 set_callbacks( Create
, Destroy
)
89 static const char *const ppsz_filter_options
[] = {
93 enum { RED
=0xFF0000, GREEN
=0x00FF00, BLUE
=0x0000FF };
97 int *projection_matrix
;
100 /*****************************************************************************
102 *****************************************************************************/
103 static int Create( vlc_object_t
*p_this
)
105 filter_t
*p_filter
= (filter_t
*)p_this
;
107 switch( p_filter
->fmt_in
.video
.i_chroma
)
109 case VLC_FOURCC('I','4','2','0'):
110 case VLC_FOURCC('I','Y','U','V'):
111 case VLC_FOURCC('J','4','2','0'):
112 case VLC_FOURCC('Y','V','1','2'):
114 case VLC_FOURCC('I','4','2','2'):
115 case VLC_FOURCC('J','4','2','2'):
121 /* We only want planar YUV 4:2:0 or 4:2:2 */
122 msg_Err( p_filter
, "Unsupported input chroma (%4s)",
123 (char*)&(p_filter
->fmt_in
.video
.i_chroma
) );
127 /* Allocate structure */
128 p_filter
->p_sys
= malloc( sizeof( filter_sys_t
) );
129 if( p_filter
->p_sys
== NULL
)
131 p_filter
->p_sys
->projection_matrix
= malloc( 9 * sizeof( int ) );
132 if( !p_filter
->p_sys
->projection_matrix
)
134 free( p_filter
->p_sys
);
138 config_ChainParse( p_filter
, FILTER_PREFIX
, ppsz_filter_options
,
141 p_filter
->p_sys
->i_color
= var_CreateGetIntegerCommand( p_filter
,
142 FILTER_PREFIX
"component" );
143 var_AddCallback( p_filter
, FILTER_PREFIX
"component",
144 ExtractCallback
, p_filter
->p_sys
);
146 /* Matrix won't be used for RED, GREEN or BLUE in planar formats */
147 make_projection_matrix( p_filter
, p_filter
->p_sys
->i_color
,
148 p_filter
->p_sys
->projection_matrix
);
150 p_filter
->pf_video_filter
= Filter
;
155 /*****************************************************************************
157 *****************************************************************************/
158 static void Destroy( vlc_object_t
*p_this
)
160 filter_t
*p_filter
= (filter_t
*)p_this
;
162 free( p_filter
->p_sys
->projection_matrix
);
163 free( p_filter
->p_sys
);
166 /*****************************************************************************
168 *****************************************************************************/
169 static picture_t
*Filter( filter_t
*p_filter
, picture_t
*p_pic
)
173 if( !p_pic
) return NULL
;
175 p_outpic
= filter_NewPicture( p_filter
);
178 picture_Release( p_pic
);
182 switch( p_pic
->format
.i_chroma
)
184 case VLC_FOURCC('I','4','2','0'):
185 case VLC_FOURCC('I','Y','U','V'):
186 case VLC_FOURCC('J','4','2','0'):
187 case VLC_FOURCC('Y','V','1','2'):
188 switch( p_filter
->p_sys
->i_color
)
191 get_red_from_yuv420( p_pic
, p_outpic
,
192 Y_PLANE
, U_PLANE
, V_PLANE
);
195 get_green_from_yuv420( p_pic
, p_outpic
,
196 Y_PLANE
, U_PLANE
, V_PLANE
);
199 get_blue_from_yuv420( p_pic
, p_outpic
,
200 Y_PLANE
, U_PLANE
, V_PLANE
);
203 get_custom_from_yuv420( p_pic
, p_outpic
,
204 Y_PLANE
, U_PLANE
, V_PLANE
,
205 p_filter
->p_sys
->projection_matrix
);
210 case VLC_FOURCC('I','4','2','2'):
211 case VLC_FOURCC('J','4','2','2'):
212 switch( p_filter
->p_sys
->i_color
)
215 get_red_from_yuv422( p_pic
, p_outpic
,
216 Y_PLANE
, U_PLANE
, V_PLANE
);
219 get_green_from_yuv422( p_pic
, p_outpic
,
220 Y_PLANE
, U_PLANE
, V_PLANE
);
223 get_blue_from_yuv422( p_pic
, p_outpic
,
224 Y_PLANE
, U_PLANE
, V_PLANE
);
227 get_custom_from_yuv422( p_pic
, p_outpic
,
228 Y_PLANE
, U_PLANE
, V_PLANE
,
229 p_filter
->p_sys
->projection_matrix
);
235 get_custom_from_packedyuv422( p_pic
, p_outpic
,
236 p_filter
->p_sys
->projection_matrix
);
240 msg_Warn( p_filter
, "Unsupported input chroma (%4s)",
241 (char*)&(p_pic
->format
.i_chroma
) );
242 picture_Release( p_pic
);
246 return CopyInfoAndRelease( p_outpic
, p_pic
);
249 static inline uint8_t crop( int a
)
251 if( a
< 0 ) return 0;
252 if( a
> 255 ) return 255;
253 else return (uint8_t)a
;
259 static void mmult( double *res
, double *a
, double *b
)
262 for( i
= 0; i
< 3; i
++ )
264 for( j
= 0; j
< 3; j
++ )
267 for( k
= 0; k
< 3; k
++ )
269 res
[ i
*3 + j
] += a
[ i
*3 + k
] * b
[ k
*3 + j
];
274 static void make_projection_matrix( filter_t
*p_filter
, int color
, int *matrix
)
276 double left_matrix
[9] =
277 { 76.24500, 149.68500, 29.07000,
278 -43.02765, -84.47235, 127.50000,
279 127.50000, -106.76534, -20.73466 };
280 double right_matrix
[9] =
281 { 257.00392, 0.00000, 360.31950,
282 257.00392, -88.44438, -183.53583,
283 257.00392, 455.41095, 0.00000 };
284 double red
= ((double)(( 0xFF0000 & color
)>>16))/255.;
285 double green
= ((double)(( 0x00FF00 & color
)>>8))/255.;
286 double blue
= ((double)( 0x0000FF & color
))/255.;
287 double norm
= sqrt( red
*red
+ green
*green
+ blue
*blue
);
291 /* XXX: We might still need to norm the rgb_matrix */
292 double rgb_matrix
[9] =
293 { red
*red
, red
*green
, red
*blue
,
294 red
*green
, green
*green
, green
*blue
,
295 red
*blue
, green
*blue
, blue
*blue
};
299 msg_Dbg( p_filter
, "red: %f", red
);
300 msg_Dbg( p_filter
, "green: %f", green
);
301 msg_Dbg( p_filter
, "blue: %f", blue
);
302 mmult( result1
, rgb_matrix
, right_matrix
);
303 mmult( result
, left_matrix
, result1
);
304 for( i
= 0; i
< 9; i
++ )
306 matrix
[i
] = (int)result
[i
];
308 msg_Dbg( p_filter
, "Projection matrix:" );
309 msg_Dbg( p_filter
, "%6d %6d %6d", matrix
[0], matrix
[1], matrix
[2] );
310 msg_Dbg( p_filter
, "%6d %6d %6d", matrix
[3], matrix
[4], matrix
[5] );
311 msg_Dbg( p_filter
, "%6d %6d %6d", matrix
[6], matrix
[7], matrix
[8] );
314 static void get_custom_from_yuv420( picture_t
*p_inpic
, picture_t
*p_outpic
,
315 int yp
, int up
, int vp
, int *m
)
317 uint8_t *y1in
= p_inpic
->p
[yp
].p_pixels
;
319 uint8_t *uin
= p_inpic
->p
[up
].p_pixels
;
320 uint8_t *vin
= p_inpic
->p
[vp
].p_pixels
;
322 uint8_t *y1out
= p_outpic
->p
[yp
].p_pixels
;
324 uint8_t *uout
= p_outpic
->p
[up
].p_pixels
;
325 uint8_t *vout
= p_outpic
->p
[vp
].p_pixels
;
327 const int i_pitch
= p_inpic
->p
[yp
].i_pitch
;
328 const int i_visible_pitch
= p_inpic
->p
[yp
].i_visible_pitch
;
329 const int i_visible_lines
= p_inpic
->p
[yp
].i_visible_lines
;
331 const int i_uv_pitch
= p_inpic
->p
[up
].i_pitch
;
332 const int i_uv_visible_pitch
= p_inpic
->p
[up
].i_visible_pitch
;
334 const uint8_t *yend
= y1in
+ i_visible_lines
* i_pitch
;
337 const uint8_t *y1end
= y1in
+ i_visible_pitch
;
338 y2in
= y1in
+ i_pitch
;
339 y2out
= y1out
+ i_pitch
;
340 while( y1in
< y1end
)
342 *uout
++ = crop( (*y1in
* m
[3] + (*uin
-U
) * m
[4] + (*vin
-V
) * m
[5])
344 *vout
++ = crop( (*y1in
* m
[6] + (*uin
-U
) * m
[7] + (*vin
-V
) * m
[8])
346 *y1out
++ = crop( (*y1in
++ * m
[0] + (*uin
-U
) * m
[1] + (*vin
-V
) * m
[2])
348 *y1out
++ = crop( (*y1in
++ * m
[0] + (*uin
-U
) * m
[1] + (*vin
-V
) * m
[2])
350 *y2out
++ = crop( (*y2in
++ * m
[0] + (*uin
-U
) * m
[1] + (*vin
-V
) * m
[2])
352 *y2out
++ = crop( (*y2in
++ * m
[0] + (*uin
++ - U
) * m
[1] + (*vin
++ -V
) * m
[2])
355 y1in
+= 2*i_pitch
- i_visible_pitch
;
356 y1out
+= 2*i_pitch
- i_visible_pitch
;
357 uin
+= i_uv_pitch
- i_uv_visible_pitch
;
358 uout
+= i_uv_pitch
- i_uv_visible_pitch
;
359 vin
+= i_uv_pitch
- i_uv_visible_pitch
;
360 vout
+= i_uv_pitch
- i_uv_visible_pitch
;
363 static void get_custom_from_yuv422( picture_t
*p_inpic
, picture_t
*p_outpic
,
364 int yp
, int up
, int vp
, int *m
)
366 uint8_t *y1in
= p_inpic
->p
[yp
].p_pixels
;
367 uint8_t *uin
= p_inpic
->p
[up
].p_pixels
;
368 uint8_t *vin
= p_inpic
->p
[vp
].p_pixels
;
370 uint8_t *y1out
= p_outpic
->p
[yp
].p_pixels
;
371 uint8_t *uout
= p_outpic
->p
[up
].p_pixels
;
372 uint8_t *vout
= p_outpic
->p
[vp
].p_pixels
;
374 const int i_pitch
= p_inpic
->p
[yp
].i_pitch
;
375 const int i_visible_pitch
= p_inpic
->p
[yp
].i_visible_pitch
;
376 const int i_visible_lines
= p_inpic
->p
[yp
].i_visible_lines
;
378 const int i_uv_pitch
= p_inpic
->p
[up
].i_pitch
;
379 const int i_uv_visible_pitch
= p_inpic
->p
[up
].i_visible_pitch
;
381 const uint8_t *yend
= y1in
+ i_visible_lines
* i_pitch
;
384 const uint8_t *y1end
= y1in
+ i_visible_pitch
;
385 while( y1in
< y1end
)
387 *uout
++ = crop( (*y1in
* m
[3] + (*uin
-U
) * m
[4] + (*vin
-V
) * m
[5])
389 *vout
++ = crop( (*y1in
* m
[6] + (*uin
-U
) * m
[7] + (*vin
-V
) * m
[8])
391 *y1out
++ = crop( (*y1in
++ * m
[0] + (*uin
-U
) * m
[1] + (*vin
-V
) * m
[2])
393 *y1out
++ = crop( (*y1in
++ * m
[0] + (*uin
++ -U
) * m
[1] + (*vin
++ -V
) * m
[2])
396 y1in
+= i_pitch
- i_visible_pitch
;
397 y1out
+= i_pitch
- i_visible_pitch
;
398 uin
+= i_uv_pitch
- i_uv_visible_pitch
;
399 uout
+= i_uv_pitch
- i_uv_visible_pitch
;
400 vin
+= i_uv_pitch
- i_uv_visible_pitch
;
401 vout
+= i_uv_pitch
- i_uv_visible_pitch
;
405 static void get_custom_from_packedyuv422( picture_t
*p_inpic
,
409 int i_y_offset
, i_u_offset
, i_v_offset
;
410 if( GetPackedYuvOffsets( p_inpic
->format
.i_chroma
, &i_y_offset
,
411 &i_u_offset
, &i_v_offset
) != VLC_SUCCESS
)
414 uint8_t *yin
= p_inpic
->p
->p_pixels
+ i_y_offset
;
415 uint8_t *uin
= p_inpic
->p
->p_pixels
+ i_u_offset
;
416 uint8_t *vin
= p_inpic
->p
->p_pixels
+ i_v_offset
;
418 uint8_t *yout
= p_outpic
->p
->p_pixels
+ i_y_offset
;
419 uint8_t *uout
= p_outpic
->p
->p_pixels
+ i_u_offset
;
420 uint8_t *vout
= p_outpic
->p
->p_pixels
+ i_v_offset
;
422 const int i_pitch
= p_inpic
->p
->i_pitch
;
423 const int i_visible_pitch
= p_inpic
->p
->i_visible_pitch
;
424 const int i_visible_lines
= p_inpic
->p
->i_visible_lines
;
426 const uint8_t *yend
= yin
+ i_visible_lines
* i_pitch
;
429 const uint8_t *ylend
= yin
+ i_visible_pitch
;
432 *uout
= crop( (*yin
* m
[3] + (*uin
-U
) * m
[4] + (*vin
-V
) * m
[5])
435 *vout
= crop( (*yin
* m
[6] + (*uin
-U
) * m
[7] + (*vin
-V
) * m
[8])
438 *yout
= crop( (*yin
* m
[0] + (*uin
-U
) * m
[1] + (*vin
-V
) * m
[2])
442 *yout
= crop( (*yin
* m
[0] + (*uin
-U
) * m
[1] + (*vin
-V
) * m
[2])
449 yin
+= i_pitch
- i_visible_pitch
;
450 yout
+= i_pitch
- i_visible_pitch
;
451 uin
+= i_pitch
- i_visible_pitch
;
452 uout
+= i_pitch
- i_visible_pitch
;
453 vin
+= i_pitch
- i_visible_pitch
;
454 vout
+= i_pitch
- i_visible_pitch
;
458 static void get_red_from_yuv420( picture_t
*p_inpic
, picture_t
*p_outpic
,
459 int yp
, int up
, int vp
)
461 uint8_t *y1in
= p_inpic
->p
[yp
].p_pixels
;
463 uint8_t *vin
= p_inpic
->p
[vp
].p_pixels
;
465 uint8_t *y1out
= p_outpic
->p
[yp
].p_pixels
;
467 uint8_t *uout
= p_outpic
->p
[up
].p_pixels
;
468 uint8_t *vout
= p_outpic
->p
[vp
].p_pixels
;
470 const int i_pitch
= p_inpic
->p
[yp
].i_pitch
;
471 const int i_visible_pitch
= p_inpic
->p
[yp
].i_visible_pitch
;
472 const int i_visible_lines
= p_inpic
->p
[yp
].i_visible_lines
;
474 const int i_uv_pitch
= p_inpic
->p
[up
].i_pitch
;
475 const int i_uv_visible_pitch
= p_inpic
->p
[up
].i_visible_pitch
;
477 const uint8_t *yend
= y1in
+ i_visible_lines
* i_pitch
;
480 const uint8_t *y1end
= y1in
+ i_visible_pitch
;
481 y2in
= y1in
+ i_pitch
;
482 y2out
= y1out
+ i_pitch
;
483 while( y1in
< y1end
)
490 *uout
++ = crop( (*y1in
* -11058 + (*vin
- V
) * -15504)
492 *vout
++ = crop( (*y1in
* 32768 + (*vin
- V
) * 45941)
494 *y1out
++ = crop( (*y1in
++ * 19595 + (*vin
- V
) * 27473)
496 *y1out
++ = crop( (*y1in
++ * 19595 + (*vin
- V
) * 27473)
498 *y2out
++ = crop( (*y2in
++ * 19594 + (*vin
- V
) * 27473)
500 *y2out
++ = crop( (*y2in
++ * 19594 + (*vin
++ - V
) * 27473)
503 y1in
+= 2*i_pitch
- i_visible_pitch
;
504 y1out
+= 2*i_pitch
- i_visible_pitch
;
505 uout
+= i_uv_pitch
- i_uv_visible_pitch
;
506 vin
+= i_uv_pitch
- i_uv_visible_pitch
;
507 vout
+= i_uv_pitch
- i_uv_visible_pitch
;
511 static void get_green_from_yuv420( picture_t
*p_inpic
, picture_t
*p_outpic
,
512 int yp
, int up
, int vp
)
514 uint8_t *y1in
= p_inpic
->p
[yp
].p_pixels
;
516 uint8_t *uin
= p_inpic
->p
[up
].p_pixels
;
517 uint8_t *vin
= p_inpic
->p
[vp
].p_pixels
;
519 uint8_t *y1out
= p_outpic
->p
[yp
].p_pixels
;
521 uint8_t *uout
= p_outpic
->p
[up
].p_pixels
;
522 uint8_t *vout
= p_outpic
->p
[vp
].p_pixels
;
524 const int i_pitch
= p_inpic
->p
[yp
].i_pitch
;
525 const int i_visible_pitch
= p_inpic
->p
[yp
].i_visible_pitch
;
526 const int i_visible_lines
= p_inpic
->p
[yp
].i_visible_lines
;
528 const int i_uv_pitch
= p_inpic
->p
[up
].i_pitch
;
529 const int i_uv_visible_pitch
= p_inpic
->p
[up
].i_visible_pitch
;
531 const uint8_t *yend
= y1in
+ i_visible_lines
* i_pitch
;
534 const uint8_t *y1end
= y1in
+ i_visible_pitch
;
535 y2in
= y1in
+ i_pitch
;
536 y2out
= y1out
+ i_pitch
;
537 while( y1in
< y1end
)
544 *uout
++ = crop( (*y1in
* -21710 + (*uin
-U
) * 7471 + (*vin
-V
) * 15504)
546 *vout
++ = crop( (*y1in
* -27439 + (*uin
-U
) * 9443 + (*vin
-V
) * 19595)
548 *y1out
++ = crop( (*y1in
++ * 38470 + (*uin
-U
) * -13239 + (*vin
-V
) * -27473)
550 *y1out
++ = crop( (*y1in
++ * 38470 + (*uin
-U
) * -13239 + (*vin
-V
) * -27473)
552 *y2out
++ = crop( (*y2in
++ * 38470 + (*uin
-U
) * -13239 + (*vin
-V
) * -27473)
554 *y2out
++ = crop( (*y2in
++ * 38470 + (*uin
++ - U
) * -13239 + (*vin
++ -V
) * -27473)
557 y1in
+= 2*i_pitch
- i_visible_pitch
;
558 y1out
+= 2*i_pitch
- i_visible_pitch
;
559 uin
+= i_uv_pitch
- i_uv_visible_pitch
;
560 uout
+= i_uv_pitch
- i_uv_visible_pitch
;
561 vin
+= i_uv_pitch
- i_uv_visible_pitch
;
562 vout
+= i_uv_pitch
- i_uv_visible_pitch
;
566 static void get_blue_from_yuv420( picture_t
*p_inpic
, picture_t
*p_outpic
,
567 int yp
, int up
, int vp
)
569 uint8_t *y1in
= p_inpic
->p
[yp
].p_pixels
;
571 uint8_t *uin
= p_inpic
->p
[up
].p_pixels
;
573 uint8_t *y1out
= p_outpic
->p
[yp
].p_pixels
;
575 uint8_t *uout
= p_outpic
->p
[up
].p_pixels
;
576 uint8_t *vout
= p_outpic
->p
[vp
].p_pixels
;
578 const int i_pitch
= p_inpic
->p
[yp
].i_pitch
;
579 const int i_visible_pitch
= p_inpic
->p
[yp
].i_visible_pitch
;
580 const int i_visible_lines
= p_inpic
->p
[yp
].i_visible_lines
;
582 const int i_uv_pitch
= p_inpic
->p
[up
].i_pitch
;
583 const int i_uv_visible_pitch
= p_inpic
->p
[up
].i_visible_pitch
;
585 const uint8_t *yend
= y1in
+ i_visible_lines
* i_pitch
;
588 const uint8_t *y1end
= y1in
+ i_visible_pitch
;
589 y2in
= y1in
+ i_pitch
;
590 y2out
= y1out
+ i_pitch
;
591 while( y1in
< y1end
)
598 *uout
++ = crop( (*y1in
* 32768 + (*uin
- U
) * 58065 )
600 *vout
++ = crop( (*y1in
* -5329 + (*uin
- U
) * -9443 )
602 *y1out
++ = crop( (*y1in
++ * 7471 + (*uin
- U
) * 13239 )
604 *y1out
++ = crop( (*y1in
++ * 7471 + (*uin
- U
) * 13239 )
606 *y2out
++ = crop( (*y2in
++ * 7471 + (*uin
- U
) * 13239 )
608 *y2out
++ = crop( (*y2in
++ * 7471 + (*uin
++ - U
) * 13239 )
611 y1in
+= 2*i_pitch
- i_visible_pitch
;
612 y1out
+= 2*i_pitch
- i_visible_pitch
;
613 uin
+= i_uv_pitch
- i_uv_visible_pitch
;
614 uout
+= i_uv_pitch
- i_uv_visible_pitch
;
615 vout
+= i_uv_pitch
- i_uv_visible_pitch
;
619 static void get_red_from_yuv422( picture_t
*p_inpic
, picture_t
*p_outpic
,
620 int yp
, int up
, int vp
)
622 uint8_t *y1in
= p_inpic
->p
[yp
].p_pixels
;
623 uint8_t *vin
= p_inpic
->p
[vp
].p_pixels
;
625 uint8_t *y1out
= p_outpic
->p
[yp
].p_pixels
;
626 uint8_t *uout
= p_outpic
->p
[up
].p_pixels
;
627 uint8_t *vout
= p_outpic
->p
[vp
].p_pixels
;
629 const int i_pitch
= p_inpic
->p
[yp
].i_pitch
;
630 const int i_visible_pitch
= p_inpic
->p
[yp
].i_visible_pitch
;
631 const int i_visible_lines
= p_inpic
->p
[yp
].i_visible_lines
;
633 const int i_uv_pitch
= p_inpic
->p
[up
].i_pitch
;
634 const int i_uv_visible_pitch
= p_inpic
->p
[up
].i_visible_pitch
;
636 const uint8_t *yend
= y1in
+ i_visible_lines
* i_pitch
;
639 const uint8_t *y1end
= y1in
+ i_visible_pitch
;
640 while( y1in
< y1end
)
647 *uout
++ = crop( (*y1in
* -11058 + (*vin
- V
) * -15504)
649 *vout
++ = crop( (*y1in
* 32768 + (*vin
- V
) * 45941)
651 *y1out
++ = crop( (*y1in
++ * 19595 + (*vin
- V
) * 27473)
653 *y1out
++ = crop( (*y1in
++ * 19595 + (*vin
++ - V
) * 27473)
656 y1in
+= i_pitch
- i_visible_pitch
;
657 y1out
+= i_pitch
- i_visible_pitch
;
658 uout
+= i_uv_pitch
- i_uv_visible_pitch
;
659 vin
+= i_uv_pitch
- i_uv_visible_pitch
;
660 vout
+= i_uv_pitch
- i_uv_visible_pitch
;
664 static void get_green_from_yuv422( picture_t
*p_inpic
, picture_t
*p_outpic
,
665 int yp
, int up
, int vp
)
667 uint8_t *y1in
= p_inpic
->p
[yp
].p_pixels
;
668 uint8_t *uin
= p_inpic
->p
[up
].p_pixels
;
669 uint8_t *vin
= p_inpic
->p
[vp
].p_pixels
;
671 uint8_t *y1out
= p_outpic
->p
[yp
].p_pixels
;
672 uint8_t *uout
= p_outpic
->p
[up
].p_pixels
;
673 uint8_t *vout
= p_outpic
->p
[vp
].p_pixels
;
675 const int i_pitch
= p_inpic
->p
[yp
].i_pitch
;
676 const int i_visible_pitch
= p_inpic
->p
[yp
].i_visible_pitch
;
677 const int i_visible_lines
= p_inpic
->p
[yp
].i_visible_lines
;
679 const int i_uv_pitch
= p_inpic
->p
[up
].i_pitch
;
680 const int i_uv_visible_pitch
= p_inpic
->p
[up
].i_visible_pitch
;
682 const uint8_t *yend
= y1in
+ i_visible_lines
* i_pitch
;
685 const uint8_t *y1end
= y1in
+ i_visible_pitch
;
686 while( y1in
< y1end
)
693 *uout
++ = crop( (*y1in
* -21710 + (*uin
-U
) * 7471 + (*vin
-V
) * 15504)
695 *vout
++ = crop( (*y1in
* -27439 + (*uin
-U
) * 9443 + (*vin
-V
) * 19595)
697 *y1out
++ = crop( (*y1in
++ * 38470 + (*uin
-U
) * -13239 + (*vin
-V
) * -27473)
699 *y1out
++ = crop( (*y1in
++ * 38470 + (*uin
++-U
) * -13239 + (*vin
++-V
) * -27473)
702 y1in
+= i_pitch
- i_visible_pitch
;
703 y1out
+= i_pitch
- i_visible_pitch
;
704 uin
+= i_uv_pitch
- i_uv_visible_pitch
;
705 uout
+= i_uv_pitch
- i_uv_visible_pitch
;
706 vin
+= i_uv_pitch
- i_uv_visible_pitch
;
707 vout
+= i_uv_pitch
- i_uv_visible_pitch
;
711 static void get_blue_from_yuv422( picture_t
*p_inpic
, picture_t
*p_outpic
,
712 int yp
, int up
, int vp
)
714 uint8_t *y1in
= p_inpic
->p
[yp
].p_pixels
;
715 uint8_t *uin
= p_inpic
->p
[up
].p_pixels
;
717 uint8_t *y1out
= p_outpic
->p
[yp
].p_pixels
;
718 uint8_t *uout
= p_outpic
->p
[up
].p_pixels
;
719 uint8_t *vout
= p_outpic
->p
[vp
].p_pixels
;
721 const int i_pitch
= p_inpic
->p
[yp
].i_pitch
;
722 const int i_visible_pitch
= p_inpic
->p
[yp
].i_visible_pitch
;
723 const int i_visible_lines
= p_inpic
->p
[yp
].i_visible_lines
;
725 const int i_uv_pitch
= p_inpic
->p
[up
].i_pitch
;
726 const int i_uv_visible_pitch
= p_inpic
->p
[up
].i_visible_pitch
;
728 const uint8_t *yend
= y1in
+ i_visible_lines
* i_pitch
;
731 const uint8_t *y1end
= y1in
+ i_visible_pitch
;
732 while( y1in
< y1end
)
739 *uout
++ = crop( (*y1in
* 32768 + (*uin
- U
) * 58065 )
741 *vout
++ = crop( (*y1in
* -5329 + (*uin
- U
) * -9443 )
743 *y1out
++ = crop( (*y1in
++ * 7471 + (*uin
- U
) * 13239 )
745 *y1out
++ = crop( (*y1in
++ * 7471 + (*uin
++ - U
) * 13239 )
748 y1in
+= i_pitch
- i_visible_pitch
;
749 y1out
+= i_pitch
- i_visible_pitch
;
750 uin
+= i_uv_pitch
- i_uv_visible_pitch
;
751 uout
+= i_uv_pitch
- i_uv_visible_pitch
;
752 vout
+= i_uv_pitch
- i_uv_visible_pitch
;
756 static int ExtractCallback( vlc_object_t
*p_this
, char const *psz_var
,
757 vlc_value_t oldval
, vlc_value_t newval
,
761 filter_sys_t
*p_sys
= (filter_sys_t
*)p_data
;
763 if( !strcmp( psz_var
, FILTER_PREFIX
"component" ) )
765 p_sys
->i_color
= newval
.i_int
;
766 /* Matrix won't be used for RED, GREEN or BLUE in planar formats */
767 make_projection_matrix( (filter_t
*)p_this
, p_sys
->i_color
,
768 p_sys
->projection_matrix
);
772 msg_Warn( p_this
, "Unknown callback command." );