mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-27 10:40:34 +00:00
rtptwcc: complete bufferlist fix
When dealing with bufferlists, we need to store one "SentPacket" structure per buffer, not one per buffer list! Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1278>
This commit is contained in:
parent
efb2b6d478
commit
72118b9db4
1 changed files with 44 additions and 33 deletions
|
@ -253,27 +253,63 @@ _get_twcc_seqnum_data (RTPPacketInfo * pinfo, guint8 ext_id, gpointer * data)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_twcc_seqnum_data (GstBuffer * buf, guint8 ext_id, guint16 seqnum)
|
||||
static gboolean
|
||||
sent_packet_init (SentPacket * packet, guint16 seqnum, RTPPacketInfo * pinfo,
|
||||
GstBuffer * buffer)
|
||||
{
|
||||
GstRTPBuffer rtp = { NULL };
|
||||
|
||||
if (!gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtp))
|
||||
goto invalid_packet;
|
||||
|
||||
packet->seqnum = seqnum;
|
||||
packet->ts = pinfo->current_time;
|
||||
packet->size = gst_rtp_buffer_get_payload_len (&rtp);
|
||||
packet->pt = gst_rtp_buffer_get_payload_type (&rtp);
|
||||
packet->remote_ts = GST_CLOCK_TIME_NONE;
|
||||
packet->socket_ts = GST_CLOCK_TIME_NONE;
|
||||
packet->lost = FALSE;
|
||||
|
||||
gst_rtp_buffer_unmap (&rtp);
|
||||
|
||||
return TRUE;
|
||||
|
||||
invalid_packet:
|
||||
{
|
||||
GST_DEBUG ("invalid RTP packet received");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_set_twcc_seqnum_data (RTPTWCCManager * twcc, RTPPacketInfo * pinfo,
|
||||
GstBuffer * buf, guint8 ext_id)
|
||||
{
|
||||
SentPacket packet;
|
||||
GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
|
||||
gpointer data;
|
||||
|
||||
if (gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp)) {
|
||||
if (gst_rtp_buffer_get_extension_onebyte_header (&rtp,
|
||||
ext_id, 0, &data, NULL)) {
|
||||
guint16 seqnum = twcc->send_seqnum++;
|
||||
|
||||
GST_WRITE_UINT16_BE (data, seqnum);
|
||||
sent_packet_init (&packet, seqnum, pinfo, buf);
|
||||
g_array_append_val (twcc->sent_packets, packet);
|
||||
|
||||
GST_LOG ("Send: twcc-seqnum: %u, pt: %u, marker: %d, len: %u, ts: %"
|
||||
GST_TIME_FORMAT, seqnum, pinfo->pt, pinfo->marker, packet.size,
|
||||
GST_TIME_ARGS (pinfo->current_time));
|
||||
}
|
||||
gst_rtp_buffer_unmap (&rtp);
|
||||
}
|
||||
}
|
||||
|
||||
static guint16
|
||||
static void
|
||||
rtp_twcc_manager_set_send_twcc_seqnum (RTPTWCCManager * twcc,
|
||||
RTPPacketInfo * pinfo)
|
||||
{
|
||||
guint16 first_seqnum = twcc->send_seqnum;
|
||||
|
||||
if (GST_IS_BUFFER_LIST (pinfo->data)) {
|
||||
GstBufferList *list;
|
||||
guint i = 0;
|
||||
|
@ -285,14 +321,12 @@ rtp_twcc_manager_set_send_twcc_seqnum (RTPTWCCManager * twcc,
|
|||
for (i = 0; i < gst_buffer_list_length (list); i++) {
|
||||
GstBuffer *buffer = gst_buffer_list_get_writable (list, i);
|
||||
|
||||
_set_twcc_seqnum_data (buffer, twcc->send_ext_id, twcc->send_seqnum++);
|
||||
_set_twcc_seqnum_data (twcc, pinfo, buffer, twcc->send_ext_id);
|
||||
}
|
||||
} else {
|
||||
pinfo->data = gst_buffer_make_writable (pinfo->data);
|
||||
_set_twcc_seqnum_data (pinfo->data, twcc->send_ext_id, twcc->send_seqnum++);
|
||||
_set_twcc_seqnum_data (twcc, pinfo, pinfo->data, twcc->send_ext_id);
|
||||
}
|
||||
|
||||
return first_seqnum;
|
||||
}
|
||||
|
||||
static gint32
|
||||
|
@ -858,36 +892,13 @@ rtp_twcc_manager_get_feedback (RTPTWCCManager * twcc, guint sender_ssrc)
|
|||
return buf;
|
||||
}
|
||||
|
||||
static void
|
||||
sent_packet_init (SentPacket * packet, guint16 seqnum, RTPPacketInfo * pinfo)
|
||||
{
|
||||
packet->seqnum = seqnum;
|
||||
packet->ts = pinfo->current_time;
|
||||
packet->size = pinfo->payload_len;
|
||||
packet->pt = pinfo->pt;
|
||||
packet->remote_ts = GST_CLOCK_TIME_NONE;
|
||||
packet->socket_ts = GST_CLOCK_TIME_NONE;
|
||||
packet->lost = FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
rtp_twcc_manager_send_packet (RTPTWCCManager * twcc, RTPPacketInfo * pinfo)
|
||||
{
|
||||
SentPacket packet;
|
||||
guint16 seqnum;
|
||||
|
||||
if (twcc->send_ext_id == 0)
|
||||
return;
|
||||
|
||||
seqnum = rtp_twcc_manager_set_send_twcc_seqnum (twcc, pinfo);
|
||||
|
||||
sent_packet_init (&packet, seqnum, pinfo);
|
||||
g_array_append_val (twcc->sent_packets, packet);
|
||||
|
||||
|
||||
GST_LOG ("Send: twcc-seqnum: %u, pt: %u, marker: %d, ts: %"
|
||||
GST_TIME_FORMAT, seqnum, pinfo->pt, pinfo->marker,
|
||||
GST_TIME_ARGS (pinfo->current_time));
|
||||
rtp_twcc_manager_set_send_twcc_seqnum (twcc, pinfo);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in a new issue