Mercurial > libavformat.hg
diff rdt.c @ 3962:72efef66f566 libavformat
This patch refactors RDT packet header parsing so that it can be used in
rtsp.c to detect the ID of the packet source also in case of TCP streams.
This allows proper playback of RDT streams with multiple stream types, e.g.
audio + video. Accepted by LucaB in "RDT/Realmedia patches #2" thread on ML.
author | rbultje |
---|---|
date | Wed, 01 Oct 2008 12:37:07 +0000 |
parents | ed6f6aa977ec |
children | dbe779f54647 |
line wrap: on
line diff
--- a/rdt.c Tue Sep 30 13:27:19 2008 +0000 +++ b/rdt.c Wed Oct 01 12:37:07 2008 +0000 @@ -140,27 +140,25 @@ * Actual data handling. */ -static int rdt_parse_header(struct RTPDemuxContext *s, const uint8_t *buf, - int len, int *seq, uint32_t *timestamp, int *flags) +int +ff_rdt_parse_header(const uint8_t *buf, int len, + int *sn, int *seq, int *rn, uint32_t *ts) { - rdt_data *rdt = s->dynamic_protocol_context; - int consumed = 0, sn; + int consumed = 10; - if (buf[0] < 0x40 || buf[0] > 0x42) { + if (len > 0 && (buf[0] < 0x40 || buf[0] > 0x42)) { buf += 9; len -= 9; consumed += 9; } - sn = (buf[0]>>1) & 0x1f; - *seq = AV_RB16(buf+1); - *timestamp = AV_RB32(buf+4); - if (!(buf[3] & 1) && (sn != rdt->prev_sn || *timestamp != rdt->prev_ts)) { - *flags |= PKT_FLAG_KEY; - rdt->prev_sn = sn; - rdt->prev_ts = *timestamp; - } + if (len < 10) + return -1; + if (sn) *sn = (buf[0]>>1) & 0x1f; + if (seq) *seq = AV_RB16(buf+1); + if (ts) *ts = AV_RB32(buf+4); + if (rn) *rn = buf[3] & 0x3f; - return consumed + 10; + return consumed; } /**< return 0 on packet, no more left, 1 on packet, 1 on partial packet... */ @@ -208,7 +206,8 @@ ff_rdt_parse_packet(RTPDemuxContext *s, AVPacket *pkt, const uint8_t *buf, int len) { - int seq, flags = 0; + rdt_data *rdt = s->dynamic_protocol_context; + int seq, flags = 0, rule, sn; uint32_t timestamp; int rv= 0; @@ -221,9 +220,14 @@ if (len < 12) return -1; - rv = rdt_parse_header(s, buf, len, &seq, ×tamp, &flags); + rv = ff_rdt_parse_header(buf, len, &sn, &seq, &rule, ×tamp); if (rv < 0) return rv; + if (!(rule & 1) && (sn != rdt->prev_sn || timestamp != rdt->prev_ts)) { + flags |= PKT_FLAG_KEY; + rdt->prev_sn = sn; + rdt->prev_ts = timestamp; + } buf += rv; len -= rv; s->seq = seq;