From b3ff9c030fbf36ab89b925f065c530c1e309a996 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 31 Oct 2014 11:07:06 +0100 Subject: [PATCH] video-converter: align offsets to subsampling Only apply an offset that is a multiple of the subsampling. To handle arbitrary offsets in the future, we need to be able to chroma-resample part of the borders. --- gst-libs/gst/video/video-converter.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gst-libs/gst/video/video-converter.c b/gst-libs/gst/video/video-converter.c index 9099cabd57..d94b98cbc9 100644 --- a/gst-libs/gst/video/video-converter.c +++ b/gst-libs/gst/video/video-converter.c @@ -437,6 +437,7 @@ gst_video_converter_new (GstVideoInfo * in_info, GstVideoInfo * out_info, gint width; GstLineCacheNeedLineFunc need_line; gint s2, s3; + const GstVideoFormatInfo *fin, *fout; g_return_val_if_fail (in_info != NULL, NULL); g_return_val_if_fail (out_info != NULL, NULL); @@ -449,6 +450,9 @@ gst_video_converter_new (GstVideoInfo * in_info, GstVideoInfo * out_info, convert = g_slice_new0 (GstVideoConverter); + fin = in_info->finfo; + fout = out_info->finfo; + convert->in_info = *in_info; convert->out_info = *out_info; @@ -470,6 +474,9 @@ gst_video_converter_new (GstVideoInfo * in_info, GstVideoInfo * out_info, convert->in_height = get_opt_int (convert, GST_VIDEO_CONVERTER_OPT_SRC_HEIGHT, convert->in_maxheight); + convert->in_x &= ~((1 << fin->w_sub[1]) - 1); + convert->in_y &= ~((1 << fin->h_sub[1]) - 1); + convert->out_x = get_opt_int (convert, GST_VIDEO_CONVERTER_OPT_DEST_X, 0); convert->out_y = get_opt_int (convert, GST_VIDEO_CONVERTER_OPT_DEST_Y, 0); convert->out_width = get_opt_int (convert, @@ -477,6 +484,9 @@ gst_video_converter_new (GstVideoInfo * in_info, GstVideoInfo * out_info, convert->out_height = get_opt_int (convert, GST_VIDEO_CONVERTER_OPT_DEST_HEIGHT, convert->out_maxheight); + convert->out_x &= ~((1 << fout->w_sub[1]) - 1); + convert->out_y &= ~((1 << fout->h_sub[1]) - 1); + convert->fill_border = get_opt_bool (convert, GST_VIDEO_CONVERTER_OPT_FILL_BORDER, TRUE); convert->border_argb = get_opt_uint (convert,