Jetson TK1上的付费/暂停gstreamer管道存在内存泄漏问题

时间:2018-11-08 14:24:02

标签: memory-leaks gstreamer-1.0 nvidia-jetson

在我的项目(具有L4T 21.4的Jetson TK1)中,我必须播放/暂停一些gstreamer的管道。

问题是巨大的内存泄漏(每个播放/暂停迭代大约100 MB)。 在这里,我有演示程序,重现了泄漏。看起来泄漏的原因是omxh264enc。如果我从演示程序中删除第11行,则内存泄漏将消失。

您可以为我建议一些决定或解决方法吗?

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <thread>
#include <gst/gst.h>

std::string strWeb
{
      "appsrc name=source !"
      "video/x-raw, format=I420, width=3840, height=2160, framerate=2/1 !"
      "omxh264enc ! " // looks like memory leak reason is in this line !!!!!
      "fakesink"
};

bool white = true;

GstClockTime g_timestamp;

static void cb_need_data( GstElement * appsrc, guint unused_size, gpointer data )
{
GstBuffer *buffer;
guint size;
GstFlowReturn ret;

size = 3840 * 2160 * 2;
buffer = gst_buffer_new_allocate (NULL, size, NULL);
gst_buffer_memset (buffer, 0, white ? 0xff : 0x0, size);
white = !white;

/* increment the g_timestamp every 1/2 second */
GST_BUFFER_PTS (buffer) = g_timestamp;
GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND, 2);
g_timestamp += GST_BUFFER_DURATION (buffer);

g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
gst_buffer_unref(buffer);

printf("need data\n");
}

int main()
{
GstElement *appsrc;
GMainLoop *g_loop;
GError *err = NULL;
g_timestamp = 0;

g_loop = g_main_loop_new(NULL, FALSE);
gst_init(NULL, NULL);
GstElement *element = gst_parse_launch(strWeb.c_str(), &err);
if (!element)
{
    printf("appsrc error - %s\n", err->message);
    return 1;
}

appsrc = gst_bin_get_by_name(GST_BIN(element), "source");
if (!appsrc)
{
    printf("appsrc error\n");
    return 1;
}
g_signal_connect (appsrc, "need-data", G_CALLBACK(cb_need_data), NULL);

std::thread thread([&]()
{
    while(true)
    {
        sleep(5);
        g_main_loop_quit(g_loop);
    }
});

for (int i = 0; i < 100; i++)
{
    gst_element_set_state (element, GST_STATE_PLAYING);
    sleep(1);
    g_main_loop_run(g_loop);
    sleep(1);
    gst_element_set_state (element, GST_STATE_NULL);
    printf("rerun %d\n", i);
    sleep(1);
}
gst_object_unref(element);
gst_deinit();
return 0;
}

编译为

g++ main.c -o demo_mem_leak `pkg-config --cflags --libs gstreamer-1.0` --std=c++11

0 个答案:

没有答案