static void gst_value_fraction_get_extremes (const GValue * v, gint * min_num, gint * min_denom, gint * max_num, gint * max_denom) { if (GST_VALUE_HOLDS_FRACTION (v)) { *min_num = *max_num = gst_value_get_fraction_numerator (v); *min_denom = *max_denom = gst_value_get_fraction_denominator (v); } else if (GST_VALUE_HOLDS_FRACTION_RANGE (v)) { const GValue *min, *max; min = gst_value_get_fraction_range_min (v); *min_num = gst_value_get_fraction_numerator (min); *min_denom = gst_value_get_fraction_denominator (min); max = gst_value_get_fraction_range_max (v); *max_num = gst_value_get_fraction_numerator (max); *max_denom = gst_value_get_fraction_denominator (max); } else if (GST_VALUE_HOLDS_LIST (v)) { gint min_n = G_MAXINT, min_d = 1, max_n = 0, max_d = 1; int i, n; *min_num = G_MAXINT; *min_denom = 1; *max_num = 0; *max_denom = 1; n = gst_value_list_get_size (v); g_assert (n > 0); for (i = 0; i < n; i++) { const GValue *t = gst_value_list_get_value (v, i); gst_value_fraction_get_extremes (t, &min_n, &min_d, &max_n, &max_d); if (gst_util_fraction_compare (min_n, min_d, *min_num, *min_denom) < 0) { *min_num = min_n; *min_denom = min_d; } if (gst_util_fraction_compare (max_n, max_d, *max_num, *max_denom) > 0) { *max_num = max_n; *max_denom = max_d; } } } else { g_warning ("Unknown type for framerate"); *min_num = 0; *min_denom = 1; *max_num = G_MAXINT; *max_denom = 1; } }
static gboolean gst_mfxpostproc_update_src_caps (GstMfxPostproc * vpp, GstCaps * caps, gboolean * caps_changed_ptr) { GST_INFO_OBJECT (vpp, "new src caps = %" GST_PTR_FORMAT, caps); if (!video_info_update (caps, &vpp->srcpad_info, caps_changed_ptr)) return FALSE; if (GST_VIDEO_INFO_FORMAT (&vpp->sinkpad_info) != GST_VIDEO_INFO_FORMAT (&vpp->srcpad_info)) vpp->flags |= GST_MFX_POSTPROC_FLAG_FORMAT; if ((vpp->width || vpp->height) && vpp->width != GST_VIDEO_INFO_WIDTH (&vpp->sinkpad_info) && vpp->height != GST_VIDEO_INFO_HEIGHT (&vpp->sinkpad_info)) vpp->flags |= GST_MFX_POSTPROC_FLAG_SIZE; if (vpp->fps_n && gst_util_fraction_compare( GST_VIDEO_INFO_FPS_N (&vpp->srcpad_info), GST_VIDEO_INFO_FPS_D (&vpp->srcpad_info), GST_VIDEO_INFO_FPS_N (&vpp->sinkpad_info), GST_VIDEO_INFO_FPS_D (&vpp->sinkpad_info))) vpp->flags |= GST_MFX_POSTPROC_FLAG_FRC; return TRUE; }
/* Clamp the framerate in a caps structure to be a smaller range then * [1...max_rate], otherwise return false */ static gboolean gst_video_max_rate_clamp_structure (GstStructure * s, gint maxrate, gint * min_num, gint * min_denom, gint * max_num, gint * max_denom) { gboolean ret = FALSE; if (!gst_structure_has_field (s, "framerate")) { /* No framerate field implies any framerate, clamping would result in * [1..max_rate] so not a real subset */ goto out; } else { const GValue *v; GValue intersection = { 0, }; GValue clamp = { 0, }; gint tmp_num, tmp_denom; g_value_init (&clamp, GST_TYPE_FRACTION_RANGE); gst_value_set_fraction_range_full (&clamp, 0, 1, maxrate, 1); v = gst_structure_get_value (s, "framerate"); ret = gst_value_intersect (&intersection, v, &clamp); g_value_unset (&clamp); if (!ret) goto out; gst_value_fraction_get_extremes (&intersection, min_num, min_denom, max_num, max_denom); gst_value_fraction_get_extremes (v, &tmp_num, &tmp_denom, max_num, max_denom); if (gst_util_fraction_compare (*max_num, *max_denom, maxrate, 1) > 0) { *max_num = maxrate; *max_denom = 1; } gst_structure_take_value (s, "framerate", &intersection); } out: return ret; }