summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorJohn Brooks <john.brooks@bluecherry.net>2011-10-12 00:53:12 -0600
committerMartin Storsjö <martin@martin.st>2011-10-12 14:37:42 +0300
commit07b77fe3871f86b87e35876d38f1969da5ece4b2 (patch)
tree245e7591e0fbf1e829b083cc1e4b58d8da8edac7 /libavformat
parent5d6ecf5345c0913e2b66427ea062e7989201a139 (diff)
rtpdec: Read the packet length for all RTCP packet types
This allows skipping past unsupported RTCP packet types, as RFC 3550 section 6.1 mandates. Currently this only has any practical effect if a sender puts an unrecognized type before RTCP_BYE in a compounded packet, or (incorrectly) does not put RTCP_SR first. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/rtpdec.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index 07f4cc35c5..0f6ed27ff6 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -112,14 +112,15 @@ RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id,
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
{
int payload_len;
- while (len >= 2) {
+ while (len >= 4) {
+ payload_len = FFMIN(len, (AV_RB16(buf + 2) + 1) * 4);
+
switch (buf[1]) {
case RTCP_SR:
- if (len < 20) {
+ if (payload_len < 20) {
av_log(NULL, AV_LOG_ERROR, "Invalid length for RTCP SR packet\n");
return AVERROR_INVALIDDATA;
}
- payload_len = (AV_RB16(buf + 2) + 1) * 4;
s->last_rtcp_ntp_time = AV_RB64(buf + 8);
s->last_rtcp_timestamp = AV_RB32(buf + 16);
@@ -130,14 +131,13 @@ static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int l
s->rtcp_ts_offset = s->last_rtcp_timestamp - s->base_timestamp;
}
- buf += payload_len;
- len -= payload_len;
break;
case RTCP_BYE:
return -RTCP_BYE;
- default:
- return -1;
}
+
+ buf += payload_len;
+ len -= payload_len;
}
return -1;
}