My application with appsrc eats whole memory (is it a memory leak) ?
Edward Hervey
bilboed at bilboed.com
Mon Dec 18 14:06:42 UTC 2017
Hi,
Are you releasing the buffers (and content) you are passing to appsrc
? That's most likely the culprit.
Make sure the buffers you provide to appsrc have a destroynotify (see
the documentation for gst_buffer_new_wrapped_full()).
Edward
On Mon, 2017-12-18 at 11:23 +0300, Denis Shienkov wrote:
> Hi all,
>
> I faced with a problem, that my application eats whole
> memory when I start it with this pipeline (without using
> of a videoenc element in pipeline):
>
> void Grabber::initializeGst()
> {
> ::gst_init(nullptr, nullptr);
>
> m_appsrc = ::gst_element_factory_make(
> "appsrc", "source");
>
> ::g_object_set(G_OBJECT(m_appsrc),
> "stream-type", GST_APP_STREAM_TYPE_STREAM,
> "is-live", true,
> "format", GST_FORMAT_TIME,
> nullptr);
>
> const auto caps = ::gst_caps_new_simple(
> "video/x-raw",
> "format", G_TYPE_STRING, "BGRA",
> "width", G_TYPE_INT, 800,
> "height", G_TYPE_INT, 600,
> "framerate", GST_TYPE_FRACTION, 0, 1,
> nullptr);
>
> ::g_object_set(G_OBJECT(m_appsrc),
> "caps", caps,
> nullptr);
>
> const auto conv = ::gst_element_factory_make(
> "videoconvert", "conv");
>
> const auto videoenc = ::gst_element_factory_make(
> "x264enc", "video_encoder");
>
> const auto payloader = ::gst_element_factory_make(
> "rtph264pay", "payloader");
>
> ::g_object_set(G_OBJECT(payloader),
> "config-interval", 3,
> nullptr);
>
> m_pipeline = ::gst_pipeline_new("pipeline");
>
> const auto udpsink = ::gst_element_factory_make(
> "udpsink", "udpsink");
>
> ::g_object_set(G_OBJECT(udpsink),
> "host", "127.0.0.1",
> "port", 50666,
> nullptr);
>
> ::gst_bin_add_many(GST_BIN(m_pipeline),
> m_appsrc,
> // conv,
> videoenc,
> payloader,
> udpsink,
> nullptr);
>
> const auto result = ::gst_element_link_many(m_appsrc,
> // conv,
> videoenc,
> payloader,
> udpsink,
> nullptr);
>
> if (!result) {
> qDebug() << "Unable to initialize the GST";
> } else {
> // Play.
> const auto status = ::gst_element_set_state(m_pipeline,
> GST_STATE_PLAYING);
> qDebug() << "Status:" << status;
> }
> }
>
> I use the gst_app_src_push_buffer() function directly when
> I get a ready buffer from the some external entity.
>
> I have tried it on Windows and on Linux, and the behavior is same:
> the CPU load ~10%, but the RAM consumption increases very quickly,
> and after ~10 seconds it eatch all memory.
>
> But, when I insert the 'videoconvert' element, then the RAM
> consumption
> stabilized on ~300 MBytes, and the CPU consumption increases up to
> ~80%.
>
> In ideally, I do not need to use an 'videoconvert' elament, because
> I want to send it in an original format as BGRA.
>
> What I doing wrong?
>
> BR,
> Denis
>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
More information about the gstreamer-devel
mailing list