video-converter: activate scaler fastpath depending on method

Only activate the scaler fastpath for x2 up and downscale when the
scaler method is respectively nearest and linear because that is what
those fastpaths really implement.
This commit is contained in:
Wim Taymans 2015-02-25 16:15:52 +01:00
parent 9e8799924b
commit 3046935e03

View File

@ -3948,6 +3948,7 @@ setup_scale (GstVideoConverter * convert)
gint comp, n_comp, j, iw, ih, ow, oh, pstride; gint comp, n_comp, j, iw, ih, ow, oh, pstride;
gboolean need_v_scaler, need_h_scaler; gboolean need_v_scaler, need_h_scaler;
GstStructure *config; GstStructure *config;
gint resample_method;
n_comp = GST_VIDEO_FORMAT_INFO_N_COMPONENTS (in_finfo); n_comp = GST_VIDEO_FORMAT_INFO_N_COMPONENTS (in_finfo);
@ -4016,16 +4017,20 @@ setup_scale (GstVideoConverter * convert)
config = gst_structure_copy (convert->config); config = gst_structure_copy (convert->config);
resample_method = (i == 0 ? method : cr_method);
need_v_scaler = FALSE; need_v_scaler = FALSE;
need_h_scaler = FALSE; need_h_scaler = FALSE;
if (iw == ow) { if (iw == ow) {
if (ih == oh) { if (ih == oh) {
convert->fconvert[i] = convert_plane_copy; convert->fconvert[i] = convert_plane_copy;
GST_DEBUG ("plane %d: copy", i); GST_DEBUG ("plane %d: copy", i);
} else if (ih == 2 * oh && pstride == 1) { } else if (ih == 2 * oh && pstride == 1
&& resample_method == GST_VIDEO_RESAMPLER_METHOD_LINEAR) {
convert->fconvert[i] = convert_plane_v_halve; convert->fconvert[i] = convert_plane_v_halve;
GST_DEBUG ("plane %d: vertical halve", i); GST_DEBUG ("plane %d: vertical halve", i);
} else if (2 * ih == oh && pstride == 1) { } else if (2 * ih == oh && pstride == 1
&& resample_method == GST_VIDEO_RESAMPLER_METHOD_NEAREST) {
convert->fconvert[i] = convert_plane_v_double; convert->fconvert[i] = convert_plane_v_double;
GST_DEBUG ("plane %d: vertical double", i); GST_DEBUG ("plane %d: vertical double", i);
} else { } else {
@ -4034,10 +4039,12 @@ setup_scale (GstVideoConverter * convert)
need_v_scaler = TRUE; need_v_scaler = TRUE;
} }
} else if (ih == oh) { } else if (ih == oh) {
if (iw == 2 * ow && pstride == 1) { if (iw == 2 * ow && pstride == 1
&& resample_method == GST_VIDEO_RESAMPLER_METHOD_LINEAR) {
convert->fconvert[i] = convert_plane_h_halve; convert->fconvert[i] = convert_plane_h_halve;
GST_DEBUG ("plane %d: horizontal halve", i); GST_DEBUG ("plane %d: horizontal halve", i);
} else if (2 * iw == ow && pstride == 1) { } else if (2 * iw == ow && pstride == 1
&& resample_method == GST_VIDEO_RESAMPLER_METHOD_NEAREST) {
convert->fconvert[i] = convert_plane_h_double; convert->fconvert[i] = convert_plane_h_double;
GST_DEBUG ("plane %d: horizontal double", i); GST_DEBUG ("plane %d: horizontal double", i);
} else { } else {
@ -4046,10 +4053,12 @@ setup_scale (GstVideoConverter * convert)
need_h_scaler = TRUE; need_h_scaler = TRUE;
} }
} else { } else {
if (iw == 2 * ow && ih == 2 * oh && pstride == 1) { if (iw == 2 * ow && ih == 2 * oh && pstride == 1
&& resample_method == GST_VIDEO_RESAMPLER_METHOD_LINEAR) {
convert->fconvert[i] = convert_plane_hv_halve; convert->fconvert[i] = convert_plane_hv_halve;
GST_DEBUG ("plane %d: horizontal/vertical halve", i); GST_DEBUG ("plane %d: horizontal/vertical halve", i);
} else if (2 * iw == ow && 2 * ih == oh && pstride == 1) { } else if (2 * iw == ow && 2 * ih == oh && pstride == 1
&& resample_method == GST_VIDEO_RESAMPLER_METHOD_NEAREST) {
convert->fconvert[i] = convert_plane_hv_double; convert->fconvert[i] = convert_plane_hv_double;
GST_DEBUG ("plane %d: horizontal/vertical double", i); GST_DEBUG ("plane %d: horizontal/vertical double", i);
} else { } else {
@ -4061,15 +4070,13 @@ setup_scale (GstVideoConverter * convert)
} }
if (need_h_scaler) { if (need_h_scaler) {
convert->fh_scaler[i] = convert->fh_scaler[i] = gst_video_scaler_new (resample_method,
gst_video_scaler_new (i == 0 ? method : cr_method,
GST_VIDEO_SCALER_FLAG_NONE, taps, iw, ow, config); GST_VIDEO_SCALER_FLAG_NONE, taps, iw, ow, config);
} else } else
convert->fh_scaler[i] = NULL; convert->fh_scaler[i] = NULL;
if (need_v_scaler) { if (need_v_scaler) {
convert->fv_scaler[i] = convert->fv_scaler[i] = gst_video_scaler_new (resample_method,
gst_video_scaler_new (i == 0 ? method : cr_method,
GST_VIDEO_SCALER_FLAG_NONE, taps, ih, oh, config); GST_VIDEO_SCALER_FLAG_NONE, taps, ih, oh, config);
gst_video_scaler_get_coeff (convert->fv_scaler[i], 0, NULL, &n_taps); gst_video_scaler_get_coeff (convert->fv_scaler[i], 0, NULL, &n_taps);
} else } else