35
35
#include "vf.h"
36
36
#include "sub/dec_sub.h"
37
37
38
+ #include "libvo/csputils.h"
38
39
#include "libvo/fastmemcpy.h"
39
40
40
41
#include "m_option.h"
46
47
#define _g (c ) (((c)>>16)&0xFF)
47
48
#define _b (c ) (((c)>>8)&0xFF)
48
49
#define _a (c ) ((c)&0xFF)
49
- #define rgba2y ( c ) ( (( 263*_r(c) + 516*_g(c) + 100*_b(c) + 512) >> 10) + 16 )
50
- #define rgba2u ( c ) ( ((-152*_r(c) - 298*_g (c) + 450*_b (c) + 512) >> 10) + 128 )
51
- #define rgba2v ( c ) ( (( 450*_r(c) - 377*_g(c) - 73 *_b(c) + 512) >> 10) + 128 )
50
+ #define from_rgb ( c , m ) \
51
+ ( (int) ((m)[COL_R]*_r (c) + (m)[COL_G]*_g (c) + \
52
+ (m)[COL_B] *_b(c) + (m)[COL_C]*255 + 0.5f) )
52
53
53
54
54
55
static const struct vf_priv_s {
55
56
int outh , outw ;
56
57
57
58
unsigned int outfmt ;
59
+ struct mp_csp_details video_colorspace ;
58
60
59
61
// 1 = auto-added filter: insert only if chain does not support EOSD already
60
62
// 0 = insert always
@@ -300,11 +302,11 @@ static void copy_to_image(struct vf_instance *vf)
300
302
301
303
static void my_draw_bitmap (struct vf_instance * vf , unsigned char * bitmap ,
302
304
int bitmap_w , int bitmap_h , int stride ,
303
- int dst_x , int dst_y , unsigned color )
305
+ int dst_x , int dst_y , unsigned color , float rgb2yuv [ 3 ][ 4 ] )
304
306
{
305
- unsigned char y = rgba2y (color );
306
- unsigned char u = rgba2u (color );
307
- unsigned char v = rgba2v (color );
307
+ unsigned char y = from_rgb (color , rgb2yuv [ 0 ] );
308
+ unsigned char u = from_rgb (color , rgb2yuv [ 1 ] );
309
+ unsigned char v = from_rgb (color , rgb2yuv [ 2 ] );
308
310
unsigned char opacity = 255 - _a (color );
309
311
unsigned char * src , * dsty , * dstu , * dstv ;
310
312
int i , j ;
@@ -329,7 +331,7 @@ static void my_draw_bitmap(struct vf_instance *vf, unsigned char *bitmap,
329
331
}
330
332
331
333
static int render_frame (struct vf_instance * vf , mp_image_t * mpi ,
332
- const ASS_Image * img )
334
+ const ASS_Image * img , float rgb2yuv [ 3 ][ 4 ] )
333
335
{
334
336
if (img ) {
335
337
for (int i = 0 ; i < (vf -> priv -> outh + 1 ) / 2 ; i ++ )
@@ -340,7 +342,7 @@ static int render_frame(struct vf_instance *vf, mp_image_t *mpi,
340
342
copy_from_image (vf );
341
343
while (img ) {
342
344
my_draw_bitmap (vf , img -> bitmap , img -> w , img -> h , img -> stride ,
343
- img -> dst_x , img -> dst_y , img -> color );
345
+ img -> dst_x , img -> dst_y , img -> color , rgb2yuv );
344
346
img = img -> next ;
345
347
}
346
348
copy_to_image (vf );
@@ -354,6 +356,7 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
354
356
struct MPOpts * opts = vf -> opts ;
355
357
struct osd_state * osd = priv -> osd ;
356
358
ASS_Image * images = 0 ;
359
+ float rgb2yuv [3 ][4 ];
357
360
if (pts != MP_NOPTS_VALUE ) {
358
361
osd -> dim = (struct mp_eosd_res ){ .w = vf -> priv -> outw ,
359
362
.h = vf -> priv -> outh ,
@@ -366,10 +369,20 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
366
369
struct sub_bitmaps b ;
367
370
sub_get_bitmaps (osd , & b );
368
371
images = b .imgs ;
372
+ if (b .colorspace .format == MP_CSP_AUTO )
373
+ b .colorspace = vf -> priv -> video_colorspace ;
374
+ struct mp_csp_params csp_params = { .colorspace = b .colorspace ,
375
+ .brightness = 0 ,
376
+ .contrast = 1 ,
377
+ .hue = 0 ,
378
+ .saturation = 1 ,
379
+ .texture_bits = 8 ,
380
+ .input_bits = 8 };
381
+ mp_get_rgb2yuv_coeffs (& csp_params , rgb2yuv );
369
382
}
370
383
371
384
prepare_image (vf , mpi );
372
- render_frame (vf , mpi , images );
385
+ render_frame (vf , mpi , images , rgb2yuv );
373
386
374
387
return vf_next_put_image (vf , vf -> dmpi , pts );
375
388
}
@@ -391,6 +404,9 @@ static int control(vf_instance_t *vf, int request, void *data)
391
404
case VFCTRL_SET_OSD_OBJ :
392
405
vf -> priv -> osd = data ;
393
406
break ;
407
+ case VFCTRL_SET_YUV_COLORSPACE :
408
+ vf -> priv -> video_colorspace = * (struct mp_csp_details * )data ;
409
+ break ;
394
410
case VFCTRL_INIT_EOSD :
395
411
return CONTROL_TRUE ;
396
412
case VFCTRL_DRAW_EOSD :
0 commit comments