summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYeongjin Jeong <yeongjin.jeong@navercorp.com>2019-03-05 18:55:16 +0900
committerTim-Philipp Müller <tim@centricular.com>2019-05-02 10:59:45 +0100
commit05d2d6cac397a86c9a6227a5fc78a3bfba4facde (patch)
tree83b5f816b7e91b3f46826fde059ce0a2105c6a77
parentb8950c9a0204a7d619d41493508cd0df6ab61c3e (diff)
downloadgstreamer-plugins-bad-05d2d6cac397a86c9a6227a5fc78a3bfba4facde.tar.gz
nvenc: Fix GValue leaks
GValue should be freed with g_value_unset()
-rw-r--r--sys/nvenc/gstnvbaseenc.c25
-rw-r--r--sys/nvenc/gstnvh264enc.c11
2 files changed, 24 insertions, 12 deletions
diff --git a/sys/nvenc/gstnvbaseenc.c b/sys/nvenc/gstnvbaseenc.c
index e805a5bcb..8a615a8be 100644
--- a/sys/nvenc/gstnvbaseenc.c
+++ b/sys/nvenc/gstnvbaseenc.c
@@ -307,9 +307,11 @@ _get_supported_input_formats (GstNvBaseEnc * nvenc)
guint64 format_mask = 0;
uint32_t i, num = 0;
NV_ENC_BUFFER_FORMAT formats[64];
- GValue list = G_VALUE_INIT;
GValue val = G_VALUE_INIT;
+ if (nvenc->input_formats)
+ return TRUE;
+
NvEncGetInputFormats (nvenc->encoder, nvenc_class->codec_id, formats,
G_N_ELEMENTS (formats), &num);
@@ -376,30 +378,30 @@ _get_supported_input_formats (GstNvBaseEnc * nvenc)
if (format_mask == 0)
return FALSE;
+ GST_OBJECT_LOCK (nvenc);
+ nvenc->input_formats = g_new0 (GValue, 1);
+
/* process a second time so we can add formats in the order we want */
- g_value_init (&list, GST_TYPE_LIST);
+ g_value_init (nvenc->input_formats, GST_TYPE_LIST);
g_value_init (&val, G_TYPE_STRING);
if ((format_mask & (1 << GST_VIDEO_FORMAT_NV12))) {
g_value_set_static_string (&val, "NV12");
- gst_value_list_append_value (&list, &val);
+ gst_value_list_append_value (nvenc->input_formats, &val);
}
if ((format_mask & (1 << GST_VIDEO_FORMAT_YV12))) {
g_value_set_static_string (&val, "YV12");
- gst_value_list_append_value (&list, &val);
+ gst_value_list_append_value (nvenc->input_formats, &val);
}
if ((format_mask & (1 << GST_VIDEO_FORMAT_I420))) {
g_value_set_static_string (&val, "I420");
- gst_value_list_append_value (&list, &val);
+ gst_value_list_append_value (nvenc->input_formats, &val);
}
if ((format_mask & (1 << GST_VIDEO_FORMAT_Y444))) {
g_value_set_static_string (&val, "Y444");
- gst_value_list_append_value (&list, &val);
+ gst_value_list_append_value (nvenc->input_formats, &val);
}
g_value_unset (&val);
- GST_OBJECT_LOCK (nvenc);
- g_free (nvenc->input_formats);
- nvenc->input_formats = g_memdup (&list, sizeof (GValue));
GST_OBJECT_UNLOCK (nvenc);
return TRUE;
@@ -573,7 +575,7 @@ _get_interlace_modes (GstNvBaseEnc * nvenc)
g_value_set_static_string (&val, "interleaved");
gst_value_list_append_value (list, &val);
g_value_set_static_string (&val, "mixed");
- gst_value_list_append_value (list, &val);
+ gst_value_list_append_and_take_value (list, &val);
}
/* TODO: figure out what nvenc frame based interlacing means in gst terms */
@@ -598,6 +600,7 @@ gst_nv_base_enc_getcaps (GstVideoEncoder * enc, GstCaps * filter)
val = _get_interlace_modes (nvenc);
gst_caps_set_value (supported_incaps, "interlace-mode", val);
+ g_value_unset (val);
g_free (val);
GST_LOG_OBJECT (enc, "codec input caps %" GST_PTR_FORMAT, supported_incaps);
@@ -639,6 +642,8 @@ gst_nv_base_enc_close (GstVideoEncoder * enc)
}
GST_OBJECT_LOCK (nvenc);
+ if (nvenc->input_formats)
+ g_value_unset (nvenc->input_formats);
g_free (nvenc->input_formats);
nvenc->input_formats = NULL;
GST_OBJECT_UNLOCK (nvenc);
diff --git a/sys/nvenc/gstnvh264enc.c b/sys/nvenc/gstnvh264enc.c
index df25e7a59..cc7e156f2 100644
--- a/sys/nvenc/gstnvh264enc.c
+++ b/sys/nvenc/gstnvh264enc.c
@@ -119,6 +119,9 @@ _get_supported_profiles (GstNvH264Enc * nvenc)
GValue val = G_VALUE_INIT;
guint i, n, n_profiles;
+ if (nvenc->supported_profiles)
+ return TRUE;
+
nv_ret =
NvEncGetEncodeProfileGUIDCount (GST_NV_BASE_ENC (nvenc)->encoder,
NV_ENC_CODEC_H264_GUID, &n);
@@ -161,8 +164,8 @@ _get_supported_profiles (GstNvH264Enc * nvenc)
return FALSE;
GST_OBJECT_LOCK (nvenc);
- g_free (nvenc->supported_profiles);
- nvenc->supported_profiles = g_memdup (&list, sizeof (GValue));
+ nvenc->supported_profiles = g_new0 (GValue, 1);
+ *nvenc->supported_profiles = list;
GST_OBJECT_UNLOCK (nvenc);
return TRUE;
@@ -211,6 +214,8 @@ gst_nv_h264_enc_close (GstVideoEncoder * enc)
GstNvH264Enc *nvenc = GST_NV_H264_ENC (enc);
GST_OBJECT_LOCK (nvenc);
+ if (nvenc->supported_profiles)
+ g_value_unset (nvenc->supported_profiles);
g_free (nvenc->supported_profiles);
nvenc->supported_profiles = NULL;
GST_OBJECT_UNLOCK (nvenc);
@@ -244,6 +249,7 @@ _get_interlace_modes (GstNvH264Enc * nvenc)
gst_value_list_append_value (list, &val);
g_value_set_static_string (&val, "mixed");
gst_value_list_append_value (list, &val);
+ g_value_unset (&val);
}
/* TODO: figure out what nvenc frame based interlacing means in gst terms */
@@ -269,6 +275,7 @@ gst_nv_h264_enc_getcaps (GstVideoEncoder * enc, GstCaps * filter)
val = _get_interlace_modes (nvenc);
gst_caps_set_value (supported_incaps, "interlace-mode", val);
+ g_value_unset (val);
g_free (val);
GST_LOG_OBJECT (enc, "codec input caps %" GST_PTR_FORMAT, supported_incaps);