mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
rtpjitterbuffer: move send_lost_event function
Move the send_lost_event function to the do_lost_event handling, there is no need to have a separate function.
This commit is contained in:
parent
dc02d91c14
commit
b1d29483bb
1 changed files with 37 additions and 49 deletions
|
@ -1678,7 +1678,7 @@ remove_all_timers (GstRtpJitterBuffer * jitterbuffer)
|
||||||
/* we just received a packet with seqnum and dts.
|
/* we just received a packet with seqnum and dts.
|
||||||
*
|
*
|
||||||
* First check for old seqnum that we are still expecting. If the gap with the
|
* First check for old seqnum that we are still expecting. If the gap with the
|
||||||
* current timestamp is too big, unschedule the timeouts.
|
* current seqnum is too big, unschedule the timeouts.
|
||||||
*
|
*
|
||||||
* If we have a valid packet spacing estimate we can set a timer for when we
|
* If we have a valid packet spacing estimate we can set a timer for when we
|
||||||
* should receive the next packet.
|
* should receive the next packet.
|
||||||
|
@ -1735,6 +1735,8 @@ update_timers (GstRtpJitterBuffer * jitterbuffer, guint16 seqnum,
|
||||||
/* if we had a timer, remove it, we don't know when to expect the next
|
/* if we had a timer, remove it, we don't know when to expect the next
|
||||||
* packet. */
|
* packet. */
|
||||||
remove_timer (jitterbuffer, timer);
|
remove_timer (jitterbuffer, timer);
|
||||||
|
/* we signal the _loop function because this new packet could be the one
|
||||||
|
* it was waiting for */
|
||||||
JBUF_SIGNAL_EVENT (priv);
|
JBUF_SIGNAL_EVENT (priv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1760,47 +1762,6 @@ calculate_packet_spacing (GstRtpJitterBuffer * jitterbuffer, guint32 rtptime,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
send_lost_event (GstRtpJitterBuffer * jitterbuffer, guint seqnum,
|
|
||||||
guint lost_packets, GstClockTime timestamp, GstClockTime duration,
|
|
||||||
gboolean late)
|
|
||||||
{
|
|
||||||
GstRtpJitterBufferPrivate *priv = jitterbuffer->priv;
|
|
||||||
guint next_seqnum;
|
|
||||||
GstEvent *event;
|
|
||||||
RTPJitterBufferItem *item;
|
|
||||||
|
|
||||||
/* we had a gap and thus we lost some packets. Create an event for this. */
|
|
||||||
if (lost_packets > 1)
|
|
||||||
GST_DEBUG_OBJECT (jitterbuffer, "Packets #%d -> #%d lost", seqnum,
|
|
||||||
seqnum + lost_packets - 1);
|
|
||||||
else
|
|
||||||
GST_DEBUG_OBJECT (jitterbuffer, "Packet #%d lost", seqnum);
|
|
||||||
|
|
||||||
priv->num_late += lost_packets;
|
|
||||||
|
|
||||||
next_seqnum = seqnum + lost_packets - 1;
|
|
||||||
|
|
||||||
/* create paket lost event */
|
|
||||||
event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
|
|
||||||
gst_structure_new ("GstRTPPacketLost",
|
|
||||||
"seqnum", G_TYPE_UINT, (guint) seqnum,
|
|
||||||
"timestamp", G_TYPE_UINT64, timestamp,
|
|
||||||
"duration", G_TYPE_UINT64, duration,
|
|
||||||
"late", G_TYPE_BOOLEAN, late, NULL));
|
|
||||||
|
|
||||||
item = alloc_item (event, ITEM_TYPE_LOST, -1, -1, next_seqnum, -1);
|
|
||||||
rtp_jitter_buffer_insert (priv->jbuf, item, NULL, NULL);
|
|
||||||
|
|
||||||
if (seqnum == priv->next_seqnum) {
|
|
||||||
GST_DEBUG_OBJECT (jitterbuffer, "lost seqnum %d == %d next_seqnum -> %d",
|
|
||||||
seqnum, priv->next_seqnum, next_seqnum);
|
|
||||||
priv->next_seqnum = next_seqnum & 0xffff;
|
|
||||||
priv->last_popped_seqnum = next_seqnum;
|
|
||||||
priv->last_out_time = timestamp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
calculate_expected (GstRtpJitterBuffer * jitterbuffer, guint32 expected,
|
calculate_expected (GstRtpJitterBuffer * jitterbuffer, guint32 expected,
|
||||||
guint16 seqnum, GstClockTime dts, gint gap)
|
guint16 seqnum, GstClockTime dts, gint gap)
|
||||||
|
@ -2461,24 +2422,51 @@ do_lost_timeout (GstRtpJitterBuffer * jitterbuffer, TimerData * timer,
|
||||||
{
|
{
|
||||||
GstRtpJitterBufferPrivate *priv = jitterbuffer->priv;
|
GstRtpJitterBufferPrivate *priv = jitterbuffer->priv;
|
||||||
GstClockTime duration, timestamp;
|
GstClockTime duration, timestamp;
|
||||||
guint seqnum, num;
|
guint seqnum, next_seqnum, lost_packets;
|
||||||
gboolean late;
|
gboolean late;
|
||||||
|
GstEvent *event;
|
||||||
|
RTPJitterBufferItem *item;
|
||||||
|
|
||||||
seqnum = timer->seqnum;
|
seqnum = timer->seqnum;
|
||||||
timestamp = apply_offset (jitterbuffer, timer->timeout);
|
timestamp = apply_offset (jitterbuffer, timer->timeout);
|
||||||
duration = timer->duration;
|
duration = timer->duration;
|
||||||
if (duration == GST_CLOCK_TIME_NONE && priv->packet_spacing > 0)
|
if (duration == GST_CLOCK_TIME_NONE && priv->packet_spacing > 0)
|
||||||
duration = priv->packet_spacing;
|
duration = priv->packet_spacing;
|
||||||
num = MAX (timer->num, 1);
|
lost_packets = MAX (timer->num, 1);
|
||||||
late = timer->num > 0;
|
late = timer->num > 0;
|
||||||
|
|
||||||
|
/* we had a gap and thus we lost some packets. Create an event for this. */
|
||||||
|
if (lost_packets > 1)
|
||||||
|
GST_DEBUG_OBJECT (jitterbuffer, "Packets #%d -> #%d lost", seqnum,
|
||||||
|
seqnum + lost_packets - 1);
|
||||||
|
else
|
||||||
|
GST_DEBUG_OBJECT (jitterbuffer, "Packet #%d lost", seqnum);
|
||||||
|
|
||||||
|
priv->num_late += lost_packets;
|
||||||
|
|
||||||
|
next_seqnum = seqnum + lost_packets - 1;
|
||||||
|
|
||||||
|
/* create paket lost event */
|
||||||
|
event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
|
||||||
|
gst_structure_new ("GstRTPPacketLost",
|
||||||
|
"seqnum", G_TYPE_UINT, (guint) seqnum,
|
||||||
|
"timestamp", G_TYPE_UINT64, timestamp,
|
||||||
|
"duration", G_TYPE_UINT64, duration,
|
||||||
|
"late", G_TYPE_BOOLEAN, late, NULL));
|
||||||
|
|
||||||
|
item = alloc_item (event, ITEM_TYPE_LOST, -1, -1, next_seqnum, -1);
|
||||||
|
rtp_jitter_buffer_insert (priv->jbuf, item, NULL, NULL);
|
||||||
|
|
||||||
|
if (seqnum == priv->next_seqnum) {
|
||||||
|
GST_DEBUG_OBJECT (jitterbuffer, "lost seqnum %d == %d next_seqnum -> %d",
|
||||||
|
seqnum, priv->next_seqnum, next_seqnum);
|
||||||
|
priv->next_seqnum = next_seqnum & 0xffff;
|
||||||
|
priv->last_popped_seqnum = next_seqnum;
|
||||||
|
priv->last_out_time = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
/* remove timer now */
|
/* remove timer now */
|
||||||
remove_timer (jitterbuffer, timer);
|
remove_timer (jitterbuffer, timer);
|
||||||
|
|
||||||
/* this releases the lock */
|
|
||||||
send_lost_event (jitterbuffer, seqnum, num, timestamp, duration, late);
|
|
||||||
|
|
||||||
/* now we can let the pushing thread try again */
|
|
||||||
JBUF_SIGNAL_EVENT (priv);
|
JBUF_SIGNAL_EVENT (priv);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
Loading…
Reference in a new issue