AW: Video artifacts on a receiver side after re-creating of its pipeline

Denis Shienkov denis.shienkov at gmail.com
Wed Jan 10 14:26:54 UTC 2018


Hi,

 > Hi, the consumer needs an SPS and PPS. This could be transmitted by 
setting the config-interval parameter of rtph264pay

I already tried this:

constautopayloader=::gst_element_factory_make("rtph264pay",nullptr);

::g_object_set(G_OBJECT(payloader),

"config-interval",1,

nullptr);

with different values, as "-1", "1" and so on, but it does not help.



10.01.2018 17:14, Thornton, Keith пишет:
> Hi, the consumer needs an SPS and PPS. This could be transmitted by setting the config-interval parameter of rtph264pay.
>
> -----Ursprüngliche Nachricht-----
> Von: gstreamer-devel [mailto:gstreamer-devel-bounces at lists.freedesktop.org] Im Auftrag von Denis Shienkov
> Gesendet: Mittwoch, 10. Januar 2018 14:23
> An: Discussion of the development of and with GStreamer <gstreamer-devel at lists.freedesktop.org>
> Cc: Tim Müller <tim at centricular.com>
> Betreff: Video artifacts on a receiver side after re-creating of its pipeline
>
> Hi all.
>
> I use two own applications: producer & consumer.
>
> A producer generates the video stream and sends to the UDP sink.
> A consumer receives this stream and displays a video content.
>
> When the consumer started before the producer, then I did not get any video artifacts on an consumer.
>
> But, when I try to do stop/start the consumer (when the producer already running), then I see many video artifacts on the consumer.
>
> A possible workaround it is try to restart the producer (in this case the consumer receives good video content).
>
> How to solve this issue?
>
> UPD:
>
> A producer uses the following pipeline's equivalent:
>
> [code]
> void Producer::start()
> {
>       ...
>       ...
>
>       m_appsrc = ::gst_element_factory_make("appsrc", nullptr);
>
>       ::g_object_set(G_OBJECT(m_appsrc),
>                      "stream-type", GST_APP_STREAM_TYPE_STREAM,
>                      "is-live", true,
>                      "format", GST_FORMAT_TIME,
>                      nullptr);
>
>       const auto videoconvert =
> ::gst_element_factory_make("videoconvert", nullptr);
>
>       const auto videoenc = ::gst_element_factory_make("x264enc", nullptr);
>
>       ::gst_util_set_object_arg(G_OBJECT(videoenc), "tune", "zerolatency");
>
>       ::g_object_set(G_OBJECT(videoenc),
>                      "key-int-max", 10,
>                      nullptr);
>
>       const auto parse = ::gst_element_factory_make("h264parse", nullptr);
>
>       ::g_object_set(G_OBJECT(parse),
>                      "config-interval", -1,
>                      nullptr);
>
>       const auto payloader = ::gst_element_factory_make("rtph264pay",
> nullptr);
>
>       const auto udpsink = ::gst_element_factory_make("udpsink", nullptr);
>
>       const auto host = destination.host().toLocal8Bit();
>       const auto port = destination.port();
>
>       ::g_object_set(G_OBJECT(udpsink),
>                      "host", host.constData(),
>                      "port", port,
>                      nullptr);
>
>       m_pipeline = ::gst_pipeline_new("pipeline");
>
>       ...
>       ...
>
>       if (!m_appsrc || !videoconvert || !videoenc
>               || !payloader || !udpsink) {
>           qCCritical(gstProducerControl) << "Unable to create one of pipeline element";
>       }
>
>       ::gst_bin_add_many(GST_BIN(m_pipeline),
>                          m_appsrc,
>                          videoconvert,
>                          videoenc,
>                          parse,
>                          payloader,
>                          udpsink,
>                          nullptr);
>
>       const auto result = ::gst_element_link_many(m_appsrc,
>                                                   videoconvert,
>                                                   videoenc,
>                                                   parse,
>                                                   payloader,
>                                                   udpsink,
>                                                   nullptr);
>       ...
>       const auto status = ::gst_element_set_state(m_pipeline,
> GST_STATE_PLAYING);
>       ...
> }
>
> void Foo::stop()
> {
>       ...
>       ::gst_element_set_state(m_pipeline, GST_STATE_NULL);
>       ::gst_object_unref(m_pipeline);
>
>       m_appsrc = nullptr;
>       m_pipeline = nullptr;
>       ...
> }
> [/code]
>
> A consumer uses the following pipeline's equivalent:
>
> [code]
> void Consumer::start()
> {
>       ...
>       const auto udpsrc = ::gst_element_factory_make("udpsrc", nullptr);
>
>       ::g_object_set(G_OBJECT(udpsrc),
>                      "address", address.constData(),
>                      "port", port,
>                      nullptr);
>
>       const auto srccaps = ::gst_caps_new_simple(
>                   "application/x-rtp",
>                   "", G_TYPE_STRING, "",
>                   nullptr);
>
>       ::g_object_set(G_OBJECT(udpsrc),
>                      "caps", srccaps,
>                      nullptr);
>
>       const auto depay = ::gst_element_factory_make("rtph264depay", nullptr);
>       const auto decodebin = ::gst_element_factory_make("decodebin",
> nullptr);
>       const auto videoconvert =
> ::gst_element_factory_make("videoconvert", nullptr);
>
>       const auto videofilter = ::gst_element_factory_make("capsfilter",
> nullptr);
>
>       const auto videofiltercaps = ::gst_caps_new_simple(
>                   "video/x-raw",
>                   "format", G_TYPE_STRING, "BGRA",
>                   nullptr);
>
>       ::g_object_set(G_OBJECT(videofilter),
>                      "caps", videofiltercaps,
>                      nullptr);
>
>       m_videosink = m_renderer->videoSink();
>
>       ::g_object_set(G_OBJECT(m_videosink),
>                      "sync", false,
>                      nullptr);
>
>       m_pipeline = ::gst_pipeline_new("pipeline");
>
>       ...
>
>       ::gst_bin_add_many(GST_BIN(m_pipeline),
>                          udpsrc,
>                          depay,
>                          decodebin,
>                          videoconvert,
>                          videofilter,
>                          m_videosink,
>                          nullptr);
>
>       ::gst_element_link_many(udpsrc, depay, decodebin, nullptr);
>       ::gst_element_link_many(videoconvert, videofilter, m_videosink, nullptr);
>
>       ...
>
>       const auto status = ::gst_element_set_state(m_pipeline,
> GST_STATE_PLAYING);
>       ...
> }
>
> void Consumer::stop()
> {
>       ::gst_element_set_state(m_pipeline, GST_STATE_NULL);
>       ::gst_object_unref(m_pipeline);
>
>       m_videosink = nullptr;
>       m_pipeline = nullptr;
> }
> [/code]
>
> BR,
> Denis
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20180110/3ed3097a/attachment.html>


More information about the gstreamer-devel mailing list