mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
gst/qtdemux/gstrtpxqtdepay.*: Try to recover from packet loss a little better.
Original commit message from CVS: * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_process), (gst_rtp_xqt_depay_change_state): * gst/qtdemux/gstrtpxqtdepay.h: Try to recover from packet loss a little better.
This commit is contained in:
parent
b1e2b08879
commit
32c1c29d68
3 changed files with 32 additions and 1 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-04-05 Wim Taymans <wim@fluendo.com>
|
||||
|
||||
* gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_process),
|
||||
(gst_rtp_xqt_depay_change_state):
|
||||
* gst/qtdemux/gstrtpxqtdepay.h:
|
||||
Try to recover from packet loss a little better.
|
||||
|
||||
2007-04-05 Wim Taymans <wim@fluendo.com>
|
||||
|
||||
* gst/rtpmanager/gstrtpbin.c: (find_session_by_id),
|
||||
|
|
|
@ -278,9 +278,10 @@ gst_rtp_xqt_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
|
|||
if (!gst_rtp_buffer_validate (buf))
|
||||
goto bad_packet;
|
||||
|
||||
/* discont, clear adapter */
|
||||
if (GST_BUFFER_IS_DISCONT (buf)) {
|
||||
/* discont, clear adapter and try to find a new packet start */
|
||||
gst_adapter_clear (rtpxqtdepay->adapter);
|
||||
rtpxqtdepay->need_resync = TRUE;
|
||||
}
|
||||
|
||||
m = gst_rtp_buffer_get_marker (buf);
|
||||
|
@ -325,6 +326,22 @@ gst_rtp_xqt_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
|
|||
"VER: %d, PCK: %d, S: %d, Q: %d, L: %d, D: %d, ID: %d", ver, pck, s, q,
|
||||
l, d, rtpxqtdepay->current_id);
|
||||
|
||||
if (rtpxqtdepay->need_resync) {
|
||||
/* we need to find the boundary of a new packet after a DISCONT */
|
||||
if (pck != 3 || q) {
|
||||
/* non-fragmented packet or payload description present, packet starts
|
||||
* here. */
|
||||
rtpxqtdepay->need_resync = FALSE;
|
||||
} else {
|
||||
/* fragmented packet without description */
|
||||
if (m) {
|
||||
/* marker bit set, next packet is start of new one */
|
||||
rtpxqtdepay->need_resync = FALSE;
|
||||
}
|
||||
goto need_resync;
|
||||
}
|
||||
}
|
||||
|
||||
payload += 4;
|
||||
payload_len -= 4;
|
||||
|
||||
|
@ -625,6 +642,11 @@ bad_packet:
|
|||
("Packet did not validate."), (NULL));
|
||||
return NULL;
|
||||
}
|
||||
need_resync:
|
||||
{
|
||||
GST_DEBUG_OBJECT (rtpxqtdepay, "waiting for marker");
|
||||
return NULL;
|
||||
}
|
||||
wrong_version:
|
||||
{
|
||||
GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE,
|
||||
|
@ -688,6 +710,7 @@ gst_rtp_xqt_depay_change_state (GstElement * element, GstStateChange transition)
|
|||
gst_adapter_clear (rtpxqtdepay->adapter);
|
||||
rtpxqtdepay->previous_id = -1;
|
||||
rtpxqtdepay->current_id = -1;
|
||||
rtpxqtdepay->need_resync = FALSE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -46,6 +46,7 @@ struct _GstRtpXQTDepay
|
|||
|
||||
GstAdapter *adapter;
|
||||
|
||||
gboolean need_resync;
|
||||
guint16 previous_id;
|
||||
guint16 current_id;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue