miniobject: free qdata array when the last qdata is removed

In cases with many long-lived buffers that have qdata only very
briefly, the memory overhead of keeping an array of 16 GstQData
structs for each buffer can be significant. We free the array when
the last qdata is removed, like it was done in 1.14.

Fixes #436
This commit is contained in:
David Svensson Fors 2019-09-03 10:38:13 +02:00
parent 80a76a4b4d
commit f8d70b475c

View file

@ -506,7 +506,12 @@ remove_notify (GstMiniObject * object, gint index)
/* remove item */ /* remove item */
priv_data->n_qdata--; priv_data->n_qdata--;
if (index != priv_data->n_qdata) { if (priv_data->n_qdata == 0) {
/* we don't shrink but free when everything is gone */
g_free (priv_data->qdata);
priv_data->qdata = NULL;
priv_data->n_qdata_len = 0;
} else if (index != priv_data->n_qdata) {
QDATA (priv_data, index) = QDATA (priv_data, priv_data->n_qdata); QDATA (priv_data, index) = QDATA (priv_data, priv_data->n_qdata);
} }
} }