Commit 05d2d6ca authored by Yeongjin Jeong's avatar Yeongjin Jeong Committed by Tim-Philipp Müller

nvenc: Fix GValue leaks

GValue should be freed with g_value_unset()
parent b8950c9a
......@@ -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);
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment