static int rtpp_stream_check_latch_override(struct rtpp_stream *self, struct rtp_packet *packet) { const char *actor; struct rtpp_stream_priv *pvt; char saddr[MAX_AP_STRBUF]; pvt = PUB2PVT(self); if (self->session_type == SESS_RTCP || self->latch_info.ssrc == 0) return (0); if (rtp_packet_parse(packet) != RTP_PARSER_OK) return (0); if (packet->parsed->ssrc != self->latch_info.ssrc) return (0); if (packet->parsed->seq < self->latch_info.seq && self->latch_info.seq - packet->parsed->seq < 536) return (0); actor = rtpp_stream_get_actor(self); addrport2char_r(sstosa(&packet->raddr), saddr, sizeof(saddr)); RTPP_LOG(pvt->pub.log, RTPP_LOG_INFO, "%s's address re-latched: %s (%s), SSRC=" SSRC_FMT ", Seq=%u->%u", actor, saddr, "RTP", self->latch_info.ssrc, self->latch_info.seq, packet->parsed->seq); self->latch_info.seq = packet->parsed->seq; return (1); }
int rtpp_analyzer_update(struct rtpp_session *sp, struct rtpp_analyzer *rap, struct rtp_packet *pkt) { if (rtp_packet_parse(pkt) != RTP_PARSER_OK) { rap->pecount++; return (-1); } if (update_rtpp_stats(sp->log, &(rap->rstat), &(pkt->data.header), pkt->parsed, pkt->rtime) != 0) { rap->aecount++; return (-1); } return (0); }
static int rtpp_stream_latch(struct rtpp_stream *self, double dtime, struct rtp_packet *packet) { const char *actor, *ptype, *ssrc, *seq, *relatch; char ssrc_buf[11], seq_buf[6]; struct rtpp_stream_priv *pvt; char saddr[MAX_AP_STRBUF]; pvt = PUB2PVT(self); if (pvt->last_update != 0 && \ dtime - pvt->last_update < UPDATE_WINDOW) { return (0); } actor = rtpp_stream_get_actor(self); ptype = rtpp_stream_get_proto(self); if (self->session_type == SESS_RTP) { if (rtp_packet_parse(packet) == RTP_PARSER_OK) { self->latch_info.ssrc = packet->parsed->ssrc; self->latch_info.seq = packet->parsed->seq; snprintf(ssrc_buf, sizeof(ssrc_buf), SSRC_FMT, packet->parsed->ssrc); snprintf(seq_buf, sizeof(seq_buf), "%u", packet->parsed->seq); ssrc = ssrc_buf; seq = seq_buf; } else { self->latch_info.ssrc = 0; ssrc = seq = "INVALID"; } } else { self->latch_info.ssrc = 0; ssrc = seq = "UNKNOWN"; } addrport2char_r(sstosa(&packet->raddr), saddr, sizeof(saddr)); if (self->latch_info.latched == 0) { relatch = ""; } else { relatch = "re-"; } RTPP_LOG(pvt->pub.log, RTPP_LOG_INFO, "%s's address %slatched in: %s (%s), SSRC=%s, Seq=%s", actor, relatch, saddr, ptype, ssrc, seq); self->latch_info.latched = 1; return (1); }