mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-08 16:35:40 +00:00
Fixed some mem-leaks in xvid.
Original commit message from CVS: Fixed some mem-leaks in xvid.
This commit is contained in:
parent
e1eae4061d
commit
9a85a17c4d
4 changed files with 88 additions and 37 deletions
|
@ -1,3 +1,10 @@
|
|||
2005-12-15 Edgard Lima <edgard.lima@indt.org.br>
|
||||
|
||||
* ext/xvid/Makefile.am:
|
||||
* ext/xvid/gstxviddec.c:
|
||||
* ext/xvid/gstxvidenc.c:
|
||||
Fixed some mem-leaks in xvid.
|
||||
|
||||
2005-12-14 Edgard Lima <edgard.lima@indt.org.br>
|
||||
|
||||
* configure.ac:
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
plugin_LTLIBRARIES = libgstxvid.la
|
||||
|
||||
libgstxvid_la_SOURCES = gstxvidenc.c gstxviddec.c gstxvid.c
|
||||
libgstxvid_la_CFLAGS = $(GST_CFLAGS) $(XVID_CFLAGS)
|
||||
libgstxvid_la_LIBADD = $(XVID_LIBS)
|
||||
libgstxvid_la_CFLAGS = $(GST_CFLAGS) $(XVID_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
|
||||
libgstxvid_la_LIBADD = $(XVID_LIBS) $(GST_PLUGINS_BASE_LIBS)
|
||||
libgstxvid_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||
|
||||
noinst_HEADERS = gstxvidenc.h gstxviddec.h gstxvid.h
|
||||
|
|
|
@ -238,16 +238,16 @@ gst_xviddec_chain (GstPad * pad, GstBuffer * buf)
|
|||
}
|
||||
|
||||
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (xviddec->srcpad));
|
||||
gst_pad_push (xviddec->srcpad, outbuf);
|
||||
gst_buffer_unref (buf);
|
||||
return ret;
|
||||
ret = gst_pad_push (xviddec->srcpad, outbuf);
|
||||
|
||||
goto cleanup;
|
||||
|
||||
not_negotiated:
|
||||
{
|
||||
GST_ELEMENT_ERROR (xviddec, CORE, NEGOTIATION, (NULL),
|
||||
("format wasn't negotiated before chain function"));
|
||||
gst_buffer_unref (buf);
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
ret = GST_FLOW_NOT_NEGOTIATED;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
not_decoding:
|
||||
|
@ -255,16 +255,22 @@ not_decoding:
|
|||
GST_ELEMENT_ERROR (xviddec, STREAM, DECODE, (NULL),
|
||||
("Error decoding xvid frame: %s (%d)\n", gst_xvid_error (error),
|
||||
error));
|
||||
gst_buffer_unref (buf);
|
||||
gst_buffer_unref (outbuf);
|
||||
return GST_FLOW_ERROR;
|
||||
ret = GST_FLOW_ERROR;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
|
||||
gst_buffer_unref (buf);
|
||||
gst_object_unref (xviddec);
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_xviddec_negotiate (GstXvidDec * xviddec)
|
||||
{
|
||||
GstCaps *caps = NULL;
|
||||
gint csp[] = {
|
||||
XVID_CSP_I420,
|
||||
XVID_CSP_YV12,
|
||||
|
@ -283,23 +289,29 @@ gst_xviddec_negotiate (GstXvidDec * xviddec)
|
|||
0
|
||||
}, i;
|
||||
|
||||
caps = gst_caps_new_empty ();
|
||||
for (i = 0; csp[i] != 0; i++) {
|
||||
GstCaps *one = gst_xvid_csp_to_caps (csp[i], xviddec->width,
|
||||
xviddec->height, xviddec->fps_n, xviddec->fps_d);
|
||||
|
||||
if (gst_pad_set_caps (xviddec->srcpad, one)) {
|
||||
GstStructure *structure = gst_caps_get_structure (one, 0);
|
||||
if (one) {
|
||||
|
||||
xviddec->csp = gst_xvid_structure_to_csp (structure, xviddec->width,
|
||||
&xviddec->stride, &xviddec->bpp);
|
||||
if (gst_pad_set_caps (xviddec->srcpad, one)) {
|
||||
GstStructure *structure = gst_caps_get_structure (one, 0);
|
||||
|
||||
if (xviddec->csp < 0) {
|
||||
return FALSE;
|
||||
xviddec->csp = gst_xvid_structure_to_csp (structure, xviddec->width,
|
||||
&xviddec->stride, &xviddec->bpp);
|
||||
|
||||
if (xviddec->csp < 0) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
gst_caps_unref (one);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
gst_xviddec_setup (xviddec);
|
||||
|
@ -312,6 +324,7 @@ gst_xviddec_setcaps (GstPad * pad, GstCaps * caps)
|
|||
GstXvidDec *xviddec = GST_XVIDDEC (gst_pad_get_parent (pad));
|
||||
GstStructure *structure;
|
||||
const GValue *fps;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
/* if there's something old around, remove it */
|
||||
if (xviddec->handle) {
|
||||
|
@ -319,7 +332,8 @@ gst_xviddec_setcaps (GstPad * pad, GstCaps * caps)
|
|||
}
|
||||
|
||||
if (!gst_pad_set_caps (xviddec->srcpad, caps)) {
|
||||
return FALSE;
|
||||
ret = FALSE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* if we get here, we know the input is xvid. we
|
||||
|
@ -330,14 +344,20 @@ gst_xviddec_setcaps (GstPad * pad, GstCaps * caps)
|
|||
gst_structure_get_int (structure, "height", &xviddec->height);
|
||||
|
||||
fps = gst_structure_get_value (structure, "framerate");
|
||||
if (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps)) {
|
||||
if (fps != NULL) {
|
||||
xviddec->fps_n = gst_value_get_fraction_numerator (fps);
|
||||
xviddec->fps_d = gst_value_get_fraction_denominator (fps);
|
||||
} else {
|
||||
xviddec->fps_n = -1;
|
||||
}
|
||||
|
||||
return gst_xviddec_negotiate (xviddec);
|
||||
ret = gst_xviddec_negotiate (xviddec);
|
||||
|
||||
done:
|
||||
gst_object_unref (xviddec);
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static GstStateChangeReturn
|
||||
|
|
|
@ -297,7 +297,8 @@ gst_xvidenc_chain (GstPad * pad, GstBuffer * buf)
|
|||
GstBuffer *outbuf;
|
||||
xvid_enc_frame_t xframe;
|
||||
xvid_enc_stats_t xstats;
|
||||
gint ret;
|
||||
gint res;
|
||||
GstFlowReturn ret = GST_FLOW_OK;
|
||||
|
||||
outbuf = gst_buffer_new_and_alloc (xvidenc->buffer_size << 10);
|
||||
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf);
|
||||
|
@ -328,39 +329,45 @@ gst_xvidenc_chain (GstPad * pad, GstBuffer * buf)
|
|||
xframe.length = GST_BUFFER_SIZE (outbuf); /* GST_BUFFER_MAXSIZE */
|
||||
gst_xvid_init_struct (xstats);
|
||||
|
||||
if ((ret = xvid_encore (xvidenc->handle, XVID_ENC_ENCODE,
|
||||
if ((res = xvid_encore (xvidenc->handle, XVID_ENC_ENCODE,
|
||||
&xframe, &xstats)) < 0) {
|
||||
GST_ELEMENT_ERROR (xvidenc, LIBRARY, ENCODE, (NULL),
|
||||
("Error encoding xvid frame: %s (%d)", gst_xvid_error (ret), ret));
|
||||
gst_buffer_unref (buf);
|
||||
("Error encoding xvid frame: %s (%d)", gst_xvid_error (res), res));
|
||||
gst_buffer_unref (outbuf);
|
||||
return GST_FLOW_ERROR;
|
||||
ret = GST_FLOW_ERROR;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
GST_BUFFER_SIZE (outbuf) = xstats.length;
|
||||
|
||||
/* go out, multiply! */
|
||||
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (xvidenc->srcpad));
|
||||
gst_pad_push (xvidenc->srcpad, outbuf);
|
||||
ret = gst_pad_push (xvidenc->srcpad, outbuf);
|
||||
|
||||
/* proclaim destiny */
|
||||
g_signal_emit (G_OBJECT (xvidenc), gst_xvidenc_signals[FRAME_ENCODED], 0);
|
||||
|
||||
/* until the final judgement */
|
||||
|
||||
cleanup:
|
||||
|
||||
gst_buffer_unref (buf);
|
||||
return GST_FLOW_OK;
|
||||
gst_object_unref (xvidenc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
gst_xvidenc_setcaps (GstPad * pad, GstCaps * caps)
|
||||
{
|
||||
GstCaps *new_caps = NULL;
|
||||
GstXvidEnc *xvidenc;
|
||||
GstStructure *structure = gst_caps_get_structure (caps, 0);
|
||||
const gchar *mime;
|
||||
gint w, h;
|
||||
const GValue *fps;
|
||||
gint xvid_cs = -1, stride = -1;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
xvidenc = GST_XVIDENC (gst_pad_get_parent (pad));
|
||||
|
||||
|
@ -374,7 +381,7 @@ gst_xvidenc_setcaps (GstPad * pad, GstCaps * caps)
|
|||
gst_structure_get_int (structure, "height", &h);
|
||||
|
||||
fps = gst_structure_get_value (structure, "framerate");
|
||||
if (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps)) {
|
||||
if (fps != NULL) {
|
||||
xvidenc->fps_n = gst_value_get_fraction_numerator (fps);
|
||||
xvidenc->fps_d = gst_value_get_fraction_denominator (fps);
|
||||
} else {
|
||||
|
@ -389,24 +396,41 @@ gst_xvidenc_setcaps (GstPad * pad, GstCaps * caps)
|
|||
xvidenc->stride = stride;
|
||||
|
||||
if (gst_xvidenc_setup (xvidenc)) {
|
||||
GstCaps *new_caps = NULL;
|
||||
|
||||
new_caps = gst_caps_new_simple ("video/x-xvid",
|
||||
"width", G_TYPE_INT, w,
|
||||
"height", G_TYPE_INT, h,
|
||||
"framerate", GST_TYPE_FRACTION, xvidenc->fps_n, xvidenc->fps_d, NULL);
|
||||
if (!gst_pad_set_caps (xvidenc->srcpad, new_caps)) {
|
||||
if (xvidenc->handle) {
|
||||
xvid_encore (xvidenc->handle, XVID_ENC_DESTROY, NULL, NULL);
|
||||
xvidenc->handle = NULL;
|
||||
|
||||
if (new_caps) {
|
||||
|
||||
if (!gst_pad_set_caps (xvidenc->srcpad, new_caps)) {
|
||||
if (xvidenc->handle) {
|
||||
xvid_encore (xvidenc->handle, XVID_ENC_DESTROY, NULL, NULL);
|
||||
xvidenc->handle = NULL;
|
||||
}
|
||||
ret = FALSE;
|
||||
goto cleanup;
|
||||
}
|
||||
return FALSE;
|
||||
ret = TRUE;
|
||||
goto cleanup;
|
||||
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
/* if we got here - it's not good */
|
||||
return FALSE;
|
||||
ret = FALSE;
|
||||
|
||||
cleanup:
|
||||
|
||||
if (new_caps) {
|
||||
gst_caps_unref (new_caps);
|
||||
}
|
||||
|
||||
gst_object_unref (xvidenc);
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue