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