diff options
author | Jan Schmidt <jan@centricular.com> | 2018-02-23 19:36:42 +1100 |
---|---|---|
committer | Jan Schmidt <jan@centricular.com> | 2018-02-23 20:28:01 +1100 |
commit | 0d92a123b9b31ad3c97bca94622d0535e6a8c672 (patch) | |
tree | fecb6da97ad0062a6d30e4bb83392e4dfa3c9d07 | |
parent | 2cb14577be46032682cdfb6c150da2a1589c6f05 (diff) | |
download | gstreamer-plugins-bad-0d92a123b9b31ad3c97bca94622d0535e6a8c672.tar.gz |
glimagesink: Correct PAR in output caps when transforming
When doing a 3D/multiview transformation and rescaling to
match the output window size, the resulting PAR may
not match the input any more and needs recalculating,
or else the GstSample reported to client-draw has the
wrong PAR.
-rw-r--r-- | ext/gl/gstglimagesink.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c index f6a61ac92..5ea5f00d8 100644 --- a/ext/gl/gstglimagesink.c +++ b/ext/gl/gstglimagesink.c @@ -1420,13 +1420,35 @@ update_output_format (GstGLImageSink * glimage_sink) ret = configure_display_from_info (glimage_sink, out_info); if (glimage_sink->convert_views) { + gint new_w, new_h; + gint par_n, par_d; + /* Match actual output window size for pixel-aligned output, * even though we can't necessarily match the starting left/right - * view parity properly */ - glimage_sink->out_info.width = MAX (1, glimage_sink->display_rect.w); - glimage_sink->out_info.height = MAX (1, glimage_sink->display_rect.h); - GST_LOG_OBJECT (glimage_sink, "Set 3D output scale to %d,%d", - glimage_sink->display_rect.w, glimage_sink->display_rect.h); + * view parity properly for line-by-line modes, because that + * depends on the window being placed correctly. + * FIXME: Should this rescaling be configurable? */ + new_w = MAX (1, glimage_sink->display_rect.w); + new_h = MAX (1, glimage_sink->display_rect.h); + if (new_w != out_info->width || new_h != out_info->height) { + /* Recalculate PAR if rescaling */ + gint from_dar_n, from_dar_d; + if (!gst_util_fraction_multiply (out_info->width, out_info->height, + out_info->par_n, out_info->par_d, &from_dar_n, + &from_dar_d) || + !gst_util_fraction_multiply (from_dar_n, from_dar_d, new_h, new_w, + &par_n, &par_d)) { + par_n = glimage_sink->par_n; + par_d = glimage_sink->par_d; + } + out_info->par_n = par_n; + out_info->par_d = par_d; + out_info->width = new_w; + out_info->height = new_h; + } + + GST_LOG_OBJECT (glimage_sink, "Set 3D output scale to %d,%d PAR %d/%d", + out_info->width, out_info->height, out_info->par_n, out_info->par_d); } s = gst_caps_get_structure (glimage_sink->in_caps, 0); |