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>
+
* configure.ac:
* ext/ffmpeg/Makefile.am:
Check for libm and link against it (ffmpeg is using sqrt).
GParamSpecString* pstring = G_PARAM_SPEC_STRING (pspec);
pspec = g_param_spec_string (name, nick, blurb,
lavc_default ? G_STRUCT_MEMBER (gchar*, ctx, ctx_offset)
- : pstring->default_value,
+ : pstring->default_value,
pspec->flags);
break;
}
GParamSpecEnum* penum = G_PARAM_SPEC_ENUM (pspec);
pspec = g_param_spec_enum (name, nick, blurb,
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);
} else if (G_IS_PARAM_SPEC_FLAGS (pspec)) {
GParamSpecFlags* pflags = G_PARAM_SPEC_FLAGS (pspec);
pspec = g_param_spec_flags (name, nick, blurb,
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);
} else {
g_critical ("%s does not yet support type %s", GST_FUNCTION,
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);
+}
void gst_ffmpeg_cfg_fill_context (GstFFMpegEnc * ffmpegenc, AVCodecContext * context);
void gst_ffmpeg_cfg_set_defaults (GstFFMpegEnc * ffmpegenc);
+void gst_ffmpeg_cfg_finalize (GstFFMpegEnc * ffmpegenc);
G_END_DECLS
{
GstFFMpegEnc *ffmpegenc = (GstFFMpegEnc *) object;
+ gst_ffmpeg_cfg_finalize (ffmpegenc);
+
/* close old session */
if (ffmpegenc->opened) {
gst_ffmpeg_avcodec_close (ffmpegenc->context);
static void
ffmpegenc_setup_working_buf (GstFFMpegEnc *ffmpegenc)
{
- if (ffmpegenc->working_buf == NULL ||
+ if (ffmpegenc->working_buf == NULL ||
ffmpegenc->working_buf_size != ffmpegenc->buffer_size) {
if (ffmpegenc->working_buf)
g_free (ffmpegenc->working_buf);
ffmpegenc_setup_working_buf (ffmpegenc);
ret_size = avcodec_encode_video (ffmpegenc->context,
- ffmpegenc->working_buf, ffmpegenc->working_buf_size,
+ ffmpegenc->working_buf, ffmpegenc->working_buf_size,
ffmpegenc->picture);
if (ret_size < 0) {
while (!g_queue_is_empty (ffmpegenc->delay)) {
ffmpegenc_setup_working_buf (ffmpegenc);
-
+
ret_size = avcodec_encode_video (ffmpegenc->context,
ffmpegenc->working_buf, ffmpegenc->working_buf_size, NULL);
return pipeline;
}
-/*
+/*
* run_pipeline:
* @pipe: the pipeline to run
* @desc: the description for use in messages
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 [NUM_SINKS] = NULL;
-
+
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);
-
+
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
-
g_free (s);
for (i=0; i<NUM_SINKS; i++)
g_free (sink[i]);
-
+ g_free (sinks);
}
GST_END_TEST Suite *
suite_add_tcase (s, tc_chain);
+#ifndef GST_DISABLE_PARSE
/* only run this if we haven't been configured with --disable-encoders */
if (gst_default_registry_check_feature_version ("ffenc_mpeg4",
GST_VERSION_MAJOR, GST_VERSION_MINOR, 0)) {
} else {
g_print ("******* Skipping libavcodec_locks test, no encoder available\n");
}
-
+#endif
+
return s;
}