Skip to content

Commit be99f2a

Browse files
committed
gst-libs: meta: Fix mem leak while Mapping buffers
Create a copy of exemplars before vxMapping buffers and release the copy after unmap, this is required to free any memory allocated while Mapping Signed-off-by: Rahul T R <[email protected]>
1 parent f208c2e commit be99f2a

File tree

5 files changed

+128
-9
lines changed

5 files changed

+128
-9
lines changed

gst-libs/gst/tiovx/gsttiovximagemeta.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ gst_buffer_add_tiovx_image_meta (GstBuffer * buffer,
175175
vx_image ref = NULL;
176176
vx_df_image vx_format = VX_DF_IMAGE_VIRT;
177177
vx_status status;
178+
vx_image image_exemplar;
179+
vx_bool release_image_exemplar = FALSE;
178180

179181
g_return_val_if_fail (buffer, NULL);
180182
g_return_val_if_fail (VX_SUCCESS == vxGetStatus ((vx_reference) exemplar),
@@ -195,14 +197,24 @@ gst_buffer_add_tiovx_image_meta (GstBuffer * buffer,
195197
tivxReferenceExportHandle ((vx_reference) exemplar,
196198
plane_addr, plane_sizes, MODULE_MAX_NUM_PLANES, &num_planes);
197199

200+
if (NULL == plane_addr[0]) {
201+
/* Copying the image exemplar when memory is not allocated,
202+
* since vxMapImagePatch allocates memory which nees to be freed using
203+
* vxReleaseImage*/
204+
image_exemplar = gst_tiovx_copy_image_exemplar ((vx_image) exemplar);
205+
release_image_exemplar = TRUE;
206+
} else {
207+
image_exemplar = (vx_image) exemplar;
208+
}
209+
198210
array = vxCreateObjectArray (vxGetContext (exemplar), exemplar, array_length);
199211

200212
for (i = 0; i < array_length; i++) {
201213
for (plane_idx = 0; plane_idx < num_planes; plane_idx++) {
202214
addr[plane_idx] = (void *) (mem_start + prev_size);
203215
plane_offset[plane_idx] = prev_size;
204216

205-
gst_tiovx_image_meta_get_plane_info ((vx_image) exemplar, plane_idx,
217+
gst_tiovx_image_meta_get_plane_info (image_exemplar, plane_idx,
206218
&plane_stride_x[plane_idx], &plane_stride_y[plane_idx],
207219
&plane_steps_x[plane_idx], &plane_steps_y[plane_idx],
208220
&plane_widths[plane_idx], &plane_heights[plane_idx]);
@@ -250,14 +262,17 @@ gst_buffer_add_tiovx_image_meta (GstBuffer * buffer,
250262
}
251263

252264
/* Retrieve width, height and format from exemplar */
253-
vxQueryImage ((vx_image) exemplar, VX_IMAGE_WIDTH,
265+
vxQueryImage (image_exemplar, VX_IMAGE_WIDTH,
254266
&tiovx_meta->image_info.width, sizeof (tiovx_meta->image_info.width));
255-
vxQueryImage ((vx_image) exemplar, VX_IMAGE_HEIGHT,
267+
vxQueryImage (image_exemplar, VX_IMAGE_HEIGHT,
256268
&tiovx_meta->image_info.height, sizeof (tiovx_meta->image_info.height));
257-
vxQueryImage ((vx_image) exemplar, VX_IMAGE_FORMAT, &vx_format,
269+
vxQueryImage (image_exemplar, VX_IMAGE_FORMAT, &vx_format,
258270
sizeof (vx_format));
259271
tiovx_meta->image_info.format = vx_format_to_gst_format (vx_format);
260272

273+
if (release_image_exemplar)
274+
vxReleaseImage (&image_exemplar);
275+
261276
goto out;
262277

263278
err_out:

gst-libs/gst/tiovx/gsttiovxrawimagemeta.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ gst_buffer_add_tiovx_raw_image_meta (GstBuffer * buffer,
178178
vx_object_array array;
179179
vx_image ref = NULL;
180180
vx_status status;
181+
tivx_raw_image image_exemplar;
182+
vx_bool release_image_exemplar = FALSE;
181183

182184
g_return_val_if_fail (buffer, NULL);
183185
g_return_val_if_fail (VX_SUCCESS == vxGetStatus ((vx_reference) exemplar),
@@ -187,11 +189,19 @@ gst_buffer_add_tiovx_raw_image_meta (GstBuffer * buffer,
187189
tivxReferenceExportHandle ((vx_reference) exemplar,
188190
addr, sizes, MODULE_MAX_NUM_EXPOSURES, &num_exposures);
189191

192+
if (NULL == addr[0]) {
193+
image_exemplar =
194+
gst_tiovx_copy_raw_image_exemplar ((tivx_raw_image) exemplar);
195+
release_image_exemplar = TRUE;
196+
} else {
197+
image_exemplar = (tivx_raw_image) exemplar;
198+
}
199+
190200
for (exposure_idx = 0; exposure_idx < num_exposures; exposure_idx++) {
191201
addr[exposure_idx] = (void *) (mem_start + prev_size);
192202
offset[exposure_idx] = prev_size;
193203

194-
gst_tiovx_raw_meta_extract_image_params ((tivx_raw_image) exemplar,
204+
gst_tiovx_raw_meta_extract_image_params (image_exemplar,
195205
exposure_idx, &stride_x[exposure_idx], &stride_y[exposure_idx],
196206
&steps_x[exposure_idx], &steps_y[exposure_idx], &widths[exposure_idx],
197207
&heights[exposure_idx]);
@@ -241,6 +251,8 @@ gst_buffer_add_tiovx_raw_image_meta (GstBuffer * buffer,
241251
heights[exposure_idx];
242252
}
243253

254+
if (release_image_exemplar)
255+
tivxReleaseRawImage (&image_exemplar);
244256
goto out;
245257

246258
err_out:

gst-libs/gst/tiovx/gsttiovxtensormeta.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@
6565

6666
#include <TI/tivx.h>
6767

68+
#include "gsttiovxutils.h"
69+
6870
static gboolean gst_tiovx_tensor_meta_init (GstMeta * meta,
6971
gpointer params, GstBuffer * buffer);
7072

@@ -152,6 +154,8 @@ gst_buffer_add_tiovx_tensor_meta (GstBuffer * buffer,
152154
vx_size last_offset = 0;
153155
gint prev_size = 0;
154156
gint i = 0;
157+
vx_tensor tensor_exemplar;
158+
vx_bool release_tensor_exemplar = FALSE;
155159

156160
g_return_val_if_fail (buffer, NULL);
157161
g_return_val_if_fail (VX_SUCCESS == vxGetStatus ((vx_reference) exemplar),
@@ -162,6 +166,13 @@ gst_buffer_add_tiovx_tensor_meta (GstBuffer * buffer,
162166
tivxReferenceExportHandle ((vx_reference) exemplar,
163167
tensor_addr, tensor_size, MODULE_MAX_NUM_DIMS, &num_tensors);
164168

169+
if (NULL == tensor_addr[0]) {
170+
tensor_exemplar = gst_tiovx_copy_tensor_exemplar ((vx_tensor) exemplar);
171+
release_tensor_exemplar = TRUE;
172+
} else {
173+
tensor_exemplar = (vx_tensor) exemplar;
174+
}
175+
165176
g_return_val_if_fail (MODULE_MAX_NUM_TENSORS == num_tensors, NULL);
166177

167178
/* Create new array based on exemplar */
@@ -197,16 +208,16 @@ gst_buffer_add_tiovx_tensor_meta (GstBuffer * buffer,
197208
gst_tiovx_tensor_meta_get_info (), NULL);
198209

199210
/* Retrieve tensor info from exemplar */
200-
vxQueryTensor ((vx_tensor) exemplar, VX_TENSOR_NUMBER_OF_DIMS,
211+
vxQueryTensor (tensor_exemplar, VX_TENSOR_NUMBER_OF_DIMS,
201212
&num_dims, sizeof (vx_size));
202-
vxQueryTensor ((vx_tensor) exemplar, VX_TENSOR_DIMS, dim_sizes,
213+
vxQueryTensor (tensor_exemplar, VX_TENSOR_DIMS, dim_sizes,
203214
num_dims * sizeof (vx_size));
204-
vxQueryTensor ((vx_tensor) exemplar, VX_TENSOR_DATA_TYPE, &data_type,
215+
vxQueryTensor (tensor_exemplar, VX_TENSOR_DATA_TYPE, &data_type,
205216
sizeof (vx_enum));
206217

207218
for (dim_idx = 0; dim_idx < num_dims; dim_idx++) {
208219
dim_strides[dim_idx] =
209-
gst_tiovx_tensor_meta_get_dim_stride ((vx_tensor) exemplar, dim_idx,
220+
gst_tiovx_tensor_meta_get_dim_stride (tensor_exemplar, dim_idx,
210221
num_dims, dim_sizes);
211222
}
212223

@@ -223,6 +234,9 @@ gst_buffer_add_tiovx_tensor_meta (GstBuffer * buffer,
223234
last_offset += dim_sizes[dim_idx];
224235
}
225236

237+
if (release_tensor_exemplar)
238+
vxReleaseTensor (&tensor_exemplar);
239+
226240
goto out;
227241

228242
err_out:

gst-libs/gst/tiovx/gsttiovxutils.c

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,3 +903,58 @@ gst_tioxv_get_pyramid_caps_info (GObject * object, GstDebugCategory * category,
903903
exit:
904904
return ret;
905905
}
906+
907+
vx_image
908+
gst_tiovx_copy_image_exemplar (vx_image exemplar)
909+
{
910+
guint img_width = 0, img_height = 0;
911+
vx_df_image vx_format = VX_DF_IMAGE_VIRT;
912+
913+
vxQueryImage (exemplar, VX_IMAGE_WIDTH, &img_width, sizeof (img_width));
914+
vxQueryImage (exemplar, VX_IMAGE_HEIGHT, &img_height, sizeof (img_height));
915+
vxQueryImage (exemplar, VX_IMAGE_FORMAT, &vx_format, sizeof (vx_format));
916+
917+
return vxCreateImage (vxGetContext ((vx_reference) exemplar), img_width,
918+
img_height, vx_format);
919+
}
920+
921+
vx_tensor
922+
gst_tiovx_copy_tensor_exemplar (vx_tensor exemplar)
923+
{
924+
vx_enum data_type = 0;
925+
vx_size dim_sizes[TENSOR_NUM_DIMS_SUPPORTED];
926+
vx_size num_dims = 0;
927+
928+
vxQueryTensor (exemplar, VX_TENSOR_NUMBER_OF_DIMS, &num_dims,
929+
sizeof (vx_size));
930+
vxQueryTensor (exemplar, VX_TENSOR_DIMS, dim_sizes,
931+
num_dims * sizeof (vx_size));
932+
vxQueryTensor (exemplar, VX_TENSOR_DATA_TYPE, &data_type, sizeof (vx_enum));
933+
934+
return vxCreateTensor (vxGetContext ((vx_reference) exemplar), num_dims,
935+
dim_sizes, data_type, 0);
936+
}
937+
938+
tivx_raw_image
939+
gst_tiovx_copy_raw_image_exemplar (tivx_raw_image exemplar)
940+
{
941+
tivx_raw_image_create_params_t raw_image_params = { };
942+
943+
tivxQueryRawImage (exemplar, TIVX_RAW_IMAGE_WIDTH, &raw_image_params.width,
944+
sizeof (vx_uint32));
945+
tivxQueryRawImage (exemplar, TIVX_RAW_IMAGE_HEIGHT, &raw_image_params.height,
946+
sizeof (vx_uint32));
947+
tivxQueryRawImage (exemplar, TIVX_RAW_IMAGE_NUM_EXPOSURES,
948+
&raw_image_params.num_exposures, sizeof (vx_uint32));
949+
tivxQueryRawImage (exemplar, TIVX_RAW_IMAGE_LINE_INTERLEAVED,
950+
&raw_image_params.line_interleaved, sizeof (vx_bool));
951+
tivxQueryRawImage (exemplar, TIVX_RAW_IMAGE_FORMAT, raw_image_params.format,
952+
raw_image_params.num_exposures * sizeof (tivx_raw_image_format_t));
953+
tivxQueryRawImage (exemplar, TIVX_RAW_IMAGE_META_HEIGHT_BEFORE,
954+
&raw_image_params.meta_height_before, sizeof (vx_uint32));
955+
tivxQueryRawImage (exemplar, TIVX_RAW_IMAGE_META_HEIGHT_AFTER,
956+
&raw_image_params.meta_height_after, sizeof (vx_uint32));
957+
958+
return tivxCreateRawImage (vxGetContext ((vx_reference) exemplar),
959+
&raw_image_params);
960+
}

gst-libs/gst/tiovx/gsttiovxutils.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,27 @@ gst_tioxv_get_pyramid_caps_info (GObject * object, GstDebugCategory * category,
265265
const GstCaps * caps, gint * levels, gdouble * scale, gint * width, gint * height,
266266
GstVideoFormat * format);
267267

268+
/**
269+
* gst_tiovx_copy_image_exemplar:
270+
* @exemplar: vx_image to create a copy
271+
*
272+
* Returns a copy of the image exemplar
273+
*/
274+
vx_image gst_tiovx_copy_image_exemplar (vx_image exemplar);
275+
276+
/**
277+
* gst_tiovx_copy_tensor_exemplar:
278+
* @exemplar: vx_tensor to create a copy
279+
*
280+
* Returns a copy of the tensor exemplar
281+
*/
282+
vx_tensor gst_tiovx_copy_tensor_exemplar (vx_tensor exemplar);
283+
284+
/**
285+
* gst_tiovx_copy_raw_image_exemplar:
286+
* @exemplar: tivx_raw_image to create a copy
287+
*
288+
* Returns a copy of the raw image exemplar
289+
*/
290+
tivx_raw_image gst_tiovx_copy_raw_image_exemplar (tivx_raw_image exemplar);
268291
#endif /* __GST_TIOVX_UTILS_H__ */

0 commit comments

Comments
 (0)