- /* Pick either height or width, whichever is an integer multiple of the
- * display aspect ratio. However, prefer preserving the height to account
- * for interlaced video. */
- if (pad_height % dar_n == 0) {
- pad_width = gst_util_uint64_scale_int (pad_height, dar_n, dar_d);
- } else if (pad_width % dar_d == 0) {
- pad_height = gst_util_uint64_scale_int (pad_width, dar_d, dar_n);
- } else {
- pad_width = gst_util_uint64_scale_int (pad_height, dar_n, dar_d);
+ switch (comp_pad->sizing_policy) {
+ case COMPOSITOR_SIZING_POLICY_NONE:
+ /* Pick either height or width, whichever is an integer multiple of the
+ * display aspect ratio. However, prefer preserving the height to account
+ * for interlaced video. */
+ if (pad_height % dar_n == 0) {
+ pad_width = gst_util_uint64_scale_int (pad_height, dar_n, dar_d);
+ } else if (pad_width % dar_d == 0) {
+ pad_height = gst_util_uint64_scale_int (pad_width, dar_d, dar_n);
+ } else {
+ pad_width = gst_util_uint64_scale_int (pad_height, dar_n, dar_d);
+ }
+ break;
+ case COMPOSITOR_SIZING_POLICY_KEEP_ASPECT_RATIO:
+ {
+ gint from_dar_n, from_dar_d, to_dar_n, to_dar_d, num, den;
+
+ /* Calculate DAR again with actual video size */
+ if (!gst_util_fraction_multiply (GST_VIDEO_INFO_WIDTH (&vagg_pad->info),
+ GST_VIDEO_INFO_HEIGHT (&vagg_pad->info),
+ GST_VIDEO_INFO_PAR_N (&vagg_pad->info),
+ GST_VIDEO_INFO_PAR_D (&vagg_pad->info), &from_dar_n,
+ &from_dar_d)) {
+ from_dar_n = from_dar_d = -1;
+ }
+
+ if (!gst_util_fraction_multiply (pad_width, pad_height,
+ out_par_n, out_par_d, &to_dar_n, &to_dar_d)) {
+ to_dar_n = to_dar_d = -1;
+ }
+
+ if (from_dar_n != to_dar_n || from_dar_d != to_dar_d) {
+ /* Calculate new output resolution */
+ if (from_dar_n != -1 && from_dar_d != -1
+ && gst_util_fraction_multiply (from_dar_n, from_dar_d,
+ out_par_d, out_par_n, &num, &den)) {
+ GstVideoRectangle src_rect, dst_rect, rst_rect;
+
+ src_rect.h = gst_util_uint64_scale_int (pad_width, den, num);
+ if (src_rect.h == 0) {
+ pad_width = 0;
+ pad_height = 0;
+ break;
+ }
+
+ src_rect.x = src_rect.y = 0;
+ src_rect.w = pad_width;
+
+ dst_rect.x = dst_rect.y = 0;
+ dst_rect.w = pad_width;
+ dst_rect.h = pad_height;
+
+ /* Scale rect to be centered in destination rect */
+ gst_video_center_rect (&src_rect, &dst_rect, &rst_rect, TRUE);
+
+ GST_LOG_OBJECT (comp_pad,
+ "Re-calculated size %dx%d -> %dx%d (x-offset %d, y-offset %d)",
+ pad_width, pad_height, rst_rect.w, rst_rect.h, rst_rect.x,
+ rst_rect.h);
+
+ *x_offset = rst_rect.x;
+ *y_offset = rst_rect.y;
+ pad_width = rst_rect.w;
+ pad_height = rst_rect.h;
+ } else {
+ GST_WARNING_OBJECT (comp_pad, "Failed to calculate output size");
+
+ *x_offset = 0;
+ *y_offset = 0;
+ pad_width = 0;
+ pad_height = 0;
+ }
+ }
+ break;
+ }