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 [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
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 > [hidden email] > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Hi, Edward
> Are you releasing the buffers (and content) > you are passing to appsrc? As I see from the doc, it say that the gst_app_src_push_buffer() function takes ownership of buffer... so, I'm don't care about the buffer releasing. > see the documentation for gst_buffer_new_wrapped_full() I use some different way: void StreamProducerControl::presentImage(const QImage &image) { ... m_image = image; const auto buffer = gst_buffer_new_and_alloc(m_image.byteCount()); const auto bytesCopied = ::gst_buffer_fill( buffer, 0, m_image.constBits(), m_image.byteCount()); GST_BUFFER_PTS(buffer) = m_timestamp.nsecsElapsed(); const auto result = ::gst_app_src_push_buffer( GST_APP_SRC(m_appsrc), buffer); ... } 18.12.2017 17:06, Edward Hervey пишет: > 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 >> [hidden email] >> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel > _______________________________________________ > gstreamer-devel mailing list > [hidden email] > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |