diff --git a/gst/videoscale/gstvideoscale.c b/gst/videoscale/gstvideoscale.c index b0a6982f49..5a41e2d047 100644 --- a/gst/videoscale/gstvideoscale.c +++ b/gst/videoscale/gstvideoscale.c @@ -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, diff --git a/gst/videoscale/gstvideoscale.h b/gst/videoscale/gstvideoscale.h index 5e5d8ee230..c15cd809ad 100644 --- a/gst/videoscale/gstvideoscale.h +++ b/gst/videoscale/gstvideoscale.h @@ -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;