How to get RTCP sender report from rtspsrc element?

Ben Rush ben at ben-rush.net
Tue Aug 31 15:33:26 UTC 2021


On Tue, Aug 31, 2021 at 8:49 AM 이병헌 <byunghun.lee at fainders.ai> wrote:

> Awesome, thanks!!!
> You saved me
>
> And.. If you okay, and if you have, can you recommand me some papers or
> document to understand more deep about gstreamer?
> I tried myself with gstreamer official document in website, but in some
> cases, I got a feeling that stucked at a wall of knowledge...
>

Yeah. I wouldn't say much of what I've encountered in using GStreamer is
complicated; I would say it's overwhelming in the sense that there's so
much to piece together in order to get done what you want to get done. I
often find myself having to dive into the source code to understand what
you want to do: most of the "documentation" I find are actually examples or
code snippets on GitHub.

As an example, take the information I just gave you. How does one go about
figuring this out?

I started with understanding the GObject system when I started learning
GStreamer. It's the paradigm upon which GStreamer's codebase is built. It
can, itself, be confusing at times to look at if you come from the
C++/C#/etc world. If you don't understand how to query properties, set
properties, register for events, clean up resources, etc. with the GObject
type system, you're going to be constantly confused when looking at
GStreamer code. So, start there. Google for the GObject type system and
follow the examples and walk through it. It's not hard, it's just different
to look at.

Then understand the basics of how pipelines are constructed. Some good
documentation:
https://gstreamer.freedesktop.org/documentation/tutorials/basic/dynamic-pipelines.html?gi-language=c.
Now that you understand the GObject type system, you can understand the
nature of this code a bit better. Understand concepts about bins and pads
and elements and how they tie together and are constructed. One way that's
really good to understand this is to understand how to generate pipeline
graphs:
https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html?gi-language=c#getting-pipeline-graphs
.

Next it's about understanding the "objects" that relate to your problem.
You're dealing with RTP. So, Google "RTP GStreamer". The first link that
popped up is:
https://gstreamer.freedesktop.org/documentation/additional/rtp.html?gi-language=c.
Now, focus on the objects / components involved. Some examples include:
rtpbin, rtpmanager, rtpsession, etc. These objects are going to relate to
elements in the pipeline that gets built. Using the GObject system, you can
query these elements, get their properties, set their properties, etc.

That's how I discovered "internal-session" on the GstRTPSession object: it
got the RTPSession object, which has a signal ("event") for getting the
RTCP packets. All of this was the result of crawling the documentation,
looking at sample code on github by finding a couple of snippets here and
there until I pull together a more complete picture.

...and there may be a better way to do it too. That's the other thing.
There's often several ways to get to the end goal.

One final word: if you're on Windows, be forewarned. At times things don't
work as expected there. A lot of (very good) work has been done by some
smart people to get it there, but the focus is still very clearly on Linux
by many.


> Anyway whether you recommand it to me or not,
> Thank you.
>
>
> 2021년 8월 31일 (화) 오후 10:19, Ben Rush <ben at ben-rush.net>님이 작성:
>
>> Hello
>>
>> On Tue, Aug 31, 2021 at 1:30 AM 이병헌 via gstreamer-devel <
>> gstreamer-devel at lists.freedesktop.org> wrote:
>>
>>> Hi.
>>> I’m new on gstreamer, and I have some problem with this issue for many
>>> days..
>>>
>>> I need to get absolute timestamp from multiple rtsp camera.
>>> And with some effort, I got to know that I can get absolute timestamp
>>> from "RTCP SR(sender report)” in RTSP packets
>>> But I can not find the proper way to get RTCP SR from rtspsrc element or
>>> rtpbin in gstreamer document..
>>> And actually I can not understand well about rtpbin’s role
>>> So my questions are
>>>
>>> 1. How to get RTCP SR with rtspsrc element or rtpbin element
>>>
>>
>> With your pipeline, get the GstRTPSession:
>>
>> rtpSession = gst_bin_get_by_name(GST_BIN(_pipeline->pipeline),
>> "rtpsession0");
>>
>> Get the internal RTPSession from it:
>>
>> GstElement* internalRtpSession;
>> g_object_get(rtpSession, "internal-session", &internalRtpSession, NULL);
>>
>> Connect to on-receiving-rtcp:
>>
>> g_signal_connect(internalRtpSession, "on-receiving-rtcp",
>> G_CALLBACK(on_rtcp_callback), NULL);
>>
>> Iterate over the RTCP packets in the buffer:
>>
>> GstRTCPBuffer rtcpBuffer = GST_RTCP_BUFFER_INIT;
>> gst_rtcp_buffer_map(buffer, GST_MAP_READ, &rtcpBuffer);
>> GstRTCPPacket rtcpPacket;
>> if (gst_rtcp_buffer_get_first_packet(&rtcpBuffer, &rtcpPacket))
>> {
>> while (gst_rtcp_packet_move_to_next(&rtcpPacket))
>> {
>> GstRTCPType type = gst_rtcp_packet_get_type(&rtcpPacket);
>>
>>>
>>> 2. If I connect devices into rtpbin element, then does rtpbin sync
>>> sources from multiple device automatically?
>>> I mean, suppose If there are two rtsp camera CAM_1 CAM_2, and if I send
>>> PLAY request in same time on my client
>>> And if there have network delay, so client get packets of PLAY request
>>> of CAM_1 10 seconds more later than CAM_2
>>> Then does rtpbin element sync that 10 seconds automatically?
>>>
>>
>> I'm not sure.
>>
>>
>>>
>>> Thanks for reading.
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210831/c3bdb835/attachment.htm>


More information about the gstreamer-devel mailing list