How to synchronize buffer timestamp across two gstreamer pipeline(appsink,appsrc, rtspserver)

Nicolas Dufresne nicolas at ndufresne.ca
Fri Jun 17 01:27:43 UTC 2016


So,

Assuming you didn't do any mistake, what you have now is buffer in pipeline
2 that are really late. To be able to play those the way you do you'll have
to set pipeline 1 latency on your pipeline 2 appsrc. As you have multiple
branches in pipeline 1, you'll be to implement do-latency signal, so you
submit on appsink early, and render late enough to be on sync whit pipeline
2 sink. Make sure appsrc is set to live mode.
Le 16 juin 2016 5:21 PM, "Jake Zhang" <zjpseudo at gmail.com> a écrit :

Greetings,

I have been working on this for a while but still have no luck to get this
working. My pipeline can be simplified as below:

pipeline1:
v4l2src -> tee -> x264enc -> appsink1
             ->  appsink2

RTSP server pipeline2:
appsrc -> omxh264enc -> rtph264pay

Pipeline 1 have other processing unit and I will need pull buffers from
appsink2 and push those buffers into appsrc of RTSP server.
My RTSP server part of implementation is very similar to test-appsrc.c of
gst-rtsp-server 1.6.4.

The buffer I got from appsink already has their own PTS and to get RTSP
pipeline2 running, I have to re-stamp the buffer PTS the exactly same way
as test-appsrc.c (set ctx->timestamp=0 and increment based of buffer
duration) otherwise, the RTSP server will not get running.

I have went through the gstreamer manual and I have some basic
understanding about running time/ base time and stream time
I have tried below things:
1. set the basetime of pipeline2 to be the same as pipeline1
2. set the start time of pipeline2 to be GST_CLOCK_TIME_NONE
3. make sure the two pipeline is using the same clock.
4. I have checked the segment event on the appsrc of pipeline2 and the
value is as below, and I have tried generate a new segment to appsrc sink
pad but I have a hard time know how to set the right base and start value.
//appsrc0:src segment: rate 1 format 3, start: 0:00:00.000000000, stop:
99:99:99.999999999, time: 0:00:00.000000000 base: 0:00:00.000000000

Why I have to re-stamp the PTS of the buffer?
pipeline2 running time = clocktime - basetime of pipeline1, so pipeline2
should be able to process buffers with original PTS, right?

How I can  retain the original buffer PTS in pipeline2? I guess segment
event is the right direction to go, but like I said I have not figure out
how to play with segment to let pipeline2 happy with original PTS.

Thanks in advance for any comments here.

_______________________________________________
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/20160616/0d441671/attachment.html>


More information about the gstreamer-devel mailing list