mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 12:15:19 +00:00
ext/ffmpeg/: Free strings atleast when finalizing elements.
Original commit message from CVS: * ext/ffmpeg/gstffmpegcfg.c: (gst_ffmpeg_cfg_install_property), (gst_ffmpeg_cfg_finalize): * ext/ffmpeg/gstffmpegcfg.h: * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_finalize), (ffmpegenc_setup_working_buf), (gst_ffmpegenc_chain_video), (gst_ffmpegenc_flush_buffers): Free strings atleast when finalizing elements. * tests/check/generic/libavcodec-locking.c: (GST_START_TEST), (simple_launch_lines_suite): Fix some leaks.
This commit is contained in:
parent
8e16a39836
commit
907d7e40f5
5 changed files with 65 additions and 14 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
2007-08-01 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
|
* ext/ffmpeg/gstffmpegcfg.c: (gst_ffmpeg_cfg_install_property),
|
||||||
|
(gst_ffmpeg_cfg_finalize):
|
||||||
|
* ext/ffmpeg/gstffmpegcfg.h:
|
||||||
|
* ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_finalize),
|
||||||
|
(ffmpegenc_setup_working_buf), (gst_ffmpegenc_chain_video),
|
||||||
|
(gst_ffmpegenc_flush_buffers):
|
||||||
|
Free strings atleast when finalizing elements.
|
||||||
|
|
||||||
|
* tests/check/generic/libavcodec-locking.c: (GST_START_TEST),
|
||||||
|
(simple_launch_lines_suite):
|
||||||
|
Fix some leaks.
|
||||||
|
|
||||||
2007-08-01 Stefan Kost <ensonic@users.sf.net>
|
2007-08-01 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
* configure.ac:
|
* configure.ac:
|
||||||
|
|
|
@ -760,7 +760,7 @@ gst_ffmpeg_cfg_install_property (GstFFMpegEncClass * klass, guint base)
|
||||||
GParamSpecString* pstring = G_PARAM_SPEC_STRING (pspec);
|
GParamSpecString* pstring = G_PARAM_SPEC_STRING (pspec);
|
||||||
pspec = g_param_spec_string (name, nick, blurb,
|
pspec = g_param_spec_string (name, nick, blurb,
|
||||||
lavc_default ? G_STRUCT_MEMBER (gchar*, ctx, ctx_offset)
|
lavc_default ? G_STRUCT_MEMBER (gchar*, ctx, ctx_offset)
|
||||||
: pstring->default_value,
|
: pstring->default_value,
|
||||||
pspec->flags);
|
pspec->flags);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -813,13 +813,13 @@ gst_ffmpeg_cfg_install_property (GstFFMpegEncClass * klass, guint base)
|
||||||
GParamSpecEnum* penum = G_PARAM_SPEC_ENUM (pspec);
|
GParamSpecEnum* penum = G_PARAM_SPEC_ENUM (pspec);
|
||||||
pspec = g_param_spec_enum (name, nick, blurb,
|
pspec = g_param_spec_enum (name, nick, blurb,
|
||||||
pspec->value_type,
|
pspec->value_type,
|
||||||
lavc_default ? G_STRUCT_MEMBER (gint, ctx, ctx_offset)
|
lavc_default ? G_STRUCT_MEMBER (gint, ctx, ctx_offset)
|
||||||
: penum->default_value, pspec->flags);
|
: penum->default_value, pspec->flags);
|
||||||
} else if (G_IS_PARAM_SPEC_FLAGS (pspec)) {
|
} else if (G_IS_PARAM_SPEC_FLAGS (pspec)) {
|
||||||
GParamSpecFlags* pflags = G_PARAM_SPEC_FLAGS (pspec);
|
GParamSpecFlags* pflags = G_PARAM_SPEC_FLAGS (pspec);
|
||||||
pspec = g_param_spec_flags (name, nick, blurb,
|
pspec = g_param_spec_flags (name, nick, blurb,
|
||||||
pspec->value_type,
|
pspec->value_type,
|
||||||
lavc_default ? G_STRUCT_MEMBER (guint, ctx, ctx_offset)
|
lavc_default ? G_STRUCT_MEMBER (guint, ctx, ctx_offset)
|
||||||
: pflags->default_value, pspec->flags);
|
: pflags->default_value, pspec->flags);
|
||||||
} else {
|
} else {
|
||||||
g_critical ("%s does not yet support type %s", GST_FUNCTION,
|
g_critical ("%s does not yet support type %s", GST_FUNCTION,
|
||||||
|
@ -1026,3 +1026,36 @@ gst_ffmpeg_cfg_fill_context (GstFFMpegEnc * ffmpegenc, AVCodecContext * context)
|
||||||
list = list->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_ffmpeg_cfg_finalize (GstFFMpegEnc * ffmpegenc)
|
||||||
|
{
|
||||||
|
GParamSpec **pspecs;
|
||||||
|
guint num_props, i;
|
||||||
|
|
||||||
|
pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (ffmpegenc),
|
||||||
|
&num_props);
|
||||||
|
|
||||||
|
for (i = 0; i < num_props; ++i) {
|
||||||
|
GParamSpec *pspec = pspecs[i];
|
||||||
|
GParamSpecData *qdata;
|
||||||
|
|
||||||
|
qdata = g_param_spec_get_qdata (pspec, quark);
|
||||||
|
|
||||||
|
/* our param specs should have such qdata */
|
||||||
|
if (!qdata)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (G_PARAM_SPEC_VALUE_TYPE (pspec)) {
|
||||||
|
case G_TYPE_STRING:
|
||||||
|
if(qdata->size == sizeof (gchar*)) {
|
||||||
|
g_free (G_STRUCT_MEMBER (gchar*, ffmpegenc, qdata->offset));
|
||||||
|
G_STRUCT_MEMBER (gchar*, ffmpegenc, qdata->offset) = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_free (pspecs);
|
||||||
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ gboolean gst_ffmpeg_cfg_get_property (GObject * object,
|
||||||
|
|
||||||
void gst_ffmpeg_cfg_fill_context (GstFFMpegEnc * ffmpegenc, AVCodecContext * context);
|
void gst_ffmpeg_cfg_fill_context (GstFFMpegEnc * ffmpegenc, AVCodecContext * context);
|
||||||
void gst_ffmpeg_cfg_set_defaults (GstFFMpegEnc * ffmpegenc);
|
void gst_ffmpeg_cfg_set_defaults (GstFFMpegEnc * ffmpegenc);
|
||||||
|
void gst_ffmpeg_cfg_finalize (GstFFMpegEnc * ffmpegenc);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -259,6 +259,8 @@ gst_ffmpegenc_finalize (GObject * object)
|
||||||
{
|
{
|
||||||
GstFFMpegEnc *ffmpegenc = (GstFFMpegEnc *) object;
|
GstFFMpegEnc *ffmpegenc = (GstFFMpegEnc *) object;
|
||||||
|
|
||||||
|
gst_ffmpeg_cfg_finalize (ffmpegenc);
|
||||||
|
|
||||||
/* close old session */
|
/* close old session */
|
||||||
if (ffmpegenc->opened) {
|
if (ffmpegenc->opened) {
|
||||||
gst_ffmpeg_avcodec_close (ffmpegenc->context);
|
gst_ffmpeg_avcodec_close (ffmpegenc->context);
|
||||||
|
@ -570,7 +572,7 @@ gst_ffmpegenc_setcaps (GstPad * pad, GstCaps * caps)
|
||||||
static void
|
static void
|
||||||
ffmpegenc_setup_working_buf (GstFFMpegEnc *ffmpegenc)
|
ffmpegenc_setup_working_buf (GstFFMpegEnc *ffmpegenc)
|
||||||
{
|
{
|
||||||
if (ffmpegenc->working_buf == NULL ||
|
if (ffmpegenc->working_buf == NULL ||
|
||||||
ffmpegenc->working_buf_size != ffmpegenc->buffer_size) {
|
ffmpegenc->working_buf_size != ffmpegenc->buffer_size) {
|
||||||
if (ffmpegenc->working_buf)
|
if (ffmpegenc->working_buf)
|
||||||
g_free (ffmpegenc->working_buf);
|
g_free (ffmpegenc->working_buf);
|
||||||
|
@ -603,7 +605,7 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstBuffer * inbuf)
|
||||||
ffmpegenc_setup_working_buf (ffmpegenc);
|
ffmpegenc_setup_working_buf (ffmpegenc);
|
||||||
|
|
||||||
ret_size = avcodec_encode_video (ffmpegenc->context,
|
ret_size = avcodec_encode_video (ffmpegenc->context,
|
||||||
ffmpegenc->working_buf, ffmpegenc->working_buf_size,
|
ffmpegenc->working_buf, ffmpegenc->working_buf_size,
|
||||||
ffmpegenc->picture);
|
ffmpegenc->picture);
|
||||||
|
|
||||||
if (ret_size < 0) {
|
if (ret_size < 0) {
|
||||||
|
@ -754,7 +756,7 @@ gst_ffmpegenc_flush_buffers (GstFFMpegEnc * ffmpegenc, gboolean send)
|
||||||
while (!g_queue_is_empty (ffmpegenc->delay)) {
|
while (!g_queue_is_empty (ffmpegenc->delay)) {
|
||||||
|
|
||||||
ffmpegenc_setup_working_buf (ffmpegenc);
|
ffmpegenc_setup_working_buf (ffmpegenc);
|
||||||
|
|
||||||
ret_size = avcodec_encode_video (ffmpegenc->context,
|
ret_size = avcodec_encode_video (ffmpegenc->context,
|
||||||
ffmpegenc->working_buf, ffmpegenc->working_buf_size, NULL);
|
ffmpegenc->working_buf, ffmpegenc->working_buf_size, NULL);
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ setup_pipeline (const gchar * pipe_descr)
|
||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* run_pipeline:
|
* run_pipeline:
|
||||||
* @pipe: the pipeline to run
|
* @pipe: the pipeline to run
|
||||||
* @desc: the description for use in messages
|
* @desc: the description for use in messages
|
||||||
|
@ -101,22 +101,21 @@ GST_START_TEST (test_libavcodec_locks)
|
||||||
|
|
||||||
for (i=0; i<NUM_SINKS; i++)
|
for (i=0; i<NUM_SINKS; i++)
|
||||||
sink[i] = g_strdup_printf (" t.src%d ! queue ! ffenc_mpeg4 ! ffdec_mpeg4 ! fakesink sync=true", i);
|
sink[i] = g_strdup_printf (" t.src%d ! queue ! ffenc_mpeg4 ! ffdec_mpeg4 ! fakesink sync=true", i);
|
||||||
|
|
||||||
sink [NUM_SINKS] = NULL;
|
sink [NUM_SINKS] = NULL;
|
||||||
|
|
||||||
sinks = g_strjoinv (" ", sink);
|
sinks = g_strjoinv (" ", sink);
|
||||||
|
|
||||||
s = g_strdup_printf ("videotestsrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)10/1 ! tee name=t %s", sinks);
|
s = g_strdup_printf ("videotestsrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)10/1 ! tee name=t %s", sinks);
|
||||||
|
|
||||||
run_pipeline (setup_pipeline (s), s,
|
run_pipeline (setup_pipeline (s), s,
|
||||||
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
|
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
|
||||||
GST_MESSAGE_UNKNOWN);
|
GST_MESSAGE_UNKNOWN);
|
||||||
|
|
||||||
g_free (s);
|
g_free (s);
|
||||||
|
|
||||||
for (i=0; i<NUM_SINKS; i++)
|
for (i=0; i<NUM_SINKS; i++)
|
||||||
g_free (sink[i]);
|
g_free (sink[i]);
|
||||||
|
g_free (sinks);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_END_TEST Suite *
|
GST_END_TEST Suite *
|
||||||
|
@ -138,6 +137,7 @@ simple_launch_lines_suite (void)
|
||||||
|
|
||||||
suite_add_tcase (s, tc_chain);
|
suite_add_tcase (s, tc_chain);
|
||||||
|
|
||||||
|
#ifndef GST_DISABLE_PARSE
|
||||||
/* only run this if we haven't been configured with --disable-encoders */
|
/* only run this if we haven't been configured with --disable-encoders */
|
||||||
if (gst_default_registry_check_feature_version ("ffenc_mpeg4",
|
if (gst_default_registry_check_feature_version ("ffenc_mpeg4",
|
||||||
GST_VERSION_MAJOR, GST_VERSION_MINOR, 0)) {
|
GST_VERSION_MAJOR, GST_VERSION_MINOR, 0)) {
|
||||||
|
@ -145,7 +145,8 @@ simple_launch_lines_suite (void)
|
||||||
} else {
|
} else {
|
||||||
g_print ("******* Skipping libavcodec_locks test, no encoder available\n");
|
g_print ("******* Skipping libavcodec_locks test, no encoder available\n");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue