mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 05:31:15 +00:00
rtpmpvpay: fix timestamping of rtp buffers
Incomming buffer is only pushed on the adapter at the end of the handle_buffer function. But duration/timestamp of this buffer is already taken into account for the current data in the adapter. This leads to wrong rtp timestamps and extra latency.
This commit is contained in:
parent
96fb89f86c
commit
bcde8c1b29
1 changed files with 18 additions and 8 deletions
|
@ -27,6 +27,9 @@
|
||||||
|
|
||||||
#include "gstrtpmpvpay.h"
|
#include "gstrtpmpvpay.h"
|
||||||
|
|
||||||
|
GST_DEBUG_CATEGORY_STATIC (rtpmpvpay_debug);
|
||||||
|
#define GST_CAT_DEFAULT (rtpmpvpay_debug)
|
||||||
|
|
||||||
static GstStaticPadTemplate gst_rtp_mpv_pay_sink_template =
|
static GstStaticPadTemplate gst_rtp_mpv_pay_sink_template =
|
||||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
|
@ -83,6 +86,9 @@ gst_rtp_mpv_pay_class_init (GstRTPMPVPayClass * klass)
|
||||||
|
|
||||||
gstbasertppayload_class->set_caps = gst_rtp_mpv_pay_setcaps;
|
gstbasertppayload_class->set_caps = gst_rtp_mpv_pay_setcaps;
|
||||||
gstbasertppayload_class->handle_buffer = gst_rtp_mpv_pay_handle_buffer;
|
gstbasertppayload_class->handle_buffer = gst_rtp_mpv_pay_handle_buffer;
|
||||||
|
|
||||||
|
GST_DEBUG_CATEGORY_INIT (rtpmpvpay_debug, "rtpmpvpay", 0,
|
||||||
|
"MPEG2 ES Video RTP Payloader");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -190,27 +196,31 @@ gst_rtp_mpv_pay_handle_buffer (GstBaseRTPPayload * basepayload,
|
||||||
if (duration == -1)
|
if (duration == -1)
|
||||||
duration = 0;
|
duration = 0;
|
||||||
|
|
||||||
/* Initialize new RTP payload */
|
if (rtpmpvpay->first_ts == GST_CLOCK_TIME_NONE || avail == 0)
|
||||||
if (avail == 0) {
|
|
||||||
rtpmpvpay->first_ts = timestamp;
|
rtpmpvpay->first_ts = timestamp;
|
||||||
|
|
||||||
|
if (avail == 0) {
|
||||||
rtpmpvpay->duration = duration;
|
rtpmpvpay->duration = duration;
|
||||||
|
} else {
|
||||||
|
rtpmpvpay->duration += duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gst_adapter_push (rtpmpvpay->adapter, buffer);
|
||||||
|
avail = gst_adapter_available (rtpmpvpay->adapter);
|
||||||
|
|
||||||
/* get packet length of previous data and this new data,
|
/* get packet length of previous data and this new data,
|
||||||
* payload length includes a 4 byte MPEG video-specific header */
|
* payload length includes a 4 byte MPEG video-specific header */
|
||||||
packet_len = gst_rtp_buffer_calc_packet_len (avail, 4, 0);
|
packet_len = gst_rtp_buffer_calc_packet_len (avail, 4, 0);
|
||||||
|
GST_LOG_OBJECT (rtpmpvpay, "available %d, rtp packet length %d", avail,
|
||||||
|
packet_len);
|
||||||
|
|
||||||
if (gst_basertppayload_is_filled (basepayload,
|
if (gst_basertppayload_is_filled (basepayload,
|
||||||
packet_len, rtpmpvpay->duration + duration)) {
|
packet_len, rtpmpvpay->duration)) {
|
||||||
ret = gst_rtp_mpv_pay_flush (rtpmpvpay);
|
ret = gst_rtp_mpv_pay_flush (rtpmpvpay);
|
||||||
|
} else {
|
||||||
rtpmpvpay->first_ts = timestamp;
|
rtpmpvpay->first_ts = timestamp;
|
||||||
rtpmpvpay->duration = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_adapter_push (rtpmpvpay->adapter, buffer);
|
|
||||||
|
|
||||||
rtpmpvpay->duration += duration;
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue