videoscale: add more scaling filters

Adjust the filter parameters so that they use the same number of taps
and method as the old ones.
Add some new filters
This commit is contained in:
Wim Taymans 2014-11-25 11:28:42 +01:00
parent b1eb3b7d81
commit 724b83c5f5
2 changed files with 76 additions and 13 deletions

View file

@ -130,9 +130,15 @@ gst_video_scale_method_get_type (void)
static const GEnumValue video_scale_methods[] = {
{GST_VIDEO_SCALE_NEAREST, "Nearest Neighbour", "nearest-neighbour"},
{GST_VIDEO_SCALE_BILINEAR, "Bilinear", "bilinear"},
{GST_VIDEO_SCALE_4TAP, "4-tap", "4-tap"},
{GST_VIDEO_SCALE_LANCZOS, "Lanczos (experimental/unstable)", "lanczos"},
{GST_VIDEO_SCALE_BILINEAR, "Bilinear (2-tap)", "bilinear"},
{GST_VIDEO_SCALE_4TAP, "4-tap Sinc", "4-tap-sinc"},
{GST_VIDEO_SCALE_LANCZOS, "Lanczos", "lanczos"},
{GST_VIDEO_SCALE_BILINEAR2, "Bilinear (multi-tap)", "bilinear2"},
{GST_VIDEO_SCALE_SINC, "Sinc (multi-tap)", "sinc"},
{GST_VIDEO_SCALE_HERMITE, "Hermite (multi-tap)", "hermite"},
{GST_VIDEO_SCALE_SPLINE, "Spline (multi-tap)", "spline"},
{GST_VIDEO_SCALE_CATROM, "Catmull-Rom (multi-tap)", "catrom"},
{GST_VIDEO_SCALE_MITCHELL, "Mitchell (multi-tap)", "mitchell"},
{0, NULL, NULL},
};
@ -509,26 +515,69 @@ gst_video_scale_set_info (GstVideoFilter * filter, GstCaps * in,
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_LINEAR,
NULL);
GST_VIDEO_RESAMPLER_OPT_MAX_TAPS, G_TYPE_INT, 2, NULL);
break;
case GST_VIDEO_SCALE_4TAP:
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_CUBIC,
NULL);
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_SINC,
GST_VIDEO_RESAMPLER_OPT_MAX_TAPS, G_TYPE_INT, 4, NULL);
break;
case GST_VIDEO_SCALE_LANCZOS:
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_LANCZOS,
GST_VIDEO_RESAMPLER_OPT_ENVELOPE, G_TYPE_DOUBLE,
videoscale->envelope, GST_VIDEO_RESAMPLER_OPT_SHARPNESS,
G_TYPE_DOUBLE, videoscale->sharpness,
GST_VIDEO_RESAMPLER_OPT_SHARPEN, G_TYPE_DOUBLE, videoscale->sharpen,
NULL);
break;
case GST_VIDEO_SCALE_BILINEAR2:
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_LINEAR,
NULL);
break;
case GST_VIDEO_SCALE_SINC:
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_SINC,
NULL);
break;
case GST_VIDEO_SCALE_HERMITE:
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_CUBIC,
GST_VIDEO_RESAMPLER_OPT_CUBIC_B, G_TYPE_DOUBLE, (gdouble) 0.0,
GST_VIDEO_RESAMPLER_OPT_CUBIC_C, G_TYPE_DOUBLE, (gdouble) 0.0,
NULL);
break;
case GST_VIDEO_SCALE_SPLINE:
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_CUBIC,
GST_VIDEO_RESAMPLER_OPT_CUBIC_B, G_TYPE_DOUBLE, (gdouble) 1.0,
GST_VIDEO_RESAMPLER_OPT_CUBIC_C, G_TYPE_DOUBLE, (gdouble) 0.0,
NULL);
break;
case GST_VIDEO_SCALE_CATROM:
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_CUBIC,
GST_VIDEO_RESAMPLER_OPT_CUBIC_B, G_TYPE_DOUBLE, (gdouble) 0.0,
GST_VIDEO_RESAMPLER_OPT_CUBIC_C, G_TYPE_DOUBLE, (gdouble) 0.5,
NULL);
break;
case GST_VIDEO_SCALE_MITCHELL:
gst_structure_set (options,
GST_VIDEO_CONVERTER_OPT_RESAMPLER_METHOD,
GST_TYPE_VIDEO_RESAMPLER_METHOD, GST_VIDEO_RESAMPLER_METHOD_CUBIC,
GST_VIDEO_RESAMPLER_OPT_CUBIC_B, G_TYPE_DOUBLE, (gdouble) 1.0 / 3.0,
GST_VIDEO_RESAMPLER_OPT_CUBIC_C, G_TYPE_DOUBLE, (gdouble) 1.0 / 3.0,
NULL);
break;
}
gst_structure_set (options,
GST_VIDEO_RESAMPLER_OPT_ENVELOPE, G_TYPE_DOUBLE, videoscale->envelope,
GST_VIDEO_RESAMPLER_OPT_SHARPNESS, G_TYPE_DOUBLE, videoscale->sharpness,
GST_VIDEO_RESAMPLER_OPT_SHARPEN, G_TYPE_DOUBLE, videoscale->sharpen,
GST_VIDEO_CONVERTER_OPT_DEST_X, G_TYPE_INT, videoscale->borders_w / 2,
GST_VIDEO_CONVERTER_OPT_DEST_Y, G_TYPE_INT, videoscale->borders_h / 2,
GST_VIDEO_CONVERTER_OPT_DEST_WIDTH, G_TYPE_INT,

View file

@ -45,17 +45,31 @@ GST_DEBUG_CATEGORY_EXTERN (video_scale_debug);
/**
* GstVideoScaleMethod:
* @GST_VIDEO_SCALE_NEAREST: use nearest neighbour scaling (fast and ugly)
* @GST_VIDEO_SCALE_BILINEAR: use bilinear scaling (slower but prettier).
* @GST_VIDEO_SCALE_4TAP: use a 4-tap filter for scaling (slow).
* @GST_VIDEO_SCALE_BILINEAR: use 2-tap bilinear scaling (slower but prettier).
* @GST_VIDEO_SCALE_4TAP: use a 4-tap sinc filter for scaling (slow).
* @GST_VIDEO_SCALE_LANCZOS: use a multitap Lanczos filter for scaling (slow).
*
* @GST_VIDEO_SCALE_BILINEAR2: use a multitap bilinear filter
* @GST_VIDEO_SCALE_SINC: use a multitap sinc filter
* @GST_VIDEO_SCALE_HERMITE: use a multitap bicubic Hermite filter
* @GST_VIDEO_SCALE_SPLINE: use a multitap bicubic spline filter
* @GST_VIDEO_SCALE_CATROM: use a multitap bicubic Catmull-Rom filter
* @GST_VIDEO_SCALE_MITCHELL: use a multitap bicubic Mitchell filter
*
* The videoscale method to use.
*/
typedef enum {
GST_VIDEO_SCALE_NEAREST,
GST_VIDEO_SCALE_BILINEAR,
GST_VIDEO_SCALE_4TAP,
GST_VIDEO_SCALE_LANCZOS
GST_VIDEO_SCALE_LANCZOS,
GST_VIDEO_SCALE_BILINEAR2,
GST_VIDEO_SCALE_SINC,
GST_VIDEO_SCALE_HERMITE,
GST_VIDEO_SCALE_SPLINE,
GST_VIDEO_SCALE_CATROM,
GST_VIDEO_SCALE_MITCHELL
} GstVideoScaleMethod;
typedef struct _GstVideoScale GstVideoScale;