[vlc-devel] [PATCH 5/9] Make transform filter work with chains where format change is not allowed.

Matthias Keiser matthias at tristan-inc.com
Wed Mar 5 22:24:11 CET 2014


Am 05.03.2014 um 18:23 schrieb Rémi Denis-Courmont <remi at remlab.net>:

> Le mercredi 5 mars 2014, 17:01:26 Matthias Keiser a écrit :
>> ---
>> modules/video_filter/transform.c | 67
>> +++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+),
>> 29 deletions(-)
>> 
>> diff --git a/modules/video_filter/transform.c
>> b/modules/video_filter/transform.c index 60fdaa1..c249521 100644
>> --- a/modules/video_filter/transform.c
>> +++ b/modules/video_filter/transform.c
>> @@ -229,6 +229,7 @@ typedef struct {
>>     char      name[16];
>>     convert_t convert;
>>     convert_t iconvert;
>> +    video_transform_t operation;
>>     void      (*plane8) (plane_t *dst, const plane_t *src);
>>     void      (*plane16)(plane_t *dst, const plane_t *src);
>>     void      (*plane32)(plane_t *dst, const plane_t *src);
>> @@ -236,18 +237,18 @@ typedef struct {
>>     void      (*yuyv)(plane_t *dst, const plane_t *src);
>> } transform_description_t;
>> 
>> -#define DESC(str, f, invf) \
>> -    { str, f, invf, Plane8_##f, Plane16_##f, Plane32_##f, \
>> +#define DESC(str, f, invf, op) \
>> +    { str, f, invf, op, Plane8_##f, Plane16_##f, Plane32_##f, \
>>       Plane422_##f, PlaneYUY2_##f }
>> 
>> static const transform_description_t descriptions[] = {
>> -    DESC("90",            R90,           R270),
>> -    DESC("180",           R180,          R180),
>> -    DESC("270",           R270,          R90),
>> -    DESC("hflip",         HFlip,         HFlip),
>> -    DESC("vflip",         VFlip,         VFlip),
>> -    DESC("transpose",     Transpose,     Transpose),
>> -    DESC("antitranspose", AntiTranspose, AntiTranspose),
>> +    DESC("90",            R90,           R270,          TRANSFORM_R90),
>> +    DESC("180",           R180,          R180,          TRANSFORM_R180),
>> +    DESC("270",           R270,          R90,           TRANSFORM_R270),
>> +    DESC("hflip",         HFlip,         HFlip,         TRANSFORM_HFLIP),
>> +    DESC("vflip",         VFlip,         VFlip,         TRANSFORM_VFLIP),
>> +    DESC("transpose",     Transpose,     Transpose,    
>> TRANSFORM_TRANSPOSE), +    DESC("antitranspose", AntiTranspose,
>> AntiTranspose, TRANSFORM_ANTI_TRANSPOSE), };
>> 
>> static bool dsc_is_rotated(const transform_description_t *dsc)
>> @@ -373,19 +374,38 @@ static int Open(vlc_object_t *object)
>>                     }
>>             }
>>         }
>> +    }
>> +
>> +    /*
>> +     * Note: we neither compare nor set dst->orientation,
>> +     * the caller needs to do it manually (user might want
>> +     * to transform video without changing the orientation).
>> +     */
> 
> Yeah... I am not sure if we can rely on b_allow_fmt_out_change for this. Did 
> you check?

I know of 2 situations where the transform filter kicks in:

1) transformed movies (this patch)
2) user manually sets the filter in the preferences

Both work for me. Is there anything else to check?

> To support hardware accelerated decoding, I think we will need to split the 
> transform plugin in two distinct plugins:
> - one video conversion plugin for the actual CPU conversion with non-zero 
> priority, comparing the orientation of in and out formats, and
> - one dummy transform filter that just overrides the orientation of its output 
> format based on the user settings.
> 
> That way, hardware surfaces can have their own back-end for the rotation in 
> hardware. This can be done implemented separately later though.

>> +
>> +    video_format_t src_trans = *src;
>> +    video_format_TransformBy(&src_trans, dsc->operation);
>> +
>> +    if (!filter->b_allow_fmt_out_change &&
>> +        (dst->i_width          != src_trans.i_width ||
>> +         dst->i_visible_width  != src_trans.i_visible_width ||
>> +         dst->i_height         != src_trans.i_height ||
>> +         dst->i_visible_height != src_trans.i_visible_height ||
>> +         dst->i_sar_num        != src_trans.i_sar_num ||
>> +         dst->i_sar_den        != src_trans.i_sar_den ||
>> +         dst->i_x_offset       != src_trans.i_x_offset ||
>> +         dst->i_y_offset       != src_trans.i_y_offset)) {
>> 
>> -        if (!filter->b_allow_fmt_out_change) {
>>             msg_Err(filter, "Format change is not allowed");
>>             goto error;
>>         }
>> -
>> -        dst->i_width          = src->i_height;
>> -        dst->i_visible_width  = src->i_visible_height;
>> -        dst->i_height         = src->i_width;
>> -        dst->i_visible_height = src->i_visible_width;
>> -        dst->i_sar_num        = src->i_sar_den;
>> -        dst->i_sar_den        = src->i_sar_num;
>> -    }
>> +    dst->i_width          = src_trans.i_width;
>> +    dst->i_visible_width  = src_trans.i_visible_width;
>> +    dst->i_height         = src_trans.i_height;
>> +    dst->i_visible_height = src_trans.i_visible_height;
>> +    dst->i_sar_num        = src_trans.i_sar_num;
>> +    dst->i_sar_den        = src_trans.i_sar_den;
>> +    dst->i_x_offset       = src_trans.i_x_offset;
>> +    dst->i_y_offset       = src_trans.i_y_offset;
>> 
>>     /* Deal with weird packed formats */
>>     switch (src->i_chroma) {
>> @@ -406,17 +426,6 @@ static int Open(vlc_object_t *object)
>>             goto error;
>>     }
>> 
>> -    dst->i_x_offset       = INT_MAX;
>> -    dst->i_y_offset       = INT_MAX;
>> -    for (int i = 0; i < 2; i++) {
>> -        int tx, ty;
>> -        dsc->iconvert(&tx, &ty, src->i_width, src->i_height,
>> -                      src->i_x_offset + i * (src->i_visible_width  - 1),
>> -                      src->i_y_offset + i * (src->i_visible_height - 1));
>> -        dst->i_x_offset = __MIN(dst->i_x_offset, (unsigned)(1 + tx));
>> -        dst->i_y_offset = __MIN(dst->i_y_offset, (unsigned)(1 + ty));
>> -    }
>> -
>>     filter->p_sys           = sys;
>>     filter->pf_video_filter = Filter;
>>     filter->pf_video_mouse  = Mouse;
> 
> -- 
> Rémi Denis-Courmont
> http://www.remlab.net/
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel




More information about the vlc-devel mailing list