summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2021-06-25 23:42:34 +1000
committerTim-Philipp Müller <tim@centricular.com>2021-06-28 12:47:43 +0100
commita14c85fd75d853484a5f23055f18b6f1df6761c0 (patch)
tree588906ba9378c0a4d6f82ff31e320438ae7af391
parentb26b8ae6f860770b91f8553db6ecdc066c95cde6 (diff)
downloadgstreamer-plugins-base-a14c85fd75d853484a5f23055f18b6f1df6761c0.tar.gz
video-converter: Set up matrix tables only once.
When configuring a multi-thread converter, only allocate the shared colour conversion matrices once for the first thread, to avoid allocating multiple times and leaking memory. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1220>
-rw-r--r--gst-libs/gst/video/video-converter.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gst-libs/gst/video/video-converter.c b/gst-libs/gst/video/video-converter.c
index 985088cd4..9dda88ef7 100644
--- a/gst-libs/gst/video/video-converter.c
+++ b/gst-libs/gst/video/video-converter.c
@@ -1581,7 +1581,8 @@ chain_convert_to_RGB (GstVideoConverter * convert, GstLineCache * prev,
if (do_gamma) {
gint scale;
- if (!convert->unpack_rgb) {
+ /* Set up conversion matrices if needed, but only for the first thread */
+ if (idx == 0 && !convert->unpack_rgb) {
color_matrix_set_identity (&convert->to_RGB_matrix);
compute_matrix_to_RGB (convert, &convert->to_RGB_matrix);
@@ -1833,8 +1834,10 @@ chain_convert (GstVideoConverter * convert, GstLineCache * prev, gint idx)
convert->current_bits = MAX (convert->in_bits, convert->out_bits);
do_conversion = TRUE;
- if (!same_matrix || !same_primaries)
- prepare_matrix (convert, &convert->convert_matrix);
+ if (!same_matrix || !same_primaries) {
+ if (idx == 0)
+ prepare_matrix (convert, &convert->convert_matrix);
+ }
if (convert->in_bits == convert->out_bits)
pass_alloc = TRUE;
} else
@@ -1848,7 +1851,8 @@ chain_convert (GstVideoConverter * convert, GstLineCache * prev, gint idx)
if (same_primaries) {
do_conversion = FALSE;
} else {
- prepare_matrix (convert, &convert->convert_matrix);
+ if (idx == 0)
+ prepare_matrix (convert, &convert->convert_matrix);
convert->in_bits = convert->out_bits = 16;
pass_alloc = TRUE;
do_conversion = TRUE;
@@ -1970,7 +1974,7 @@ chain_convert_to_YUV (GstVideoConverter * convert, GstLineCache * prev,
convert->current_bits = convert->pack_bits;
convert->current_pstride = convert->current_bits >> 1;
- if (!convert->pack_rgb) {
+ if (idx == 0 && !convert->pack_rgb) {
color_matrix_set_identity (&convert->to_YUV_matrix);
compute_matrix_to_YUV (convert, &convert->to_YUV_matrix, FALSE);