diff --git a/src/gst/gstfdpay.c b/src/gst/gstfdpay.c index 56b23769f..14fd3b1d9 100644 --- a/src/gst/gstfdpay.c +++ b/src/gst/gstfdpay.c @@ -250,7 +250,7 @@ gst_fdpay_transform (GstBaseTransform * trans, GstBuffer * inbuf, msg.flags = 0; msg.seq = GST_BUFFER_OFFSET (inbuf); - msg.pts = GST_BUFFER_TIMESTAMP (inbuf); + msg.pts = GST_BUFFER_TIMESTAMP (inbuf) + GST_ELEMENT_CAST (trans)->base_time; msg.dts_offset = 0; msg.size = fdmem->size; msg.offset = fdmem->offset; diff --git a/src/gst/gstpinossink.c b/src/gst/gstpinossink.c index c76b88256..715d30a43 100644 --- a/src/gst/gstpinossink.c +++ b/src/gst/gstpinossink.c @@ -297,16 +297,26 @@ gst_pinos_sink_render (GstBaseSink * bsink, GstBuffer * buffer) PinosBufferInfo info; GSocketControlMessage *mesg; GstMemory *mem = NULL; + GstClockTime pts, dts, base; pinossink = GST_PINOS_SINK (bsink); if (!pinossink->negotiated) goto not_negotiated; + base = GST_ELEMENT_CAST (bsink)->base_time; + + pts = GST_BUFFER_PTS (buffer); + dts = GST_BUFFER_DTS (buffer); + if (!GST_CLOCK_TIME_IS_VALID (pts)) + pts = dts; + else if (!GST_CLOCK_TIME_IS_VALID (dts)) + dts = pts; + info.flags = 0; - info.seq = 0; - info.pts = GST_BUFFER_TIMESTAMP (buffer); - info.dts_offset = 0; + info.seq = GST_BUFFER_OFFSET (buffer); + info.pts = GST_CLOCK_TIME_IS_VALID (pts) ? pts + base : base; + info.dts_offset = GST_CLOCK_TIME_IS_VALID (dts) && GST_CLOCK_TIME_IS_VALID (pts) ? pts - dts : 0; info.offset = 0; info.size = gst_buffer_get_size (buffer); diff --git a/src/gst/gstpinossrc.c b/src/gst/gstpinossrc.c index 9fcfcc677..7a7d79151 100644 --- a/src/gst/gstpinossrc.c +++ b/src/gst/gstpinossrc.c @@ -179,7 +179,6 @@ gst_pinos_src_init (GstPinosSrc * src) /* we operate in time */ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME); gst_base_src_set_live (GST_BASE_SRC (src), TRUE); - gst_base_src_set_do_timestamp (GST_BASE_SRC (src), TRUE); src->fd_allocator = gst_fd_allocator_new (); } @@ -233,6 +232,7 @@ on_new_buffer (GObject *gobject, { GstPinosSrc *pinossrc = user_data; + GST_LOG_OBJECT (pinossrc, "got new buffer"); pinos_main_loop_signal (pinossrc->loop, FALSE); } @@ -407,6 +407,7 @@ gst_pinos_src_create (GstPushSrc * psrc, GstBuffer ** buffer) PinosBufferInfo info; gint *fds, n_fds; GstMemory *fdmem = NULL; + GstBuffer *buf; pinossrc = GST_PINOS_SRC (psrc); @@ -427,9 +428,12 @@ again: if (state != PINOS_STREAM_STATE_STREAMING) goto streaming_stopped; + GST_LOG_OBJECT (pinossrc, "start capture buffer"); pinos_stream_capture_buffer (pinossrc->stream, &info); - if (info.message != NULL) + if (info.message != NULL) { + GST_LOG_OBJECT (pinossrc, "no message, retry"); break; + } } pinos_main_loop_unlock (pinossrc->loop); @@ -444,8 +448,19 @@ again: info.offset + info.size, GST_FD_MEMORY_FLAG_NONE); gst_memory_resize (fdmem, info.offset, info.size); - *buffer = gst_buffer_new (); - gst_buffer_append_memory (*buffer, fdmem); + buf = gst_buffer_new (); + gst_buffer_append_memory (buf, fdmem); + + if (GST_CLOCK_TIME_IS_VALID (info.pts)) { + if (info.pts > GST_ELEMENT_CAST (pinossrc)->base_time) + GST_BUFFER_PTS (buf) = info.pts - GST_ELEMENT_CAST (pinossrc)->base_time; + + if (GST_BUFFER_PTS (buf) + info.dts_offset > 0) + GST_BUFFER_DTS (buf) = GST_BUFFER_PTS (buf) + info.dts_offset; + } + GST_BUFFER_OFFSET (buf) = info.seq; + + *buffer = buf; return GST_FLOW_OK;