Mercurial > libavformat.hg
comparison rtpdec.c @ 6421:6bb1bf74f9ce libavformat
rtpdec: Read RTCP compound packets
Patch by Josh Allmann, joshua dot allmann at gmail
author | mstorsjo |
---|---|
date | Sun, 29 Aug 2010 10:19:44 +0000 |
parents | 37944ce385a0 |
children | cb5f5fc848b0 |
comparison
equal
deleted
inserted
replaced
6420:e3eb93b5a119 | 6421:6bb1bf74f9ce |
---|---|
72 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); | 72 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); |
73 } | 73 } |
74 | 74 |
75 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len) | 75 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len) |
76 { | 76 { |
77 if (buf[1] != RTCP_SR) | 77 int payload_len; |
78 return -1; | 78 while (len >= 2) { |
79 switch (buf[1]) { | |
80 case RTCP_SR: | |
81 if (len < 16) { | |
82 av_log(NULL, AV_LOG_ERROR, "Invalid length for RTCP SR packet\n"); | |
83 return AVERROR_INVALIDDATA; | |
84 } | |
85 payload_len = (AV_RB16(buf + 2) + 1) * 4; | |
86 | |
79 s->last_rtcp_ntp_time = AV_RB64(buf + 8); | 87 s->last_rtcp_ntp_time = AV_RB64(buf + 8); |
80 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) | 88 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) |
81 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; | 89 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; |
82 s->last_rtcp_timestamp = AV_RB32(buf + 16); | 90 s->last_rtcp_timestamp = AV_RB32(buf + 16); |
91 | |
92 buf += payload_len; | |
93 len -= payload_len; | |
94 break; | |
95 default: | |
96 return -1; | |
97 } | |
98 } | |
83 return 0; | 99 return 0; |
84 } | 100 } |
85 | 101 |
86 #define RTP_SEQ_MOD (1<<16) | 102 #define RTP_SEQ_MOD (1<<16) |
87 | 103 |