[Bug 667949] New: Memory leak occurs while using videomixer2 element
GStreamer (bugzilla.gnome.org)
bugzilla at gnome.org
Sun Jan 15 02:14:12 PST 2012
https://bugzilla.gnome.org/show_bug.cgi?id=667949
GStreamer | gst-plugins-good | 0.10.36
Summary: Memory leak occurs while using videomixer2 element
Classification: Platform
Product: GStreamer
Version: 0.10.36
OS/Version: Linux
Status: UNCONFIRMED
Severity: normal
Priority: Normal
Component: gst-plugins-good
AssignedTo: gstreamer-bugs at lists.freedesktop.org
ReportedBy: juhsis at yahoo.com
QAContact: gstreamer-bugs at lists.freedesktop.org
GNOME version: ---
Dear Developers,
Here is my code for generate 2 IplImages (in OpenCv) with using gstreamer
elements. I've created this system:
v4l2src -> videobox ->
-> videomixer2 -> videoflip -> ffmpegcolorspace -> appsink
v4l2src -> videobox ->
But memory leakage detected. I changed videomixer2 with videomixer element,
leakage problem fixed but fps of images decreased from 30 to 2-3. And i also
tried to make 2 seperate systems:
v4l2src -> videobox -> videoflip -> ffmpegcolorspace -> appsink
there was also no memory leak in this systems, but they are not syncronised and
getting close in 10 seconds, when both of them works.
So, i definitely decide videmixer2 element has some problems. Actually memory
leak is not happens everytime. If the image consists a lot of same pixels, then
memory leak detected, but if the image consists complex intend: no leak
detected.
Here is my own code, you can try it :
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>
#include <opencv/cvaux.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <gst/gst.h>
#include <gst/app/gstappsrc.h>
#include <gst/app/gstappsink.h>
#include <gst/app/gstappbuffer.h>
#define SCAL1 2
#define SHOWIN 1
unsigned char *ptr;
IplImage* frameL;
IplImage* frameR;
GstElement *pipeline;
static void on_new_buffer_from_source (GstElement * elt, void * data)
{
guint size;
GstBuffer *buffer;
int sizeovertwo;
buffer = gst_app_sink_pull_buffer (GST_APP_SINK (elt));
//printf("%p\n",buffer);
size = GST_BUFFER_SIZE (buffer);
sizeovertwo = size/2;
ptr = (unsigned char *)GST_BUFFER_DATA (buffer);
for(unsigned int r = 0; r < sizeovertwo; r++)
frameL->imageData[r]=ptr[r];
for(unsigned int r = 0; r < sizeovertwo; r++)
frameR->imageData[r]=ptr[r+sizeovertwo];
#if SHOWIN
ptr = NULL;
int cmd = cvvWaitKeyEx( 0, 1 );
gst_buffer_unref(buffer);
system("free -mb");
cvvShowImage( "source left", frameL );
cvvShowImage( "source right", frameR );
#endif
}
int main( int argc, char** argv )
{
GstElement *ffmpegcolor = NULL;
gst_init (&argc, &argv);
GstElement *source,*source2,*mix;
GstElement *vb,*vb2;
GstElement *sink;
GstElement *vf;
GstPad *sink_0,*sink_1;
GstPad *src_0,*src_1;
GstCaps *caps,*caps2;
gboolean link_ok=true;
gboolean link_ok2=true;
gboolean link_ok3=true;
caps = gst_caps_new_full (
gst_structure_new ("video/x-raw-yuv",
"width", G_TYPE_INT, 640/SCAL1,
"height", G_TYPE_INT, 480/SCAL1,
"framerate", GST_TYPE_FRACTION, 20, 1,
NULL),
NULL);
caps2 = gst_caps_new_full (
gst_structure_new ("video/x-raw-gray",
"width", G_TYPE_INT, 480/SCAL1,
"height", G_TYPE_INT, 1280/SCAL1,
"framerate", GST_TYPE_FRACTION, 20, 1,
NULL),
NULL);
pipeline = gst_pipeline_new ("my-pipeline");
source = gst_element_factory_make("v4l2src", "source");
source2 = gst_element_factory_make("v4l2src", "source2");
g_object_set(G_OBJECT(source), "device", "/dev/video0", NULL);
g_object_set(G_OBJECT(source2), "device", "/dev/video1", NULL);
mix = gst_element_factory_make("videomixer2", "mix");
vb = gst_element_factory_make("videobox", "vb");
vb2 = gst_element_factory_make("videobox", "vb2");
vf = gst_element_factory_make("videoflip", "vf");
g_object_set(G_OBJECT(vb2), "left",(gint)-640/SCAL1, NULL);
g_object_set(G_OBJECT(vf), "method",1, NULL);
ffmpegcolor = gst_element_factory_make ("ffmpegcolorspace", NULL);
sink = gst_element_factory_make("appsink", "sink");
gst_app_sink_set_drop((GstAppSink *)sink,true);
g_object_set(G_OBJECT(sink), "max-buffers",(guint)1, NULL);
gst_bin_add_many(GST_BIN
(pipeline),source,source2,vb,vb2,mix,ffmpegcolor,vf,sink, NULL);
link_ok = gst_element_link_filtered (source, vb, caps);
link_ok2 = gst_element_link_filtered (source2, vb2, caps);
sink_0 = gst_element_get_request_pad (mix, "sink_0");
sink_1 = gst_element_get_request_pad (mix, "sink_1");
src_0 = gst_element_get_static_pad (vb, "src");
src_1 = gst_element_get_static_pad (vb2, "src");
gst_pad_link (src_0,sink_1);
gst_pad_link (src_1,sink_0);
gst_object_unref(sink_0);
gst_object_unref(sink_1);
gst_object_unref(src_0);
gst_object_unref(src_1);
gst_element_link_many(mix, vf, ffmpegcolor, NULL);
link_ok3 = gst_element_link_filtered (ffmpegcolor,sink, caps2);
gst_caps_unref (caps);
gst_caps_unref (caps2);
if (!link_ok) {
g_warning ("Failed to link element1 and element2 --1--!");
}
if (!link_ok2) {
g_warning ("Failed to link element1 and element2 --2--!");
}
if (!link_ok3) {
g_warning ("Failed to link element1 and element2 --2--!");
}
g_object_set (G_OBJECT (sink), "emit-signals", TRUE, "sync", FALSE,
NULL);
g_signal_connect (sink, "new-buffer", G_CALLBACK
(on_new_buffer_from_source), NULL);
frameR = cvCreateImage(cvSize(480/SCAL1, 640/SCAL1), IPL_DEPTH_8U, 1);
frameL = cvCreateImage(cvSize(480/SCAL1, 640/SCAL1), IPL_DEPTH_8U, 1);
gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);
g_print ("Let's run!\n");
#if SHOWIN
cvNamedWindow("source left", 1);
cvNamedWindow("source right", 1);
#endif
while(true){
}
return 0;
}
--
Configure bugmail: https://bugzilla.gnome.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.
More information about the gstreamer-bugs
mailing list