<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 31, 2021 at 8:49 AM 이병헌 <<a href="mailto:byunghun.lee@fainders.ai" target="_blank">byunghun.lee@fainders.ai</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">Awesome, thanks!!!<div dir="auto">You saved me</div><div dir="auto"><br></div><div dir="auto">And.. If you okay, and if you have, can you recommand me some papers or document to understand more deep about gstreamer?</div><div dir="auto">I tried myself with gstreamer official document in website, but in some cases, I got a feeling that stucked at a wall of knowledge...</div></div></blockquote><div><br></div><div>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. </div><div><br></div><div>As an example, take the information I just gave you. How does one go about figuring this out? </div><div><br></div><div>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. </div><div><br></div><div>Then understand the basics of how pipelines are constructed. Some good documentation: <a href="https://gstreamer.freedesktop.org/documentation/tutorials/basic/dynamic-pipelines.html?gi-language=c">https://gstreamer.freedesktop.org/documentation/tutorials/basic/dynamic-pipelines.html?gi-language=c</a>. 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: <a href="https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html?gi-language=c#getting-pipeline-graphs">https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html?gi-language=c#getting-pipeline-graphs</a>. <br><br>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: <a href="https://gstreamer.freedesktop.org/documentation/additional/rtp.html?gi-language=c">https://gstreamer.freedesktop.org/documentation/additional/rtp.html?gi-language=c</a>. 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. </div><div><br></div><div>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. <br><br>...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. </div><div><br></div><div>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. <br><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div dir="auto"><br></div><div dir="auto">Anyway whether you recommand it to me or not, </div><div dir="auto">Thank you.</div><div dir="auto"><div dir="auto"><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">2021년 8월 31일 (화) 오후 10:19, Ben Rush <<a href="mailto:ben@ben-rush.net" target="_blank">ben@ben-rush.net</a>>님이 작성:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hello</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 31, 2021 at 1:30 AM 이병헌 via gstreamer-devel <<a href="mailto:gstreamer-devel@lists.freedesktop.org" rel="noreferrer" target="_blank">gstreamer-devel@lists.freedesktop.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi.<br>
I’m new on gstreamer, and I have some problem with this issue for many days.. <br>
<br>
I need to get absolute timestamp from multiple rtsp camera.<br>
And with some effort, I got to know that I can get absolute timestamp from "RTCP SR(sender report)” in RTSP packets<br>
But I can not find the proper way to get RTCP SR from rtspsrc element or rtpbin in gstreamer document..<br>
And actually I can not understand well about rtpbin’s role<br>
So my questions are<br>
<br>
1. How to get RTCP SR with rtspsrc element or rtpbin element<br></blockquote><div><br></div><div>With your pipeline, get the GstRTPSession: <br><br>rtpSession = gst_bin_get_by_name(GST_BIN(_pipeline->pipeline), "rtpsession0");<br><br>Get the internal RTPSession from it: <br><br><div>GstElement* internalRtpSession; </div><div>g_object_get(rtpSession, "internal-session", &internalRtpSession, NULL);<br><br>Connect to on-receiving-rtcp: <br><br>g_signal_connect(internalRtpSession, "on-receiving-rtcp", G_CALLBACK(on_rtcp_callback), NULL);<br><br>Iterate over the RTCP packets in the buffer: <br><br><div><span style="white-space:pre-wrap">      </span>GstRTCPBuffer rtcpBuffer = GST_RTCP_BUFFER_INIT;</div><div><span style="white-space:pre-wrap"> </span>gst_rtcp_buffer_map(buffer, GST_MAP_READ, &rtcpBuffer);</div><div><span style="white-space:pre-wrap">      </span>GstRTCPPacket rtcpPacket; </div><div><span style="white-space:pre-wrap">      </span>if (gst_rtcp_buffer_get_first_packet(&rtcpBuffer, &rtcpPacket))</div><div><span style="white-space:pre-wrap">  </span>{</div><div><span style="white-space:pre-wrap">                </span>while (gst_rtcp_packet_move_to_next(&rtcpPacket))</div><div><span style="white-space:pre-wrap">            </span>{</div><div><span style="white-space:pre-wrap">                        </span>GstRTCPType type = gst_rtcp_packet_get_type(&rtcpPacket);</div></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
2. If I connect devices into rtpbin element, then does rtpbin sync sources from multiple device automatically?<br>
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<br>
And if there have network delay, so client get packets of PLAY request of CAM_1 10 seconds more later than CAM_2<br>
Then does rtpbin element sync that 10 seconds automatically?<br></blockquote><div><br></div><div>I'm not sure. </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Thanks for reading.</blockquote></div></div></div></div></div></div>
</blockquote></div>
</blockquote></div>
</div></div></div></div></div></div>