static gboolean gst_video_rate_propose_allocation (GstBaseTransform * trans, GstQuery * decide_query, GstQuery * query) { GstBaseTransformClass *klass = GST_BASE_TRANSFORM_CLASS (parent_class); gboolean res; /* We should always be passthrough */ g_return_val_if_fail (decide_query == NULL, FALSE); res = klass->propose_allocation (trans, NULL, query); if (res) { guint i = 0; guint n_allocation; guint down_min = 0; n_allocation = gst_query_get_n_allocation_pools (query); while (i < n_allocation) { GstBufferPool *pool = NULL; guint size, min, max; gst_query_parse_nth_allocation_pool (query, i, &pool, &size, &min, &max); if (min == max) { if (pool) gst_object_unref (pool); gst_query_remove_nth_allocation_pool (query, i); n_allocation--; down_min = MAX (min, down_min); continue; } gst_query_set_nth_allocation_pool (query, i, pool, size, min + 1, max); if (pool) gst_object_unref (pool); i++; } if (n_allocation == 0) { GstCaps *caps; GstVideoInfo info; gst_query_parse_allocation (query, &caps, NULL); gst_video_info_from_caps (&info, caps); gst_query_add_allocation_pool (query, NULL, info.size, down_min + 1, 0); } } return res; }
static gboolean gst_rfb_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query) { GstBufferPool *pool = NULL; guint size, min = 1, max = 0; GstStructure *config; GstCaps *caps; GstVideoInfo info; gboolean ret; gst_query_parse_allocation (query, &caps, NULL); if (!caps || !gst_video_info_from_caps (&info, caps)) return FALSE; while (gst_query_get_n_allocation_pools (query) > 0) { gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); /* TODO We restrict to the exact size as we don't support strides or * special padding */ if (size == info.size) break; gst_query_remove_nth_allocation_pool (query, 0); gst_object_unref (pool); pool = NULL; } if (pool == NULL) { /* we did not get a pool, make one ourselves then */ pool = gst_video_buffer_pool_new (); size = info.size; min = 1; max = 0; gst_query_add_allocation_pool (query, pool, size, min, max); } config = gst_buffer_pool_get_config (pool); gst_buffer_pool_config_set_params (config, caps, size, min, max); ret = gst_buffer_pool_set_config (pool, config); gst_object_unref (pool); return ret; }